基于docker的mysql集群搭建(一):percona-xtradb-cluster集群搭建(主主复制)

mydsql的集群解决方案很多这里选择percona-xtradb-cluster
基于docker的mysql集群搭建(一):percona-xtradb-cluster集群搭建(主主复制)_第1张图片
基于docker的mysql集群搭建(一):percona-xtradb-cluster集群搭建(主主复制)_第2张图片
基于docker的mysql集群搭建(一):percona-xtradb-cluster集群搭建(主主复制)_第3张图片
基于docker的mysql集群搭建(一):percona-xtradb-cluster集群搭建(主主复制)_第4张图片

percona-xtradb-cluster简介

Percona XtraDB Cluster(简称PXC),是由percona公司推出的mysql集群解决方案。特点是每个节点都能进行读写,且都保存全量的数据。也就是说在任何一个节点进行写入操作,都会同步给其它所有节点写入到自己的磁盘。这点跟Oracle Rac有本质的区别,Rac是多个节点连同一个共享存储,假如Oracle的共享存储挂了,整个集群就挂了。而Mysql pxc中任何一台机器挂了,集群照常运转,因为节点间并不共享磁盘。

percona-xtradb-cluster注意事项

  1. 由于pxc只作用于innodb引擎,而mysql自带的系统库(mysql)里面有些表是MyISAM的存储引擎,因此不能直接对系统库(mysql)的表进行dml操作,比如INSERT INTO mysql.user…。而是使用CREATE USER…,这个是没有问题的,而且也是正确的方式。
  2. 不支持LOCK TABLES和UNLOCK TABLES语句
    mysql> lock tables world write;
    ERROR 1105 (HY000): Percona-XtraDB-Cluster prohibits use of LOCK TABLE/FLUSH TABLE WITH READ LOCK/FOR EXPORT with pxc_strict_mode = ENFORCING
  3. log_output参数不能是TABLE
  4. 不支持分布式事务
  5. 新建表必须要有主键,否则对表进行dml操作会报以下错误
    ERROR 1105 (HY000): Percona-XtraDB-Cluster prohibits use of DML command on a table (hello.world) without an explicit primary key with pxc_strict_mode = ENFORCING or MASTER
  6. 推荐的节点数最小是3个

percona-xtradb-cluster(pxc)的搭建

环境准备

docker:docker-ce
pxc :percona/percona-xtradb-cluster:5.7
两台虚拟机服务器:192.168.44.139
192.168.44.140

1、准备镜像

#拉取percona/percona-xtradb-cluster
docker pull percona/percona-xtradb-cluster:5.7
# 镜像重命名为pxc
docker tag percona/percona-xtradb-cluster:5.7 pxc

2、创建本地目录用来映射mysql相关文件

# 
mkdir -p /mnt/vdb1/pxc/mysql /mnt/vdb1/pxc/data
# 修改权限
chmod 777 /mnt/vdb1/pxc/mysql /mnt/vdb1/pxc/data

3、创建pxc容器

主节点: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中复制
基于docker的mysql集群搭建(一):percona-xtradb-cluster集群搭建(主主复制)_第5张图片

但是会有一些问题

注意事项

1、之前我采用的是8.0的PXC,但是就是报SSL错误

报错信息是:
New joining cluster node didn’t find needed SSL artifacts

找了很久的资料文档,在官方的文档中找到:是由于8.0默认开启了pxc-encrypt-cluster-traffic,强制使用SSL,后来我在容器的配置中找到mysql的配置,把这个属性改为OFF,重启容器和docker,子节点还是不能加入,也不是很清楚为什么,后来就先用5.7版本跑通。主要就是要主从节点使用同一份SSL证书

2、PXC集群注意事项

从节点启动之后闪退(一)

第一种情况是由于主节点还没有启动,就启动了从节点,那这个时候从节点肯定是闪退的。
所以需要先启动主节点,再启动从节点。

从节点启动之后闪退(二)

第二种情况,是由于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集群
基于docker的mysql集群搭建(一):percona-xtradb-cluster集群搭建(主主复制)_第6张图片
双主模式是可以相互复制的,那么就有一个问题,既然可以相互复制说明有做负载均衡的签里,查找资料发现,haproxy+pxc可以实现mysql的负载均衡,下篇记录

你可能感兴趣的:(mysql)