Docker 使用PXC搭建MySQL集群(MySQL:5.7.24)_mysql

关于MySQL集群,常用的有两种模式:​​Replication集群架构(主从复制)​​​ 和 ​​PXC集群架构​

  • PXC集群方案所有节点都是可读可写的,Replication从节点不能写入,因为主从同步是单向的,无法从slave节点向master点同步。
  • PXC同步机制是同步进行的,这也是它能保证数据强一致性的根本原因,Replication同步机制是异步进行的,它如果从节点停止同步,依然可以向主节点插入数据,正确返回,造成数据主从数据的不一致性。
  • PXC是用牺牲性能保证数据的一致性,Replication在性能上是高于PXC的。所以两者用途也不一致。PXC是用于重要信息的存储,例如:订单、用户信息等。Replication用于一般信息的存储,能够容忍数据丢失,例如:购物车,用户行为日志等。

这里记录下搭建PXC集群的过程,其中选择的镜像是 ​​percona/percona-xtradb-cluster:5.7.24​​,

Docker集群环境为:docker-79、docker-80、docker-81 三台机器,其中docker-81为当前集群的Leader节点。

Docker 使用PXC搭建MySQL集群(MySQL:5.7.24)_数据库_02


此博客是用amd64的服务器搭建的集群,截止目前,​​percona/percona-xtradb-cluster​​镜像,还未支持ARM架构服务器。

Docker 使用PXC搭建MySQL集群(MySQL:5.7.24)_docker_03

1. 拉取镜像:

docker pull percona/percona-xtradb-cluster:5.7.24

这里可以根据自己需要的MySQL版本,直接修改后面的版本号。不同版本的MySQL,正常应该都可以拉下来。

2. 创建docker Swarm 内部网络

docker network create -d overlay --attachable pxc_network

Docker 使用PXC搭建MySQL集群(MySQL:5.7.24)_数据_04


这里必须要加上–attachable 否则后面运行pxc容器时,会报错:​​XXX not manually attachable.​

docker: Error response from daemon: Could not attach to network pxc-network: rpc error: code = PermissionDenied desc = network pxc-network not manually attachable.

如果在单台服务器上则需要根据宿主机的网卡,创建子网段 :​​docker network create --subnet=172.18.0.0/24 net1​​ 后面用的时候,指定172.18.0.0到172.18.0.24 范围内的IP 作为每个pxc节点的IP

我这里是三台服务器,就直接创建了一个​​overlay​​ 类型的 network

3. 创建数据卷volume

在每台机器上一次执行创建数据卷 ​​volume_81​​​ 和备份数据卷 ​​backup​​:

docker volume create volume_81
docker volume create backup

接着可以看下新建的数据卷,在宿主机上的位置:​​docker inspect 数据卷名​

Docker 使用PXC搭建MySQL集群(MySQL:5.7.24)_docker_05


其中:​​/var/lib/docker/volumes/volume_81/_data​​ 即为 volume_81卷所在位置。其实这里不手动创建也是可以的,在运行时,如果数据卷不存在,docker 会自动帮我们新建。

在 docker-81 机器上,启动 pxc_81 节点:

docker run --privileged=true \
--restart=always \
--name node_81 \
-d -p 3306:3306 \
-v volume_81:/var/lib/mysql \
-v backup:/data \
-e MYSQL_ROOT_PASSWORD=abc123456\
-e CLUSTER_NAME=PXC_CLUSTER \
-e XTRABACKUP_PASSWORD=abc123456\
--net=pxc_network \
percona/percona-xtradb-cluster:5.7.24

Docker 使用PXC搭建MySQL集群(MySQL:5.7.24)_docker_06


节点正常运行后,就可以使用 Navicat 数据库链接工具访问试下:

Docker 使用PXC搭建MySQL集群(MySQL:5.7.24)_mysql_07


Docker 使用PXC搭建MySQL集群(MySQL:5.7.24)_数据库_08


另外可以在宿主机上看到MySQL容器的文件:

Docker 使用PXC搭建MySQL集群(MySQL:5.7.24)_mysql_09


上面一定要使用Navicat连接成功后,再从节点上安装,否则从节点即使正常运行,也不一定能连上。

接着在其他两台服务器上运行容器。
​​​docker-80​​ 机器

docker run --privileged=true \
--restart=always \
--name node_80 \
-d -p 3306:3306 \
-v volume_80:/var/lib/mysql \
-v backup:/data \
-e MYSQL_ROOT_PASSWORD=huauN2021 \
-e CLUSTER_NAME=PXC_CLUSTER \
-e CLUSTER_JOIN=node_81 \
-e XTRABACKUP_PASSWORD=huauN2021 \
--net=pxc_network \
percona/percona-xtradb-cluster:5.7.24

​docker-79​​ 机器

docker run --privileged=true \
--restart=always \
--name node_79 \
-d -p 3306:3306 \
-v volume_79:/var/lib/mysql \
-v backup:/data \
-e MYSQL_ROOT_PASSWORD=huauN2021 \
-e CLUSTER_NAME=PXC_CLUSTER \
-e CLUSTER_JOIN=node_81 \
-e XTRABACKUP_PASSWORD=huauN2021 \
--net=pxc_network \
percona/percona-xtradb-cluster:5.7.24

然后可以尝试在任意节点上新建数据库,其他节点会自动同步该数据库或者数据。

然后可以看下之前创建的network的使用情况:

docker network inspect pxc_network

Docker 使用PXC搭建MySQL集群(MySQL:5.7.24)_数据_10


可以看到三台节点的IP。

这里虽然我们第一个创建的是node81节点,并且看上去它作为主节点了,其他节点是按照它的名字加入了集群,这里可以尝试停掉 ​​docker-81​​​ 机器上的MySQL容器,然后验证,​​docker-79​​​ 和 ​​docker-80​​ 上面的MySQL仍然可以保持同步。

新建数据库:spring_boot_plus

可以看到自动同步了,然后在某一台上面导入SQL脚本:

Docker 使用PXC搭建MySQL集群(MySQL:5.7.24)_docker_11


导入成功后,可以看到另外两个库也是正常同步了上面导入的数据信息的。