Linux MySQL专栏-pxc

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.35

docker 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.35

docker 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 -af

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-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.3

Copyright (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 bash

bash-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来完成的:看上面的自动仲裁设置!

手动引导,参考上面退出加入,重新引导集群!

  • 25
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lylaotang

你的鼓励就是我创作的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值