部署Percona XtraDB Cluster(PXC 5.7)

1、环境准备

pxc1:192.168.1.21
pxc2:192.168.1.22
pxc3:192.168.1.23
pxc4:192.168.1.24

# 关闭防火墙和SELinux,保证时间同步
# 如果已经安装MySQL,必须卸载

2、安装 Percona XtraDB Cluster 5.7

# 配置清华大学yum源
[root@centos79-mysql03 ~]# vim /etc/yum.repos.d/pxc.repo
[percona]
name=percona_repo
baseurl = https://mirrors.tuna.tsinghua.edu.cn/percona/release/$releasever/RPMS/$basearch
enabled = 1
gpgcheck = 0

# 在三个节点都安装好PXC 5.7
[root@centos79-mysql01 ~]# yum install -y Percona-XtraDB-Cluster-57
[root@centos79-mysql02 ~]# yum install -y Percona-XtraDB-Cluster-57
[root@centos79-mysql03 ~]# yum install -y Percona-XtraDB-Cluster-57

[root@centos79-mysql01 ~]# rpm -ql Percona-XtraDB-Cluster-server-57
/etc/logrotate.d/mysql
/etc/my.cnf
/etc/my.cnf.d
/etc/percona-xtradb-cluster.cnf
/etc/percona-xtradb-cluster.conf.d
/etc/percona-xtradb-cluster.conf.d/mysqld.cnf
/etc/percona-xtradb-cluster.conf.d/mysqld_safe.cnf
/etc/percona-xtradb-cluster.conf.d/wsrep.cnf
/etc/sysconfig/mysql.bootstrap
/etc/xinetd.d/mysqlchk
/usr/bin/clustercheck
/usr/bin/innochecksum
/usr/bin/lz4_decompress
......

3、在各个节点上分别配置mysql及集群配置文件

/etc/my.cnf为主配置文件,当前版本中,其余的配置文件都放在/etc/percona-xtradb-cluster.conf.d目录里,包括mysqld.cnf,mysqld_safe.cnf,wsrep.cnf 三个文件

# 主配置文件不需要修改
[root@centos79-mysql01 ~]# vim /etc/my.cnf
!includedir /etc/my.cnf.d/
!includedir /etc/percona-xtradb-cluster.conf.d/

[root@centos79-mysql01 ~]# ls /etc/my.cnf.d/
[root@centos79-mysql01 ~]# ls /etc/percona-xtradb-cluster.conf.d/
mysqld.cnf  mysqld_safe.cnf  wsrep.cnf

# 下面配置文件除server-id外,不需要修改
[root@centos79-mysql01 ~]# vim /etc/percona-xtradb-cluster.conf.d/mysqld.cnf
[client]
socket=/var/lib/mysql/mysql.sock
[mysqld]
server-id=1
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
log-bin
log_slave_updates
expire_logs_days=7
symbolic-links=0

# 下面配置文件不需要修改
[root@centos79-mysql01 ~]# vim /etc/percona-xtradb-cluster.conf.d/mysqld_safe.cnf
[mysqld_safe]
pid-file = /var/run/mysqld/mysqld.pid
socket   = /var/lib/mysql/mysql.sock
nice     = 0

# 三个节点PXC的配置文件必须修改
[root@centos79-mysql01 ~]# grep -Ev "^#|^$" /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_address=gcomm://192.168.1.21,192.168.1.22,192.168.1.23
binlog_format=ROW
default_storage_engine=InnoDB
wsrep_slave_threads= 8
wsrep_log_conflicts
innodb_autoinc_lock_mode=2
wsrep_node_address=192.168.1.21
wsrep_cluster_name=pxc-cluster
wsrep_node_name=pxc-cluster-node-1
pxc_strict_mode=ENFORCING
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth="sstuser:s3cretPass"

[root@centos79-mysql02 ~]# grep -Ev "^#|^$" /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_address=gcomm://192.168.1.21,192.168.1.22,192.168.1.23
binlog_format=ROW
default_storage_engine=InnoDB
wsrep_slave_threads= 8
wsrep_log_conflicts
innodb_autoinc_lock_mode=2
wsrep_node_address=192.168.1.22
wsrep_cluster_name=pxc-cluster
wsrep_node_name=pxc-cluster-node-2
pxc_strict_mode=ENFORCING
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth="sstuser:s3cretPass"

[root@centos79-mysql03 ~]# grep -Ev "^#|^$" /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_address=gcomm://192.168.1.21,192.168.1.22,192.168.1.23
binlog_format=ROW
default_storage_engine=InnoDB
wsrep_slave_threads= 8
wsrep_log_conflicts
innodb_autoinc_lock_mode=2
wsrep_node_address=192.168.1.23
wsrep_cluster_name=pxc-cluster
wsrep_node_name=pxc-cluster-node-3
pxc_strict_mode=ENFORCING
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth="sstuser:s3cretPass"

尽管Galera Cluster不再需要通过binlog的形式进行同步,但还是建议在配置文件中开启二进制日志功能,原因是后期如果有新节点需要加入,老节点通过SST全量传输的方式向新节点传输数据,很可能会拖垮集群性能,所以让新节点先通过binlog方式完成同步后再加入集群会是一种更好的选择

