Docker部署Mysq集群

2021年7月15日 6点热度 0条评论

 

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

1.2创建网段 docker network create --subnet=172.188.0.0/24 hxjf-docker (如果有重复可以删除 docker network rm 名称)

查看当前宿主机上的网络配置 docker network ls

查看 docker network inspect hxjf-docker

1.3创建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

1.4创建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第一种方案

2.1.1查看日志

查看日期发现其它pxcnode02 pxcnode03 pxcnode04 pxcnode05没有起来

docker ps -a

docker logs -f pxcnode03

2.1.2重新配置pxcnode01

(1)删掉第一个pxcnode01

docker stop pxcnode01

docker rm pxcnode01

docker ps -a

(2)重新配置pxcnode1 vim /var/lib/docker/volumes/conf01/_data/node.cnf 这里增加了一个新的数据卷映射 -v conf01:/etc/mysql ,方便在宿主机修改配置。默认情况下映射到底宿主机目录在 /var/lib/docker/volumes/ 目录下 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 修改配置文件 vim /var/lib/docker/volumes/conf01/_data/node.cnf  加上一句 pxc-encrypt-cluster-traffic=OFF
(3)重启pxcnode01

docker restart pxcnode01

(4)重启剩余节点

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 还是失败

(5)配置从节点

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

(6)重启从节点

docker start pxcnode02
docker start pxcnode03
docker start pxcnode04
docker start pxcnode05

 

(7)查看节点

启动正常 docker ps -aq

 

3.数据库的负载均衡

将所有请求发送给单一节点 其负载过高 性能很低 其他节点却很空闲

使用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