# MYSQL集群PXC 特性
在实际的部署中,MYSQL集群的部署方式有很多种,比如 主从啊 双双组合啊等等,大家可以 自行去百度,找到自己合适的集群部署模式来应对你的业务,我这里选择PXC集群模式;以下是PXC的特性:
- 速度慢,但能保证强一致性,适用于保存价值较高的数据,比如订单、客户、支付等。
- 数据同步是双向的,在任一节点写入数据,都会同步到其他所有节点,在任何节点上都能同时读写。
- 采用同步复制,向任一节点写入数据,只有所有节点都同步成功后,才会向客户端返回成功。事务在所有节点要么同时提交,要么不提交;
# PXC 安装
在Docker中安装PXC集群,使用Docker仓库中的PXC官方镜像:https://hub.docker.com/r/percona/percona-xtradb-cluster
- 从docker下载PXC镜像:
docker pull percona/percona-xtradb-cluster
注意这里是下载最新版本的PXC 最新的是8.0以上的,经过我采坑,8.0以上启动集群的时候:节点通信报了一个SSL的错误,搞了半天没有解决好,故这里选择 5.7.21的版本
docker pull percona/percona-xtradb-cluster:5.7.21
安装完成:
default tag: latestTrying to pull repository docker.io/percona/percona-xtradb-cluster ... latest: Pulling from docker.io/percona/percona-xtradb-cluster:5.7.21ff144d3c0ab1: Pull complete eafdff1524b5: Pull complete c281665399a2: Pull complete c27d896755b2: Pull complete c43c51f1cccf: Pull complete 6eb96f41c54d: Pull complete 4966940ec632: Pull complete 2bafadcea292: Pull complete 3c2c0e21b695: Pull complete 52a8c2e9228e: Pull complete f3f28eb1ce04: Pull complete d301ece75f56: Pull complete 3d24904bec3c: Pull complete 1053c2982c37: Pull complete Digest: sha256:17c64dacbb9b62bd0904b4ff80dd5973b2d2d931ede2474170cbd642601383bdStatus: Downloaded newer image for docker.io/percona/percona-xtradb-cluster:5.7.21
外送2个额外的命令在实际的部署中自行灵活使用:
// 修改镜像名称为PXCdocker tag percona/percona-xtradb-cluster:5.7.21 pxc// 删除原来的percona/percona-xtradb-cluster镜像docker rmi percona/percona-xtradb-cluster:5.7.21
查询镜像:命令 docker images
[root@172-10-22-104 /]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEpxc latest f1439de62087 2 years ago 413MB
# 出于安全考虑,给PXC集群创建Docker内部网络
# 创建网段docker network create --subnet=172.18.0.0/24 net1
以下2个命令灵活使用:
# 查看网段docker network inspect net1# 删除网段# docker network rm net1
# 创建Docker卷
使用Docker时,业务数据应保存在宿主机中,采用目录映射,这样可以使数据与容器独立。但是容器中的PXC无法直接使用映射目录,解决办法是采用Docker卷来映射
# 创建名称为v1的数据卷,--name可以省略docker volume create --name v1
查看
docker inspect v1
[root@localhost ~]# docker inspect v1[ { "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/v1/_data",#这里是在宿主机的保存位置 "Name": "v1", "Options": {}, "Scope": "local" }]
删除
docker volume rm v1
我们启用5个节点,去创建5个数据卷
# 创建5个数据卷docker volume create --name v1docker volume create --name v2docker volume create --name v3docker volume create --name v4docker volume create --name v5
# 创建5个PXC容器
# 创建5个PXC容器构成集群# 第一个节点docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -v v1:/var/lib/mysql --name=node1 --network=net1 --ip 172.18.0.2 pxc# 在第一个节点启动后要等待一段时间,等候mysql启动完成。# 第二个节点docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v2:/var/lib/mysql --name=node2 --net=net1 --ip 172.18.0.3 pxc# 第三个节点docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v3:/var/lib/mysql --name=node3 --net=net1 --ip 172.18.0.4 pxc# 第四个节点docker run -d -p 3309:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v4:/var/lib/mysql --name=node4 --net=net1 --ip 172.18.0.5 pxc# 第五个节点docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v5:/var/lib/mysql --name=node5 --net=net1 --ip 172.18.0.6 pxc
查看:
[root@localhost ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf4708ce32209 pxc "/entrypoint.sh " About a minute ago Up About a minute 4567-4568/tcp, 0.0.0.0:3309->3306/tcp node4bf612f9586bc pxc "/entrypoint.sh " 17 minutes ago Up 17 minutes 4567-4568/tcp, 0.0.0.0:3310->3306/tcp node59fdde5e6becd pxc "/entrypoint.sh " 17 minutes ago Up 17 minutes 4567-4568/tcp, 0.0.0.0:3308->3306/tcp node3edd5794175b6 pxc "/entrypoint.sh " 18 minutes ago Up 18 minutes 4567-4568/tcp, 0.0.0.0:3307->3306/tcp node233d842de7f42 pxc "/entrypoint.sh " 21 minutes ago Up 21 minutes 0.0.0.0:3306->3306/tcp, 4567-4568/tcp node1
安装到此完成;
# 验证
使用MYSQL 连接工具进行连接 IP 天宿主的IP ,端口填写你启动映射的端口;账号root,密码是你启动的时候的设置我这里是abc123456;
然后创建表,创建数据,看是否在各节点同步数据,如果有,那证明成功;
# 下一章:数据库负载均衡的必要性(haproxy)
![9acfc3ac5b58ecaf927343f66b973981.png](https://i-blog.csdnimg.cn/blog_migrate/ef0e111e6ee1f604a6ddedc36fcfa4c2.jpeg)