配置文件各项配置意义

图片[1]-部署Percona XtraDB Cluster(PXC 5.7)-李佳程的个人主页

4、启动PXC集群中第一个节点

# 启动第一个节点
[root@centos79-mysql01 ~]# systemctl start mysql@bootstrap.service


# 查看密码
[root@centos79-mysql01 ~]# grep "temporary password" /var/log/mysqld.log
[root@centos79-mysql01 ~]# mysql -uroot -p'*&R:&zisw3I8'

# 修改root密码
mysql> alter user 'root'@'localhost' identified by '123456';

# 创建相关用户并授权

mysql> create user 'sstuser'@'localhost' identified by 's3cretPass';
mysql> grant reload,lock tables,process,replication client on *.* to 'sstuser'@'localhost';

# 查看相关变量
mysql> show variables like 'wsrep%'\G

# 查看相关状态变量(重点关注一下几行值)
mysql> show status like 'wsrep%';
+----------------------------------+--------------------------------------+
| Variable_name                    | Value                                |
+----------------------------------+--------------------------------------+
| wsrep_local_state_uuid           | 70da195c-698f-11ed-9532-17f5f0cc77dd |
| wsrep_local_state                | 4                                    |
| wsrep_local_state_comment        | Synced                               |
| wsrep_cluster_size               | 1                                    |
| wsrep_cluster_state_uuid         | 70da195c-698f-11ed-9532-17f5f0cc77dd |
| wsrep_cluster_status             | Primary                              |
| wsrep_connected                  | ON                                   |
| wsrep_ready                      | ON                                   |
+----------------------------------+--------------------------------------+
75 rows in set (0.00 sec)
  • wsrep_cluster_size表示,该Galera集群中只有一个节点
  • wsrep_local_state_comment 状态为Synced(4),表示数据已同步完成(因为是第一个引导节点,无数据需要同步)。 如果状态是Joiner, 意味着 SST 没有完成. 只有所有节点状态是Synced,才可以加新节点
  • wsrep_cluster_status为Primary,且已经完全连接并准备好

5、启动PXC集群中其它所有节点

[root@centos79-mysql02 ~]# systemctl start mysql

[root@centos79-mysql03 ~]# systemctl start mysql

6、查看集群状态,验证集群是否成功

# 在任意节点,查看集群状态
mysql> show variables like 'wsrep_node_name';
+-----------------+--------------------+
| Variable_name   | Value              |
+-----------------+--------------------+
| wsrep_node_name | pxc-cluster-node-1 |
+-----------------+--------------------+
1 row in set (0.00 sec)

mysql> show variables like 'wsrep_node_address';
+--------------------+--------------+
| Variable_name      | Value        |
+--------------------+--------------+
| wsrep_node_address | 192.168.1.21 |
+--------------------+--------------+
1 row in set (0.00 sec)

mysql> show variables like 'wsrep_on';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wsrep_on      | ON    |
+---------------+-------+
1 row in set (0.00 sec)

mysql> show status like 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+
1 row in set (0.00 sec)

# 在任意节点查看数据库
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

# 在任意节点创建数据库
mysql> create database testdb1;
Query OK, 1 row affected (0.00 sec)

# 在其他节点上查看数据库
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testdb1            |
+--------------------+
5 rows in set (0.00 sec)

# 利用Xshell软件,同时在三个节点数据库,在其中一个节点成功
mysql> create database testdb2;
Query OK, 1 row affected (0.00 sec)

# 在其它节点都提示失败
mysql> create database testdb2;
ERROR 1007 (HY000): Can't create database 'testdb2'; database exists

7、在PXC集群中加入节点

一个节点加入到Galera集群有两种情况:新节点加入集群、暂时离组的成员再次加入集群

1)新节点加入Galera集群
新节点加入集群时,需要从当前集群中选择一个Donor节点来同步数据,也就是所谓的state_snapshot_tranfer(SST)过程。SST同步数据的方式由选项wsrep_sst_method决定,一般选择的是xtrabackup。
必须注意,新节点加入Galera时,会删除新节点上所有已有数据,再通过xtrabackup(假设使用的是该方式)从Donor处完整备份所有数据进行恢复。所以,如果数据量很大,新节点加入过程会很慢。而且,在一个新节点成为Synced状态之前,不要同时加入其它新节点,否则很容易将集群压垮。
如果是这种情况,可以考虑使用wsrep_sst_method=rsync来做增量同步,既然是增量同步,最好保证新节点上已经有一部分数据基础,否则和全量同步没什么区别,且这样会对Donor节点加上全局readonly锁。

2)旧节点加入Galera集群
如果旧节点加入Galera集群,说明这个节点在之前已经在Galera集群中呆过,有一部分数据基础,缺少的只是它离开集群时的数据。这时加入集群时,会采用IST(incremental snapshot transfer)传输机制,即使用增量传输。
但注意,这部分增量传输的数据源是Donor上缓存在GCache文件中的,这个文件有大小限制,如果缺失的数据范围超过已缓存的内容,则自动转为SST传输。如果旧节点上的数据和Donor上的数据不匹配(例如这个节点离组后人为修改了一点数据),则自动转为SST传输。

