pxc8集群最麻烦的一步就是创建证书,根据官方创建证书的方式一步一步的,稍有不小心,就会因为证书问题集群内节点互相认证失败,而无法创建pxc集群。不过,有一个简单的方法,就是先启动的节点,会自动创建证书(*.pem),然后将这些证书,共享给其他需要加入集群的节点就可以了,快速方便。 关闭防火墙 关闭selinux linux需要关闭防火墙,或者开启某些需要的端口; pxc会自带mysql,版本是对应一致的,所以机子上不需要mysql; 最好关闭SELINUX,linux自带的安全增强。 注意这些配置,三台机子上都要操作。 端口 功能 3306 mysql数据库 4567 pxc cluster 相互通讯端口 4444 sst全量传输 4568 ist增量传输 这里给出一些linux下防火墙的命令相关 # 查询防火墙状态 # 查询防火墙状态 # 查询8080端口是否开放 # 开放80端口 # 移除端口 清理防火墙 swarm也需要一些端口的开放, 端口 功能 2377 用于集群通信 4789 容器覆盖网络 7946 容器网络发现 CentOS(8)-Anolis(8)=>192.168.56.101,192.168.56.102,192.168.56.103 三台主机。 主机ip 部署 swarm 192.168.56.101 pxc1 manager 192.168.56.102 pxc2 worker 192.168.56.103 pxc3 worker 192.168.56.101 nginx 做负载 在101节点执行: 在其他所两个节点执行: 查看swarm集群: 其他相关命令: docker node rm -f xxx 强制删除节点 docker swarm leave -f 主节点强制离开swarm集群 docker swarm leave 从节点离开swarm集群 创建虚拟网络,后续在每一台主机的创建的docker pxc节点,都指定使用这个overlay网络。 # docker network create -d overlay --attachable swarm_mysql 其他相关命令 docker network inspect xxxx 查看改网络信息 docker network ls 查看所有网络信息 docker network rm xxxx 删除网络 这里网络名就叫,swarm_mysql,创建好了网络之后, docker network inspect swarm_mysql 查看 如果你是8.0+且没有使用相同的证书,那么你肯定会遇到一个ssl相关的错误 “error:0407008A:rsa routines:RSA_padding_check_PKCS1_type_1:invalid padding” 这是因为8.0后,是ssl来连接,三台机子,就必须保持证书密钥的一致性才可以通信。一般情况下我们最好看一下系统磁盘的分区情况,然后把mysql的数据要放到大的磁盘上 注意:这里需要给予权限,不然很多地方会报错 我这里是101节点做为引导集群创建的节点,其他是节点加入这个集群,所以101先开始创建 命令解读: docker run -d -p 3306:3306 3306端口映射 --net=swarm_mysql 虚拟网络名字 -e MYSQL_ROOT_PASSWORD=123456 数据库初始密码 -e CLUSTER_NAME=pxc_cluster 集群名字 -e XTRABACKUP_PASSWORD=123456 备份密码 -v /data/pxc:/var/lib/mysql pxc路径映射 --privileged 给予root权限,可选 --name=pxc1 容器的名称 --max_connections=512最大连接数量,可根据要求在此后追加再多参数,以--(双线)开始 可以docker logs pxc1看看日志是否报错等 如果成功,你可以用Navicat连接看看是否成功启动了mysql,启动了之后再安装从节点。 在101节点的数据卷下,发现以下证书,将它们copy到其他主机上去: Copy证书文件 并在102,103节点上,设置这些权限文件的权限 为:777 102# chmod 777 /data/pxc_data/* -R 103# chmod 777 /data/pxc_data/* -R 这里跟上面比起来,多了一句 -e CLUSTER_JOIN=pxc1 ,表示加入pxc1。 为第2台机子可以知道pxc1呢?就是因为swarm集群的建立,让彼此可以相互通信。 docker logs -f pxc2 查看日志: 如果三台都成功了,再确认一下。 登录mysql # mysql -uroot -p 查看集群状态: show status like 'wsrep%'; 不出意外,这里cluster size就是3台 查看网络信息: 网络也是3个 在任意一台主机上创建数据库,创建数据表,查看其他主机的数据即可: create database one character set utf8mb4; use one; create table stud (id int primary key,name varchar(30)); INSERT into stud values(1,'Jack张'); 101主机: 102主机: 103主机: 到此mysql集群已经完毕。 此处,我将nginx启动在101主机上。 在http同目录最后一行,配置以下内容,注意,这儿使用了上述pxc的容器名称即pxc1,pxc2和pxc3,因为我们创建的nginx也使用相同的网络,所以可以实现通讯: 同样使用docker启动nginx 然后就可以测试查询了。 建议使用haproxy管理mysql集群,haproxy有一个监控界面,便于查看mysql节点状态。 haproxy.cfg 放到/data/ha目录下: 在mysql数据库上,创建haproxy用户如下: create user 'haproxy'@'%' identified by ''; 注意使用同一个swarm_mysql网络: 由于前面配置端口为3301所以这儿输入3301: 到此,一个ha的mysql集群就算是全部的创建完成了。前提条件:
systemctl stop firewalld
systemctl diable firewalld
vim /etc/selinux/config
selinux=disabled
开放pxc所需端口
systemctl status firewalld
firewall-cmd --state
firewall-cmd --query-port=8080/tcp
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --remove-port=8080/tcp
iptables -F
1、规划
2、创建swarm集群
# docker swarm init --advertise-addr 192.168.56.101
Swarm initialized: current node (4z44c51o1756sacxf6l67uy6y) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join
--token SWMTKN-1-0zlzv4fh30bvg5tlysrcn4yznziwjbyaoxe444np4bss8f1dhw-2gii03vuk93f5x4uwsx00mkr4 192.168.56.101:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
docker swarm join \
--token SWMTKN-1-0zlzv4fh30bvg5tlysrcn4yznziwjbyaoxe444np4bss8f1dhw-2gii03vuk93f5x4uwsx00mkr4 192.168.56.101:2377
创建虚拟网络
4、创建目录
注意这里的目录在三台机子上都要做相同的操作创建
# mkdir /data
# cd /data
# mkdir -m 777 pxc_data
5、搭建集群
1、下载镜像
# docker pull percona/percona-xtradb-cluster:8.0
2、多台机器创建容器
101节点
#!/bin/bash
docker run -d -p 3306:3306 --network swarm_mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-e CLUSTER_NAME=pxc_cluster \
-e XTRABACKUP_PASSWORD=123456 \
-v /data/pxc_data:/var/lib/mysql \
--privileged --name pxc1 \
percona/percona-xtradb-cluster:8.0 \
--max_connections=512 \
--allow_max_packet=128m
证书copy
# scp *.pem server102:/data/pxc_data/
# scp *.pem server103:/data/pxc_data/
102节点
#!/bin/bash
docker run -d -p 3306:3306 --network swarm_mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-e CLUSTER_NAME=pxc_cluster \
-e XTRABACKUP_PASSWORD=123456 \
-v /data/pxc_data:/var/lib/mysql \
-e CLUSTER_JOIN=pxc1 \
--privileged --name pxc2 \
percona/percona-xtradb-cluster:8.0
103节点
#!/bin/bash
docker run -d -p 3306:3306 --network swarm_mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-e CLUSTER_NAME=pxc_cluster \
-e XTRABACKUP_PASSWORD=123456 \
-v /data/pxc_data:/var/lib/mysql \
-e CLUSTER_JOIN=pxc1 \
--privileged --name pxc3 \
percona/percona-xtradb-cluster:8.0
查看集群状态
# docker network inspect swarm_mysql
测试
6、负载均衡
1、使用nginx
1、添加配置文件
# config mysql nginx
stream{
upstream pxc{
server pxc1:3306;
server pxc2:3306;
server pxc3:3306;
}
server{
listen 3302;
proxy_pass pxc;
}
}
启动
docker run --name ngx -d \
-p 8800:80 -p 3302:3302 \
-v /data/nginx/nginx.conf:/etc/nginx/nginx.conf \
-d nginx
3、连接
使用haproxy
创建配置文件
global
#工作目录,需要与创建容器指定的目录相同
# chroot /usr/local/etc/haproxy
#日志文件
log 127.0.0.1 local5 info
#守护进程
daemon
defaults
log global
mode http
#日志格式
option httplog
#日志中不记录负载均衡的心跳检测记录
option dontlognull
#连接超时时间毫秒
timeout connect 5000
#客户端超时
timeout client 50000
#服务器超时
timeout server 50000
#監控界面
listen admin_stats
bind 0.0.0.0:8888
mode http
stats uri /dbs_monitor
#统计报告
stats realm global\statistics
#登录账户
stats auth admin:admin
#数据负载均衡
listen proxy-mysql
#访问的ip:port
bind 0.0.0.0:3301
mode tcp
#负载均衡算法
balance roundrobin
#日志格式
option tcplog
#在mysql中创建一个没有权限的haproxy用户密码为空
#haproxy使用这个账户对mysql进行监控
option mysql-check user haproxy
server MySQL_1 192.168.56.101:3306 check weight 1 maxconn 2000
server MySQL_2 192.168.56.102:3306 check weight 1 maxconn 2000
server MySQL_3 192.168.56.103:3306 check weight 2 maxconn 2000
#使用keepalive检测死链
option tcpka
2、创建haproxy用户
3、启动haproxy#!/bin/bash
docker run --name haproxy -d \
-p 8888:8888 -p 3301:3301 \
-v /data/ha:/usr/local/etc/haproxy \
--privileged \
--network swarm_mysql \
haproxy
4、打开8888端口
连接测试