mydsql的集群解决方案很多这里选择percona-xtradb-cluster
Percona XtraDB Cluster(简称PXC),是由percona公司推出的mysql集群解决方案。特点是每个节点都能进行读写,且都保存全量的数据。也就是说在任何一个节点进行写入操作,都会同步给其它所有节点写入到自己的磁盘。这点跟Oracle Rac有本质的区别,Rac是多个节点连同一个共享存储,假如Oracle的共享存储挂了,整个集群就挂了。而Mysql pxc中任何一台机器挂了,集群照常运转,因为节点间并不共享磁盘。
docker:docker-ce
pxc :percona/percona-xtradb-cluster:5.7
两台虚拟机服务器:192.168.44.139
192.168.44.140
#拉取percona/percona-xtradb-cluster
docker pull percona/percona-xtradb-cluster:5.7
# 镜像重命名为pxc
docker tag percona/percona-xtradb-cluster:5.7 pxc
#
mkdir -p /mnt/vdb1/pxc/mysql /mnt/vdb1/pxc/data
# 修改权限
chmod 777 /mnt/vdb1/pxc/mysql /mnt/vdb1/pxc/data
主节点:192.168.44.139
docker run \
-e MYSQL_ROOT_PASSWORD=1qazXSW@ -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=1qazXSW@ \
-v /mnt/vdb1/pxc/mysql:/var/lib/mysql -v /mnt/vdb1/pxc/data:/data \
-p 3306:3306 \
--privileged --name=mysqldb1 --net=host \
-d pxc
#MYSQL_ROOT_PASSWORD 数据库连接密码
#CLUSTER_NAME 集群名称
#XTRABACKUP_PASSWORD 未知
#privileged 标识容器内的root拥有真正的root权限,否则只是一个root只是一个普通用户
#net 所处网段,host和主机一样,可以自己创建网段,这个有待后续研究
从节点:192.168.44.140
注意:一定要等主节点完全启动后才能运行子节点,不然子节点无法启动成功,而且再启动时会闪退
docker run \
-e MYSQL_ROOT_PASSWORD=1qazXSW@ \
-e CLUSTER_NAME=PXC \
-e XTRABACKUP_PASSWORD=1qazXSW@ \
-e CLUSTER_JOIN=192.168.44.139 \
-v /mnt/vdb1/pxc/mysql:/var/lib/mysql -v /mnt/vdb1/pxc/data:/data \
-p 3306:3306 \
--privileged --name=mysqldb2 --net=host \
-d pxc
#CLUSTER_JOIN 加入的集群组
进入主节点映射的mysql文件夹内
/mnt/vdb1/pxc/mysql
查看此文件加下的grastate.dat
如果文件中的safe_to_bootstrap不为1那么修改为1,然后找到子节点,将子节点中的safe_to_bootstrap设置为0,具体原因查看后面的注意事项
至此,基于Docker的多机PXC集群搭建完成,亲测可用,下图可见
pxc01是链接的192.168.44.139:3306,pxc02是链接的192.168.44.140:3306,我在pxc01中创建一个wlmqcallcenter的数据库,可以在pxc02中复制
但是会有一些问题
报错信息是:
New joining cluster node didn’t find needed SSL artifacts
找了很久的资料文档,在官方的文档中找到:是由于8.0默认开启了pxc-encrypt-cluster-traffic,强制使用SSL,后来我在容器的配置中找到mysql的配置,把这个属性改为OFF,重启容器和docker,子节点还是不能加入,也不是很清楚为什么,后来就先用5.7版本跑通。主要就是要主从节点使用同一份SSL证书
从节点启动之后闪退(一)
第一种情况是由于主节点还没有启动,就启动了从节点,那这个时候从节点肯定是闪退的。
所以需要先启动主节点,再启动从节点。
从节点启动之后闪退(二)
第二种情况,是由于PXC在退出的时候会给集群中最后退出的那台打上标记,当集群重新启动的时候需要 先启动最后关闭的那台节点机器。
但是docker中容器启动是没有办法更改指令的,所以需要修改数据卷中grastate.data文件,把safe_to_bootstrap参数改为0。PXC中就是讲最后关闭的节点的safe_to_bootstrap标记为1,需要按照主节点启动。
由于PXC的公司在制作Linux的镜像的时候,默认是不会给子节点退出的safe_to_bootstrap配置打上1的,所以真正要修改的是主节点的safe_to_bootstrap,主节点修改为1,才可以真正的启动,启动之后再去启动从节点。
主节点启动之后闪退(一)
可以参考 从节点启动之后闪退(二)中最后一段的说法,就是需要修改主节点的safe_to_bootstrap为1即可。
主节点启动之后闪退(二)
当主节点突然宕机,从节点都正常运行,这时候主节点不能按照主节点启动。
这时候需要删除主节点的容器,检查数据卷上的safe_to_bootstrap是否为0,如果不是则改为0。然后以从节点的方式创建容器,加入集群。
可以使用任何PXC节点,然后从节点加入PXC集群
双主模式是可以相互复制的,那么就有一个问题,既然可以相互复制说明有做负载均衡的签里,查找资料发现,haproxy+pxc可以实现mysql的负载均衡,下篇记录