# 在PXC集群中再加一台新的主机PXC4:192.168.1.24
[root@centos79-mysql04 ~]# yum install -y Percona-XtraDB-Cluster-57


[root@centos79-mysql04 ~]# grep -Ev "^#|^$" /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_address=gcomm://192.168.1.21,192.168.1.22,192.168.1.23,192.168.1.24
binlog_format=ROW
default_storage_engine=InnoDB
wsrep_slave_threads= 8
wsrep_log_conflicts
innodb_autoinc_lock_mode=2
wsrep_node_address=192.168.1.24
wsrep_cluster_name=pxc-cluster
wsrep_node_name=pxc-cluster-node-4
pxc_strict_mode=ENFORCING
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth="sstuser:s3cretPass"

[root@centos79-mysql04 ~]# systemctl start mysql


[root@centos79-mysql04 ~]# mysql -uroot -p123456

mysql> show status like 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 4     |
+--------------------+-------+
1 row in set (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testdb1            |
| testdb2            |
+--------------------+
6 rows in set (0.00 sec)

# 将其它节点的配置文件加以修改
[root@centos79-mysql01 ~]# vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
wsrep_cluster_address=gcomm://192.168.1.21,192.168.1.22,192.168.1.23,192.168.1.24
[root@centos79-mysql02 ~]# vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
[root@centos79-mysql03 ~]# vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf

8、在PXC集群中修复故障节点

# 在除第一个启动节点外的任意节点停止服务
[root@centos79-mysql04 ~]# systemctl stop mysql

# 在其他任意节点查看,创建新数据库
mysql> show status like 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+
1 row in set (0.00 sec)

mysql> create database testdb3;
Query OK, 1 row affected (0.00 sec)

mysql> create database testdb4;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testdb1            |
| testdb2            |
| testdb3            |
| testdb4            |
+--------------------+
8 rows in set (0.00 sec)

# 恢复节点服务,数据同步
[root@centos79-mysql04 ~]# systemctl start mysql

[root@centos79-mysql04 ~]# mysql -uroot -p123456

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testdb1            |
| testdb2            |
| testdb3            |
| testdb4            |
+--------------------+
8 rows in set (0.00 sec)
# 在第一个启动的节点停止服务
[root@centos79-mysql01 ~]# systemctl stop mysql@bootstrap.service

# 在其他任意节点查看,创建新数据库
mysql> show status like 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+
1 row in set (0.00 sec)

mysql> create database testdb5;
Query OK, 1 row affected (0.01 sec)

mysql> create database testdb6;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testdb1            |
| testdb2            |
| testdb3            |
| testdb4            |
| testdb5            |
| testdb6            |
+--------------------+
10 rows in set (0.00 sec)

# 恢复节点服务,数据同步
[root@centos79-mysql01 ~]# systemctl start mysql@bootstrap.service
Job for mysql@bootstrap.service failed because the control process exited with error code. See "systemctl status mysql@bootstrap.service" and "journalctl -xe" for details.

[root@centos79-mysql01 ~]# systemctl start mysql

[root@centos79-mysql01 ~]# mysql -uroot -p123456

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testdb1            |
| testdb2            |
| testdb3            |
| testdb4            |
| testdb5            |
| testdb6            |
+--------------------+
10 rows in set (0.00 sec)

9、PXC节点的上限与下线

# 如果集群整体全部安全下线,则根据几点的下线顺序,第一个启动最后下线的节点即可
systemctl start mysql@bootstrap

# 如果集群中还有正常运行的节点,其他节点只需按普通节点上线即可
systemctl start mysql

# 某节点能否作为首节点启动,可以通过查看 grastate.dat 文件得知
# safe_to_bootstrap 的值为 0 时不能作为首节点启动,为1时可以作为首节点启动
[root@centos79-mysql01 ~]# cat /var/lib/mysql/grastate.dat
# GALERA saved state
version: 2.1
uuid:    70da195c-698f-11ed-9532-17f5f0cc77dd
seqno:   11
safe_to_bootstrap: 0

# 如果PXC节点都是同时意外退出的,safe_to_bootstrap都为 0,则需要修改grastate.dat文件
[root@centos79-mysql01 ~]# vim /var/lib/mysql/grastate.dat
# GALERA saved state
version: 2.1
uuid:    70da195c-698f-11ed-9532-17f5f0cc77dd
seqno:   11
safe_to_bootstrap: 1
# 修改完再作为第一个节点启动,启动成功后按续启动其他节点
[root@centos79-mysql01 ~]# systemctl start mysql@bootstrap.service
[root@centos79-mysql02 ~]# systemctl start mysql
[root@centos79-mysql03 ~]# systemctl start mysql
[root@centos79-mysql04 ~]# systemctl start mysql

# 查看集群状态以及数据状态 

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享