Docker 搭建mysql pxc集群 + haproxy + keepalived 高可用
什么是PXC
Percona XtraDB Cluster是MySQL的数据库集群解决方案。它确保高可用性,防止停机和数据丢失,并为不断增长的环境提供线性可伸缩性。
同步复制
数据同时写入所有节点,或者即使在单个节点上失败也不会写入。
多原版复制
任何节点都可以触发数据更新。
真正的并行复制
从属服务器上的多个线程在行级别执行复制。
自动节点配置
您只需添加一个节点,它就会自动同步。
资料一致性
不再有未同步的节点。
对比mysql的主从复制
1.安装
docker pull percona/percona-xtradb-cluster:5.7
2.命名太长,重新命名容器名
docker tag percona/percona-xtradb-cluster:5.7 pxc:5.7
3.删除容器
docker rmi percona/percona-xtradb-cluster:5.7
4.创建
Docker
网络,用于PXC
集群独立使用docker network create —subnet=172.18.0.0/24 pxc-network
—subnet属性用来指定这个pxc-network的网断,不然后面不能指定固定的ip ,在MySQL中查看集群的变量,是看不到具体的ip地址,而为容器的id(查看容器的ip信息 docker inspect 容器名,会输出这个容器的信息,包括ip等等信息)
查看(docker network inspect pxc-network)
删除(docker network rm pxc-network)
5.创建数据卷用于mysql挂载
创建三个用于集群
docker volume create v1
docker volume create v2
docker volume create v36.创建第一个节点
docker run -di —name=pn1 —net=pxc-network —ip 172.18.0.2 -p 9000:3306 -v v1:/var/lib/mysql —privileged -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=cluster1 -e XTRABACKUP_PASSWORD=123456 pxc:5.7
—name容器名称
--net容器网络
--ip容器ip
-p 外部端口:内部端口
-v 数据卷:容器里面的数据位置(就是容器在往容器这个路径存的时候,放入到外部 宿主机的位置,当我们对容器删除的时候数据不会丢失)
因为后续节点的添加需要关联到第一个节点,所以需要等待数据库启动完成。通过 docker logs pn1
查看日志,如果出现下面的输出,证明启动成功:
2019-09-04T06:27:30.085880Z 0 [Note] InnoDB: Buffer pool(s) load completed at 190904 6:27:30
7.加入第二个节点
docker run -di —name=pn2 —net=pxc-network —ip 172.18.0.3 -p 9001:3306 -v v2:/var/lib/mysql —privileged -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=cluster1 -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pn1 pxc:5.7
需要注意是第二个节点开始需要增加 e CLUSTER_JOIN=pn1
参数,表示与 pn1
节点同步,否则 pn1
容器会自动关闭。
当 PXC
集群中存在两个节点以上之后就没有主节点的概念了。集群中最后一个退出的节点就会变为主节点,在 /var/lib/mysql/grastate.dat
文件中属性 safe_to_bootstrap
的值 会从 0
被设置为 1
表示该节点是主节点。
8.加入第三个节点
docker run -di —name=pn3 —net=pxc-network —ip 172.18.0.4 -p 9002:3306 -v v3:/var/lib/mysql —privileged -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=cluster1 -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pn2 pxc:5.7
如果主节点的服务宕机后,那么他就启动不起来,因为他不是最后一个的退出的,主节点已经不是他,如果硬要启动,修改
/var/lib/mysql/grastate.dat
文件中属性safe_to_bootstrap修改为1 ,在进行启动。
不过有个问题,强制启动这个节点,其他节点未同步的数据将不会进行同,这显然不是我们想要的。
解决办法:
删除这个节点,重新创建容器 以节点的方式挂载到这个之前节点的数据卷位置 v1。
启动后 过会数据将会全部进行同步。
安装Haproxy
1.
docker pull haproxy:2.2.1
2.创建haproxy.cfg到/home/config
编辑
# 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.18.0.2:3306 check weight 1 maxconn 2000
server MySQL_2 172.18.0.3:3306 check weight 1 maxconn 2000
server MySQL_3 172.18.0.4:3306 check weight 1 maxconn 2000
#使用keepalive检测死链
option tcpka
3.
create user 'haproxy'@'%' identified by '';
4.创建Haproxy容器(name=h1的原因是为了高可用)
# 这里要加 --privileged
docker run -it -d -p 4001:8888 -p 4002:3306 -v /home/config:/usr/local/etc/haproxy --name h1 --net=pxc-network --ip 172.18.0.117 --privileged haproxy:2.2.1
5.进入容器
docker exec -it h1 bash
6.在容器bash中启动Haproxy
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
退出容器 命令行输入exit 或者 ctrl+p+q
浏览器访问这个主机192.168.149.111:4001/dbs,用户名密码为刚配置文件中的用户名密码,访问后出现下面界面
可以看到有三个数据库
navicat通过 4002端口进行连接mysql
还没有评论,来说两句吧...