1.拉取pxc镜像
docker pull percona/percona-xtradb-cluster
2.如果嫌弃名称太长,修改镜像名称(可不做这一步)
docker tag percona/percona-xtradb-cluster pxc
删除原始镜像
docker rmi percona/percona-xtradb-cluster
3.创建docker内部网络
docker swarm init --advertise-addr 192.168.0.101
如果是单台服务器,需要根据宿主机的网卡,创建子网段
docker network create --subnet=172.18.0.0/24 pxcNetwork
如果是多台服务器,创建一个overlay类型的network
docker network create --driver overlay --attachable pxcNetwork
这里必须要加上--attachable,否则后面运行pxc集群时,会报错XXX not manually attachable.
attachable的作用是:默认情况下。overlay生效的返回是在dockerswarm集群中,如果想要单独拿出来用的话,没有在这个集群中创建的话,就需要加这个单词。
这个时候我们去我们另外一台主机上看,发现也会自动同步一个overlay网络
查看pxc-network网段信息
docker inspect pxcNetwork
删除pxc-network
docker network rm pxcNetwork
4.创建数据卷
因为pxc不支持映射目录,所以采用映射卷的方式
docker volume create pxcNode1Vol
docker volume create pxcNode2Vol
docker volume create pxcNode3Vol
5.创建pxc容器
这里最好先把备份数据的数据卷创建出来,然后映射到宿主机,这样以后做热备份的时候就不用删掉容器节点重新再创建容器并映射备份目录了
docker volume create pxcNode1Backup
docker volume create pxcNode2Backup
docker volume create pxcNode3Backup
docker volume create pxcNode1Conf
docker volume create pxcNode2Conf
docker volume create pxcNode3Conf
创建第一个节点:
这里要注意,一定要等到第一个节点创建并通过客户端连接成功,才能继续创建其它节点,否则因为找不到node1同步库,其它节点创建时会闪退
命令行参数说明:端口3306,密码123456,集群名称pxc,xtrabackup同步数据密码123456,映射数据目录到宿主机的pxcNode1Vol数据卷,权限为最高权限,名称pxcNode1,网段pxcNetwork,ip指定为172.18.0.2,运行的镜像是pxc
单节点:
docker run -d --restart=always -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=pxcClu -e XTRABACKUP_PASSWORD=123456 -v /etc/localtime:/etc/localtime -v pxcNode1Conf:/etc/mysql -v pxcNode1Vol:/var/lib/mysql -v pxcNode1Backup:/data --privileged --name=pxcNode1 --net=pxcNetwork --ip 172.18.0.2 pxc
多节点:
docker run -d --restart=always -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=pxcClu -e XTRABACKUP_PASSWORD=123456 -v /etc/localtime:/etc/localtime -v pxcNode1Conf:/etc/mysql -v pxcNode1Vol:/var/lib/mysql -v pxcNode1Backup:/data --privileged --name=pxcNode1 --net=pxcNetwork pxc --wsrep-new-cluster
创建第二个节点
单节点:
docker run -d --restart=always -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=pxcClu -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pxcNode1 -v /etc/localtime:/etc/localtime -v pxcNode2Conf:/etc/mysql -v pxcNode2Vol:/var/lib/mysql -v pxcNode2Backup:/data --privileged --name=pxcNode2 --net=pxcNetwork --ip 172.18.0.3 pxc
多节点:
docker run -d --restart=always -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=pxcClu -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pxcNode1 -v /etc/localtime:/etc/localtime -v pxcNode2Conf:/etc/mysql -v pxcNode2Vol:/var/lib/mysql -v pxcNode2Backup:/data --privileged --name=pxcNode2 --net=pxcNetwork pxc
docker stop pxcNode2
scp /var/lib/docker/volumes/pxcNode1Vol/_data/ca.pem client-cert.pem client-key.pem server-cert.pem server-key.pem root@192.168.0.102:/var/lib/docker/volumes/pxcNode2Vol/_data/
docker restart pxcNode2
创建第三个节点
单节点:
docker run -d --restart=always -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=pxcClu -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pxcNode1 -v /etc/localtime:/etc/localtime -v pxcNode3Conf:/etc/mysql -v pxcNode3Vol:/var/lib/mysql -v pxcNode3Backup:/data --privileged --name=pxcNode3 --net=pxcNetwork --ip 172.18.0.4 pxc
多节点:
docker run -d --restart=always -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=pxcClu -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pxcNode1 -v /etc/localtime:/etc/localtime -v pxcNode3Conf:/etc/mysql -v pxcNode3Vol:/var/lib/mysql -v pxcNode3Backup:/data --privileged --name=pxcNode3 --net=pxcNetwork pxc
docker stop pxcNode3
scp /var/lib/docker/volumes/pxcNode1Vol/_data/ca.pem client-cert.pem client-key.pem server-cert.pem server-key.pem root@192.168.0.103:/var/lib/docker/volumes/pxcNode3Vol/_data/
docker restart pxcNode3
6.验证pxc集群
坑:
6.1 使用swarm 新建集群时遇到双网卡,未指定IP 报以下错误
Error response from daemon: could not choose an IP address to advertise since this system has multiple addresses on interface ens33 (fd00:6868:6868::4aa and fd00:6868:6868:0:8b60:8e8c:a03:2b64) - specify one with --advertise-addr
或
Error response from daemon: could not choose an IP address to advertise since this system has multiple addresses on different interfaces (10.0.2.15 on eth0 and 192.168.99.100 on eth1) - specify one with --advertise-addr
原因:由于有两个IP,集群不知道使用哪个所以报错。
解决:解决方法报错信息已经给出提示,使用--advertise-addr 指定IP
docker swarm init --advertise-addr 192.168.0.101
docker swarm join --token SWMTKN-1-5w21gu9o2yrg7ezu7nxdaj4vz5i34o7o58gzf5imznk80wy8xg-1idv7v7cwg36fdv3in19p1jfn 192.168.0.101:2377
6.2 初始主节点宕机后正确的启动方式
说明:pxc1宕机后,集群正常运行,会选举出新的主节点。如果修改参数safe_to_bootstrap=1以最开始pxc1为主节点创建启动pxc1的命令那么会分裂新的集群,毫无意义。
解决方案一:
1、删除v1卷下的grastate.dat文件
2、删除pxc1容器。
3、新建pxc1容器,并加入其它任何一个正常运行的节点,如pxc2
4、因为复用v1数据卷,以此方式创建容器,只需在原pxc1宕机前已有的数据与其它节点做增量同步,效率高。
docker rm pxc1
docker run ‐d ‐p 3306:3306 ‐e MYSQL_ROOT_PASSWORD=ddd123456 ‐e CLUSTER_NAME=PXC ‐e XTRABACKUP_PASSWORD=ddd123456 ‐e CLUSTER_JOIN=pxc2 ‐v v1:/var/lib/mysql ‐‐privileged ‐‐name=pxc1 pxc
重点:‐e CLUSTER_JOIN=pxc2
解决方案二:
1、创建全新的pxc4节点,形成一个pxc2、pxc3、pxc4的新集群。
2、新建pxc4容器,端口3009。并加入其它任何一个正常运行的节点,如pxc2,做全量数据同步。
#创建v4卷
docker volume create ‐‐name v4
docker run ‐d ‐p 3309:3306 ‐e MYSQL_ROOT_PASSWORD=ddd123456 ‐e CLUSTER_NAME=PXC ‐e XTRABACKUP_PASSWORD=ddd123456 ‐e CLUSTER_JOIN=pxc2 ‐v v4:/var/lib/mysql ‐‐privileged ‐‐name=pxc4 pxc
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?