docker pxc mysql集群

Database / 2020-10-07

docker 下载pxc

拉取:

docker pull percona/percona-xtradb-cluster

重命名:

docker tag percona/percona-xtradb-cluster:latest pxc

删除原来的镜像:

docker rmi docker.io/percona/percona-xtradb-cluster

创建docker子网

创建子网:

docker network create --subnet=192.168.0.0/16 net1

查看网段:

docker network inspect net1

删除子网:

docker network rm net1

创建数据卷

docker只跑程序,数据存在容器外

pxc不支持直接映射外部文件,所以使用数据卷

创建数据卷:

docker volume create --name v1

查看数据卷:

docker inspect v1

删除数据卷:

docker volume rm v1

需要创建五个数据卷:

创建容器

创建第一个容器:

docker run -d -p 3316:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -v v1:/var/lib/mysql -v backup:/data -v conf01:/etc/mysql --privileged=true --name=node1 --net=net1 --ip 192.168.0.2 pxc

修改/var/lib/docker/volumes/conf01/_data/node.cnf
关闭SSL通信:加一行配置

pxc-encrypt-cluster-traffic=OFF

iShot2020-10-07 09.28.29

重启node1:

docker restart node1

第一个容器跑起来之后
创建第二个容器:

docker run -d -p 3317:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node1 -v v2:/var/lib/mysql -v backup:/data -v conf02:/etc/mysql --privileged --name=node2 --net=net1 --ip 192.168.0.3 pxc

第三个:

docker run -d -p 3318:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node1 -v v3:/var/lib/mysql -v backup:/data -v conf03:/etc/mysql --privileged --name=node3 --net=net1 --ip 192.168.0.4 pxc

第四个:

docker run -d -p 3319:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node1 -v v4:/var/lib/mysql -v backup:/data -v conf04:/etc/mysql --privileged --name=node4 --net=net1 --ip 192.168.0.5 pxc

第五个:

docker run -d -p 3320:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node1 -v v5:/var/lib/mysql -v backup:/data -v conf05:/etc/mysql --privileged --name=node5 --net=net1 --ip 192.168.0.6 pxc

然后每个容器会自动停止

到每个配置文件中关闭SSL

然后重启每个容器

测试集群

如果出现错误:ERROR 1047 (08S01): WSREP has not yet prepared node for application use

登录数据库执行:

SET GLOBAL wsrep_provider_options='pc.bootstrap=YES';

选一个新的主节点

安装haproxy 实现高可用

拉取镜像:

sudo docker pull haproxy

创建文件夹:

mkdir ~/docker/haproxy

编辑配置文件:

vim ~/docker/haproxy/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:admin
#数据库负载均衡
listen  proxy-mysql
    #访问的IP和端口
    bind  0.0.0.0:3306
    #网络协议
    mode  tcp
    #负载均衡算法(轮询算法)
    #轮询算法:roundrobin
    #权重算法:static-rr
    #最少连接算法:leastconn
    #请求源IP算法:source 
    balance  roundrobin
    #日志格式
    option  tcplog
   
    option  mysql-check user haproxy
    server  MySQL_1 192.168.0.2:3306 check weight 1 maxconn 2000  
    server  MySQL_2 192.168.0.3:3306 check weight 1 maxconn 2000  
    server  MySQL_3 192.168.0.4:3306 check weight 1 maxconn 2000 
    server  MySQL_4 192.168.0.5:3306 check weight 1 maxconn 2000
    server  MySQL_5 192.168.0.6:3306 check weight 1 maxconn 2000
    #使用keepalive检测死链
    option  tcpka

mysql中创建用户:

create user 'haproxy'@'%' identified by '';

启动:

docker run -it -d -p 8888:8888 -p 8889:3306 -v /root/docker/haproxy:/usr/local/etc/haproxy --name h1 --net=net1 --ip 192.168.0.10 --privileged haproxy

进入容器:

docker exec -it h1 bash

配置:

haproxy -f /usr/local/etc/haproxy/haproxy.cfg

访问8888端口的dbs
用户名admin,密码admin

iShot2020-10-07 14.12.51-c648d01b72bf4e188b73fdf0fa344f91

可以看到五个数据库全部为up状态

haproxy做集群的负载,

使用集群就通过 haproxy的 8889端口连接使用,账号密码为数据库集群的密码。

重启集群

如果一半或者以上的节点掉了,集群就无法工作了。

无法重启集群解决办法:

重启一个节点你会发现它又掉了,通过docker logs 查看日志:

image-587139892f5d40769ee2c3c1277affdf

  • 日志说这个节点不是最后一个关闭的节点,所以这个节点的数据可能不是集群最后的数据状态,也就是说他的数据可能不是最新的。

办法

查看数据卷地址:

docker volume inspect v1

到数据卷目录下:

cd /var/lib/docker/volumes/v1/_data/

编辑grastate.dat文件:

vim grastate.dat

image-fc517706fd774ca396a63bae0ea6c1dc

修改safe_to_bootstrap 为1

保存,启动节点就行了。