新零售-使用docker搭建PXC集群

一、前言

MySQL集群最常见的有两种,分别是Replication 集群和 PXC集群,他们不是竞争关系,而是互补关系,在分布式高可用架构中,通常是一起使用的。

Replication集群是异步传输,通常在做MySQL高可用时使用,主从之间是异步同步数据,在存储用户评价等没有强一致性要求的数据时使用。

PXC集群是强一致同步数据,在存储订单数据等有强一致性要求的数据时使用。

这里,我们采用的是docker搭建pxc集群。

二、准备工作

1、pxc集群规划

名称 IP 端口 数据卷 角色
v2 192.168.78.102 3306 vv2 管理节点
v3 192.168.78.103 3306 vv3 工作节点
v4 192.168.78.104 3306 vv4 工作节点
v5 192.168.78.105 3306 vv5 工作节点
2、搭建docker swarm集群

点击查看:搭建docker swarm集群

这里需要区分的概念是:

swarm集群针对的是docker主机,而本篇pxc集群针对的是docker主机下具体的容器,也可以称为分布式容器。

分布式容器是基于swarm集群的,没有swarm集群,就没有分布式容器。

3、创建自定义虚拟网络
# 在swarm集群的管理节点执行(v2)
docker network create -d overlay --attachable test_net

这里需要说明的是,swarm集群下每个节点都有一个相同的虚拟网络,但那个网络不能用于容器,也就是说,想做分布式容器,我们需要另外创建一个虚拟网络,所以才有了这一步操作。

4、下载pxc镜像
# 下载镜像
docker pull percona/percona-xtradb-cluster:5.7.21
# 重命名镜像
docker tag percona/percona-xtradb-cluster:5.7.21 pxc
# 删除多余镜像
docker rmi percona/percona-xtradb-cluster:5.7.21

这里需要强调的一点是:一定要指定版本为5.7.21,我最开始没有指定版本,下载的最新版本的pxc-cluster镜像,第二个节点启动30秒左右就会闪退,所以一定要注意这个问题。

三、搭建pxc集群

1、创建主节点容器

第一个启动的PXC节点是主节点,它会初始化PXC集群

PXC启动之后,就没有主节点的角色了

PXC集群中任何节点都可以读写数据

# v2上执行
docker run -d -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-e CLUSTER_NAME=MySQL-PXC \
-e XTRABACKUP_PASSWORD=123456 \
-v vv2:/var/lib/mysql \
--privileged \
--net=test_net \
--name=pxc-v2 \
pxc

参数说明:

MYSQL_ROOT_PASSWORD:root账户登录密码

CLUSTER_NAME:集群名称

XTRABACKUP_PASSWORD:各节点之间同步传输数据的密码

vv2:/var/lib/mysql \:将容器内的目录/var/lib/mysql挂载到宿主机的数据卷vv2

privileged:授予mysql权限

net:指定该容器使用的网络

name:指定该容器名称

pxc:指定该容器使用哪个镜像

注:创建主节点容器之后,用navicat连接成功,再去创建从节点容器,否则会创建从节点容器失败

2、创建从节点容器
# v3上执行
docker run -d -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-e CLUSTER_NAME=MySQL-PXC \
-e XTRABACKUP_PASSWORD=123456 \
-e CLUSTER_JOIN=pxc-v2 \
-v vv3:/var/lib/mysql \
--privileged \
--net=test_net \
--name=pxc-v3 \
pxc
# v4上执行
docker run -d -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-e CLUSTER_NAME=MySQL-PXC \
-e XTRABACKUP_PASSWORD=123456 \
-e CLUSTER_JOIN=pxc-v2 \
-v vv4:/var/lib/mysql \
--privileged \
--net=test_net \
--name=pxc-v4 \
pxc
# v5上执行
docker run -d -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-e CLUSTER_NAME=MySQL-PXC \
-e XTRABACKUP_PASSWORD=123456 \
-e CLUSTER_JOIN=pxc-v2 \
-v vv5:/var/lib/mysql \
--privileged \
--net=test_net \
--name=pxc-v5 \
pxc
3、结果

到这里,pxc集群就搭建完了,并且,操作就会发现,他们四个的数据是完全同步的,即强一致性的。

四、踩坑时遇到的问题及解决方案

1、第一个pxc主节点可以正常启动,第二个节点闪退

解决方案1:把原来下载的最新版镜像删掉,下载指定版本5.7.21,然后重新构建就可以了

解决方案2:在所有节点所在主机上,执行下面命令,然后重新构建

# 停掉创建的容器
docker stop 容器ID
# 删除容器
docker rm 容器ID
# 删除该主机下,未被用到的数据卷
docker volume prune

解决方案3:把网络名称中的 - 改为 _,然后重新构建,比如test-net 改为 test_net