1
这篇文章主要是通过公司同事的文档照搬而来

PXC是什么

PXC是MySQL的高可用性和扩展性的解决方案,通俗来讲就是MySQL的集群方案;

PXC的集群作用

实现数据库的节点实时同步,可以保证数据的一致性,保证数据同步(强一致性)

PXC集群和Replication集群

PXC集群的特点

PXC实现了同步复制,复制数据是双向的,事物在所有的集群节点要么同时提交,要么不提交;
多主机复制,可以在任何节点上提交数据;
从slave服务器上的并行应用事件达到了真正的并行复制;
当你设置了自增主键,数据并不是按照+1的模式进行的,而是按照节点的数量进行递增;

Replication集群特点

Replication同步数据是单向的;
Replication在主节点写入,Slave分支读取,master无法读取数据,所以说Replication的每一个节点都不能同时读写;

PXC下载

1
https://hub.docker.com/r/percona/percona-xtradb-cluster/

PXC集群搭建

1
2
# 安装命令 5.7是版本号
docker pull percona/percona-xtradb-cluster:5.7

查看是否安装成功

但是你会发现镜像名太长了

1
2
3
4
5
6
# 那么修改名称,如果不是最新版,那么你执行这些操作记得都给我加版本号
docker tag docker.io/percona/percona-xtradb-cluster:5.7 pxc:5.7
# 然后查看
docker images
# 及得删除原来的镜像, 如果你不是最新版本,那么你执行这些操作记得都给我加版本号
docker rmi docker.io/percona/percona-xtradb-cluster:5.7

创建docker内部网络,网络的名字叫jiushi,ip地址是172.94.9.4

1
docker network create --subnet=172.94.9.4/24 jiushi

查看网络是否创建完成 docker inspect jiushi

删除网络命令

1
2
# 这里只是提供删除命令,你要是想跟着教程走,我劝你耗子尾汁
docker network rm jiushi

创建docker卷(docker卷可以在宿主机上看得见)

1
docker volume create --name v1

查看docker卷,其实docker卷有点类似windows的磁盘,其实也就是目录的映射

PXC集群启动

经过了上方的步骤,PXC的镜像已经下载完成了,docker的内部网络是jiushi,docker卷是V1,现在我们要做的是启动PXC容器

创建PXC容器

你要创建几个容器,就创建几个docker卷,上面步骤我只创建了一个,剩下的两个请铁子们自己创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 参数解释
# -v 之前步骤里创建的卷
# MYSQL_ROOT_PASSWORD 是MySQL数据库的密码
# CLUSTER_NAME 集群的名称
# XTRABACKUP_PASSWORD 加入集群的密码
# privileged 是设置权限
# name=node1 是启动容器的名称
# net=jiushi 是加入网络的名称,也就是之前创建的内部网络
# ip 指定启动的ip
# pxc:5.7 指定启动的镜像
docker run -d -p 3306:3306
-v v1:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123
-e CLUSTER_NAME=PXC
-e XTRABACKUP_PASSWORD=123
--privileged
--name=node1
--net=net1
--ip 172.18.0.2 pxc:5.7

创建第二个集群

1
2
3
4
5
6
7
8
9
10
11
12
13
# 这里我用的mysql是5.7 高版本会出现问题,请百度自行解决
# 参数解释
# CLUSTER_JOIN 表示加入主节点为node1的集群
docker run -d -p 3307:3306
-e MYSQL_ROOT_PASSWORD=123456
-e CLUSTER_NAME=PXC
-e XTRABACKUP_PASSWORD=123456
-e CLUSTER_JOIN=node1
-v v2:/var/lib/mysql
--privileged
--name=node2
--net=jiushi
--ip 172.18.0.3 pxc:5.7

创建第三个集群

1
2
3
4
5
6
7
8
9
10
11
12
13
# 这里我用的mysql是5.7 高版本会出现问题,请百度自行解决
# 参数解释
# CLUSTER_JOIN 表示加入主节点为node1的集群
docker run -d -p 3308:3306
-e MYSQL_ROOT_PASSWORD=123456
-e CLUSTER_NAME=PXC
-e XTRABACKUP_PASSWORD=123456
-e CLUSTER_JOIN=node1
-v v3:/var/lib/mysql
--privileged
--name=node3
--net=jiushi
--ip 172.18.0.4 pxc:5.7

Ps: 最后要注意的事项

1
2
3
4
5
6
7
8
9
10
11
12
# 当你使用Navicat连接数据库会发现连接不上,那就试试在防火墙中添加端口号  3306是你要开放的端口号
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --zone=public --add-port=3307/tcp --permanent
firewall-cmd --zone=public --add-port=3308/tcp --permanent

# 还需要注意如果你使用的MySQL8.0要注意SSL问题,需要给docker卷足够的权限,切换到对应的卷给权限
# -R是递归的意思也就说子文件也会开放最高权限
chmod -R 777

# Navicat连接时,用的ip是你linux系统的ip
ip addr
# 一般是ens33