PXC(docker)
网络拓扑图
注意:本次实验3节点跑在同一主机上!
创建docker网络
docker network create pxc -d bridge
docker network ls
first node
docker run -d \
--privileged \
-e MYSQL_ROOT_PASSWORD=root \
-e XTRABACKUP_PASSWORD='Root@123' \
-e CLUSTER_NAME=pxc-cluster1 \
-e CLUSTER_JOIN='' \
-v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime \
-v pxc-node1_volumes:/var/lib/mysql \
-v pxc-node1_cnf:/etc/mysql \
--name=pxc-node1 \
--net=pxc \
percona/percona-xtradb-cluster:8.0.35等first node节点起来,其它节点再加入集群
docker logs -f pxc-node1
second node
docker run -d \
--privileged \
-e MYSQL_ROOT_PASSWORD=root \
-e XTRABACKUP_PASSWORD='Root@123' \
-e CLUSTER_NAME=pxc-cluster1 \
-e CLUSTER_JOIN='pxc-node1,pxc-node2,pxc-node3' \
-v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime \
-v pxc-node2_volumes:/var/lib/mysql \
-v pxc-node2_cnf:/etc/mysql \
--name=pxc-node2 \
--net=pxc \
percona/percona-xtradb-cluster:8.0.35docker volume ls
\cp -f /var/lib/docker/volumes/pxc-node1_volumes/_data/*.pem /var/lib/docker/volumes/pxc-node2_volumes/_data/
docker restart pxc-node2
docker logs -f pxc-node1
有如下提示:
members(2):
0: 7e7e2fa1-0ae1-11ef-9770-07545311d8fe, 9b61b1fd4f7b
1: cc85001e-0ae0-11ef-82de-667fed0263d4, 0fabdf3e385c
third node
docker run -d \
--privileged \
-e MYSQL_ROOT_PASSWORD=root \
-e XTRABACKUP_PASSWORD='Root@123' \
-e CLUSTER_NAME=pxc-cluster1 \
-e CLUSTER_JOIN='pxc-node1,pxc-node2,pxc-node3' \
-v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime \
-v pxc-node3_volumes:/var/lib/mysql \
-v pxc-node3_cnf:/etc/mysql \
--name=pxc-node3 \
--net=pxc \
percona/percona-xtradb-cluster:8.0.35docker volume ls
\cp -f /var/lib/docker/volumes/pxc-node1_volumes/_data/*.pem /var/lib/docker/volumes/pxc-node3_volumes/_data/
docker restart pxc-node3
docker logs -f pxc-node1
有如下提示:
members(3):
0: 47398064-0ae2-11ef-9c70-368c7555a048, 27545f86ba83
1: 7e7e2fa1-0ae1-11ef-9770-07545311d8fe, 9b61b1fd4f7b
2: cc85001e-0ae0-11ef-82de-667fed0263d4, 0fabdf3e385c
first node 后执行
docker rm -f pxc-node1
docker volume prune -afdocker run -d \
--privileged \
-e MYSQL_ROOT_PASSWORD=root \
-e XTRABACKUP_PASSWORD='Root@123' \
-e CLUSTER_NAME=pxc-cluster1 \
-e CLUSTER_JOIN='pxc-node1,pxc-node2,pxc-node3' \
-v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime \
-v pxc-node1_volumes:/var/lib/mysql \
-v pxc-node1_cnf:/etc/mysql \
--name=pxc-node1 \
--net=pxc \
percona/percona-xtradb-cluster:8.0.35\cp -f /var/lib/docker/volumes/pxc-node2_volumes/_data/*.pem /var/lib/docker/volumes/pxc-node1_volumes/_data/
docker restart pxc-node1
docker logs -f pxc-node1
有如下提示:
members(3):
0: 442666cf-0ae4-11ef-a4c1-73be353a193d, af7c8a0fad85
1: 47398064-0ae2-11ef-9c70-368c7555a048, 27545f86ba83
2: 7e7e2fa1-0ae1-11ef-9770-07545311d8fe, 9b61b1fd4f7b
任一节点验证
[root@mysql ~]# docker exec -it pxc-node1 bash
bash-4.4$ mysql -uroot -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 8.0.35-27.1 Percona XtraDB Cluster (GPL), Release rel27, Revision 84d9464, WSREP version 26.1.4.3Copyright (c) 2009-2023 Percona LLC and/or its affiliates
Copyright (c) 2000, 2023, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> SHOW STATUS LIKE 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 3 |
+--------------------+-------+
1 row in set (0.00 sec)mysql>
自动仲裁
建议自动引导,每个node执行
mysql> set global wsrep_provider_options='pc.bootstrap=yes';
Query OK, 0 rows affected (0.00 sec)
退出加入
集群中有存活的节点
故障模拟
[root@mysql ~]# docker kill pxc-node3
pxc-node3集群中有存活的节点,某个节点意外退出,重新加入即可!
[root@mysql ~]# docker exec -it pxc-node2 bashbash-4.4$ mysql -uroot -proot
mysql> SHOW STATUS LIKE 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 2 |
+--------------------+-------+
1 row in set (0.00 sec)重新加入
[root@mysql ~]# docker start pxc-node3
pxc-node3再次查看,已恢复
mysql> SHOW STATUS LIKE 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 3 |
+--------------------+-------+
1 row in set (0.01 sec)
集群中没有存活的节点
集群中没有存活的节点,执行如下:
safe_to_bootstrap: 1,说明是最后断开的节点,先启动它,再启动其它节点!
如果没有 grastate.dat 文件,需要参照下面恢复主组件步骤恢复集群
[root@mysql ~]# cat /var/lib/docker/volumes/pxc-node1_volumes/_data/grastate.dat
# GALERA saved state
version: 2.1
uuid: bfe26e4b-0ae0-11ef-abb1-d32bcda91b65
seqno: -1
safe_to_bootstrap: 0
[root@mysql ~]# cat /var/lib/docker/volumes/pxc-node2_volumes/_data/grastate.dat
# GALERA saved state
version: 2.1
uuid: bfe26e4b-0ae0-11ef-abb1-d32bcda91b65
seqno: -1
safe_to_bootstrap: 0
[root@mysql ~]# cat /var/lib/docker/volumes/pxc-node3_volumes/_data/grastate.dat
# GALERA saved state
version: 2.1
uuid: bfe26e4b-0ae0-11ef-abb1-d32bcda91b65
seqno: -1
safe_to_bootstrap: 0
恢复主组件
gvwstate.dat 文件日常要备份!
[root@mysql ~]# cp /var/lib/docker/volumes/pxc-node3_volumes/_data/gvwstate.dat{,.kk}
[root@mysql ~]# cp /var/lib/docker/volumes/pxc-node2_volumes/_data/gvwstate.dat{,.kk}
[root@mysql ~]# cp /var/lib/docker/volumes/pxc-node1_volumes/_data/gvwstate.dat{,.kk}[root@mysql ~]# cat /var/lib/docker/volumes/pxc-node1_volumes/_data/gvwstate.dat
my_uuid: 442666cf-0ae4-11ef-a4c1-73be353a193d
#vwbeg
view_id: 3 442666cf-0ae4-11ef-a4c1-73be353a193d 7
bootstrap: 0
member: 442666cf-0ae4-11ef-a4c1-73be353a193d 0
member: 47398064-0ae2-11ef-9c71-368c7555a048 0
member: 7e7e2fa1-0ae1-11ef-9770-07545311d8fe 0
#vwend
[root@mysql ~]# cat /var/lib/docker/volumes/pxc-node2_volumes/_data/gvwstate.dat
my_uuid: 7e7e2fa1-0ae1-11ef-9770-07545311d8fe
#vwbeg
view_id: 3 442666cf-0ae4-11ef-a4c1-73be353a193d 7
bootstrap: 0
member: 442666cf-0ae4-11ef-a4c1-73be353a193d 0
member: 47398064-0ae2-11ef-9c71-368c7555a048 0
member: 7e7e2fa1-0ae1-11ef-9770-07545311d8fe 0
#vwend
[root@mysql ~]# cat /var/lib/docker/volumes/pxc-node3_volumes/_data/gvwstate.dat
my_uuid: 47398064-0ae2-11ef-9c71-368c7555a048
#vwbeg
view_id: 3 442666cf-0ae4-11ef-a4c1-73be353a193d 7
bootstrap: 0
member: 442666cf-0ae4-11ef-a4c1-73be353a193d 0
member: 47398064-0ae2-11ef-9c71-368c7555a048 0
member: 7e7e2fa1-0ae1-11ef-9770-07545311d8fe 0
#vwend
[root@mysql ~]#故障模拟
[root@mysql ~]# docker stop pxc-node1 pxc-node2 pxc-node3
pxc-node1
pxc-node2
pxc-node3恢复主组件
将上面3个备份的gvwstate.dat文件,分别恢复一下,注意恢复后的属主属组问题!
[root@mysql ~]# chown 1001:1001 /var/lib/docker/volumes/pxc-node1_volumes/_data/gvwstate.dat
[root@mysql ~]# docker start pxc-node1 pxc-node2 pxc-node3
再次查看
mysql> SHOW STATUS LIKE 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 3 |
+--------------------+-------+
1 row in set (0.01 sec)
重置仲裁
在网络连接出现问题,超过一半的集群出现故障(脑裂),节点不再将自己视为主组件的一部分,需要重置重载!
查找最高级别的节点
mysql> show global status like 'wsrep_cluster_status';
+----------------------+---------+
| Variable_name | Value |
+----------------------+---------+
| wsrep_cluster_status | Primary |
+----------------------+---------+
1 row in set (0.02 sec)返回值Primary表示节点是主组件的一部分。当变量返回任何其他值时,表示节点是不可操作组件的一部分。
如果没有任何节点返回Primary,则意味着需要重置仲裁,这种情况是非常少见的。如果有部分返回非Primary的节点,则表示是网络连接出现了问题,但不需要重置仲裁。一旦节点连通,它们就会自动与主组件重新同步。
重置仲裁前需要标识集群中最高级别的节点,即必须找到提交了最后一个事务的节点。
无论重置仲裁时使用何种方法,此节点都将作为新主组件的起点。mysql> show status like 'wsrep_last_committed';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| wsrep_last_committed | 28 |
+----------------------+-------+
1 row in set (0.00 sec)变量返回值是该节点提交的最后一个事务的序号,序号最大的节点是集群中最高级别的节点,将被用作引导新主组件。
重置仲裁所做的是在可用的最高级别节点上引导主组件,然后该节点作为新的主组件运行,使集群的其余部分与其状态保持一致。
有自动和手动两种方法完成仲裁重置,首选方法是自动方法。
自动引导是在最高级别节点上动态启用wsrep_provider_options参数为pc.bootstrap来完成的:看上面的自动仲裁设置!
手动引导,参考上面退出加入,重新引导集群!