1.PXC(Percona XtraDB Cluster)
速度慢 但能保证强一致性 适用于保存价值较高的数据
数据同步是双向的 在任一节点写入数据 都会同步到其他所有节点 在任何节点上都能同时读写
采用同步复制 向任一节点写入数据 只有所有节点都同步成功后 才会向客户端返回成功。事务在所有节点要么同时提交,要么不提交
1.1 PXC集群安装
(1)安装 docker pull percona/percona-xtradb-cluster
(2)重命名 docker tag percona/percona-xtradb-cluster:latest pxc
(3)删除源镜像标签 docker rmi percona/percona-xtradb-cluster
docker images
(3)创建网段 docker network create --subnet=172.188.0.0/24 hxjf-docker (如果有重复可以删除 docker network rm 名称)
查看当前宿主机上的网络配置 docker network ls查看 docker network inspect hxjf-docker
(4)创建5个数据卷
docker volume create --name pxc-vm01
docker volume create --name pxc-vm02
docker volume create --name pxc-vm03
docker volume create --name pxc-vm04
docker volume create --name pxc-vm05
查看 docker inspect pxc-vm01
(5)创建5个PXC容器
# 第一个节点
(1)创建容器
docker run -d -p 3301:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -v pxc-vm01:/var/lib/mysql -v backup:/data --privileged --name=pxcnode01 --net=hxjf-docker --ip 172.188.0.81 pxc
(2)验证
docker ps -a
docker exec -it pxcnode01 bash
mysql -u root -proot (这里我后来重新docker run MYSQL_ROOT_PASSWORD参数修改123456登录也不行 只能用root登录)
#以下二三四五节点 多了个 -e CLUSTER_JOIN=pxcnode01
# 第二个节点
docker run -d -p 3302:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxcnode01 -v pxc-vm02:/var/lib/mysql -v backup:/data --privileged --name=pxcnode02 --net=hxjf-docker --ip 172.188.0.82 pxc
# 第三个节点
docker run -d -p 3303:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxcnode01 -v pxc-vm03:/var/lib/mysql -v backup:/data --privileged --name=pxcnode03 --net=hxjf-docker --ip 172.188.0.83 pxc
# 第四个节点
docker run -d -p 3304:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxcnode01 -v pxc-vm04:/var/lib/mysql -v backup:/data --privileged --name=pxcnode04 --net=hxjf-docker --ip 172.188.0.84 pxc
# 第五个节点
docker run -d -p 3305:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxcnode01 -v pxc-vm05:/var/lib/mysql -v backup:/data --privileged --name=pxcnode05 --net=hxjf-docker --ip 172.188.0.85 pxc
# 查看 docker ps -a
2.解决SSL通信问题
2.1第一种方案
(1)重新配置pxcnode01
查看日期发现其它pxcnode02 pxcnode03 pxcnode04 pxcnode05没有起来
docker ps -a
docker logs -f pxcnode03
删掉第一个pxcnode01 重新配置
docker stop pxcnode01
docker rm pxcnode01
docker ps -a
(2) 配置
这里增加了一个新的数据卷映射 -v conf01:/etc/mysql ,方便在宿主机修改配置。默认情况下映射到底宿主机目录在 /var/lib/docker/volumes/ 目录下(3)docker run -d -p 3301:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -v pxc-vm01:/var/lib/mysql -v backup:/data -v conf01:/etc/mysql --privileged=true --name=pxcnode01 --net=hxjf-docker --ip 172.188.0.81 pxc
(4)修改配置文件 vim /var/lib/docker/volumes/conf01/_data/node.cnf[mysqld] default_authentication_plugin=mysql_native_password datadir=/var/lib/mysql socket=/tmp/mysql.sock skip-host-cache core-file # 关闭ssl通信 pxc-encrypt-cluster-traffic=OFF #server_id=0
(5)重启pxcnode01
(6)重启剩余节点
docker rm pxcnode02
docker rm pxcnode03
docker rm pxcnode04
docker rm pxcnode05
docker ps -a
#pxcnode02
docker run -d -p 3302:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxcnode01 -v pxc-vm02:/var/lib/mysql -v backup:/data -v conf02:/etc/mysql --privileged --name=pxcnode02 --net=hxjf-docker --ip 172.188.0.82 pxc
#pxcnode03
docker run -d -p 3303:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxcnode01 -v pxc-vm03:/var/lib/mysql -v backup:/data -v conf03:/etc/mysql --privileged --name=pxcnode03 --net=hxjf-docker --ip 172.188.0.83 pxc
#pxcnode04
docker run -d -p 3304:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxcnode01 -v pxc-vm04:/var/lib/mysql -v backup:/data -v conf04:/etc/mysql --privileged --name=pxcnode04 --net=hxjf-docker --ip 172.188.0.84 pxc
#pxcnode05
docker run -d -p 3305:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxcnode01 -v pxc-vm05:/var/lib/mysql -v backup:/data -v conf05:/etc/mysql --privileged --name=pxcnode05 --net=hxjf-docker --ip 172.188.0.85 pxc
#查看容器 docker ps -a 还是失败
(7)配置从节点
vim /var/lib/docker/volumes/conf02/_data/node.cnf vim /var/lib/docker/volumes/conf03/_data/node.cnf vim /var/lib/docker/volumes/conf04/_data/node.cnf vim /var/lib/docker/volumes/conf05/_data/node.cnf
如下图所示 每个节点都加一句 pxc-encrypt-cluster-traffic=OFF
(8)重启节点
docker start pxcnode02
docker start pxcnode03
docker start pxcnode04
docker start pxcnode05
(9)查看节点
启动正常 docker ps -aq
2.数据库的负载均衡
将所有请求发送给单一节点 其负载过高 性能很低 其他节点却很空闲
使用Haproxy做负载均衡 可以将请求均匀地发送给每个节点 单节点负载低 性能好
2.1安装Haproxy
(1)docker pull haproxy
(2)创建配置文件
mkdir -p /home/soft/haproxy/
touch /home/soft/haproxy/haproxy.cfg
vim /home/soft/haproxy/haproxy.cfg
# haproxy.cfg global #工作目录 chroot /usr/local/etc/haproxy #日志文件,使用rsyslog服务中local5日志设备(/var/log/local5),等级info 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 #监控界面的访问的IP和端口 bind 0.0.0.0:8888 #访问协议 mode http #URI相对地址 stats uri /dbs #统计报告格式 stats realm Global\ statistics #登陆帐户信息 stats auth admin:123456 #数据库负载均衡 listen proxy-mysql #访问的IP和端口 bind 0.0.0.0:3306 #网络协议 mode tcp #负载均衡算法(轮询算法) #轮询算法:roundrobin #权重算法:static-rr #最少连接算法:leastconn #请求源IP算法:source balance roundrobin #日志格式 option tcplog #在MySQL中创建一个没有权限的haproxy用户,密码为空。Haproxy使用这个账户对MySQL数据库心跳检测 option mysql-check user haproxy server MySQL_1 172.188.0.2:3306 check weight 1 maxconn 2000 server MySQL_2 172.188.0.3:3306 check weight 1 maxconn 2000 server MySQL_3 172.188.0.4:3306 check weight 1 maxconn 2000 server MySQL_4 172.188.0.5:3306 check weight 1 maxconn 2000 server MySQL_5 172.188.0.6:3306 check weight 1 maxconn 2000 #使用keepalive检测死链 option tcpka
(3)