[TOC] **MySQL数据库集群** 01 拉取pxc镜像 `docker pull percona/percona-xtradb-cluster:5.7.21 ` 02 pxc镜像重命名 `docker tag percona/percona-xtradb-cluster:5.7.21 pxc ` 03 删除pxc原来的镜像 `docker rmi percona/percona-xtradb-cluster:5.7.21 ` 04 创建一个单独的网段,给mysql数据库集群使用 `docker network create --subnet=172.16.0.0/24 pxc-net` `docket network inspect pxc-net ` [查看详情] 05 创建和删除volume 创建:`docker volume create --name v1 ` 查看详情:`docker volume inspect v1` 06 创建单个PXC容器demo `docker run -d -p 3301:3306 -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 --privileged --name=node1 --net=pxc-net --ip 172.16.0.2 pxc` `CLUSTER_NAME PXC`集群名字] `XTRABACKUP_PASSWORD`数据库同步需要用到的密码 # 搭建PXC[MySQL]集群 ## 准备3个数据卷 ``` docker volume create --name v1 docker volume create --name v2 docker volume create --name v3 ``` ## 运行三个PXC容器 > 在创建完第一个node1,需要等待一段时间,大概1分钟左右,等node1启动初始化完成,才能创建node2和node3】 `docker run -d -p 3301:3306 -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 --privileged --name=node1 --net=pxc-net --ip 172.18.0.2 pxc` > `CLUSTER_JOIN`将该数据库加入到某个节点上组成集群] `docker run -d -p 3302:3306 -v v2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 --privileged --name=node2 --net=pxc-net --ip 172.18.0.3 pxc ` `docker run -d -p 3303:3306 -v v3:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 --privileged --name=node3 --net=pxc-net --ip 172.18.0.4 pxc ` ## MySQL工具连接测试 ![](https://github.com/taot168/pmdoc/blob/master/doc/image/mysql-container.png?raw=true) # 增加负载均衡 ## 拉取haproxy镜像 ``` docker pull haproxy ``` ## 创建haproxy配置文件,这里使用bind mounting的方式 > haproxy文档 https://cbonte.github.io/haproxy-dconv/ > https://hub.docker.com/_/haproxy ``` touch /tmp/haproxy/haproxy.cfg ``` `haproxy.cfg` ``` 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 #监控界面的访问的IP和端口 bind 0.0.0.0:8888 #访问协议 mode http #URI相对地址 stats uri /dbs_monitor #统计报告格式 stats realm Global\ statistics #登陆帐户信息 stats auth admin:admin #数据库负载均衡 listen proxy-mysql #访问的IP和端口,haproxy开发的端口为3306 #假如有人访问haproxy的3306端口,则将请求转发给下面的数据库实例 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.16.0.2:3306 check weight 1 maxconn 2000 server MySQL_2 172.16.0.3:3306 check weight 1 maxconn 2000 server MySQL_3 172.16.0.4:3306 check weight 1 maxconn 2000 #使用keepalive检测死链 option tcpka ``` ## 创建haproxy容器 > 因为当前centos的网络和win使用的是桥接,所以直接端口映射到centos上即可 ``` 这样可以直接访问centos的IP:8888和3306 docker run -it -d -p 8888:8888 -p 3306:3306 -v /tmp/haproxy:/usr/local/etc/haproxy --name haproxy01 --privileged --net=pxc-net haproxy ``` ## 根据haproxy.cfg文件启动haproxy ``` docker exec -it haproxy01 bash haproxy -f /usr/local/etc/haproxy/haproxy.cfg ``` ## 在MySQL数据库上创建用户,用于心跳检测 ``` CREATE USER 'haproxy'@'%' IDENTIFIED BY ''; 如果创建失败,可以先输入一下命令 drop user 'haproxy'@'%'; flush privileges; CREATE USER 'haproxy'@'%' IDENTIFIED BY ''; ``` ## win浏览器访问 ``` http://centos_ip:8888/dbs_monitor 用户名密码都是:admin ``` ## win上的db工具连接haproxy01 ``` ip:centos_ip port:3306 user:root password:123456 ``` ## 在haproxy连接上进行数据操作,然后查看数据库集群各个节点 ![](https://github.com/taot168/pmdoc/blob/master/doc/image/docker/mysql-haproxy.png?raw=true)