搭建PXC MySQL5.7环境集群

参考:

https://www.cnblogs.com/f-ck-need-u/p/9364877.html

 https://www.percona.com/doc/percona-xtradb-cluster/5.7/index.html  ---官方帮助文档写的还是比较详细的,只不过文档是使用的Yum安装,可能是网络问题,我本地一直装不上去,使用的是解压缩的方式进行安装

一些PXC特性,安装步骤,其它详细说明,官文帮助文档都有写,有空可以详细看一下。

 

本地环境:

192.168.150.201    pxc1

192.168.150.202    pxc2

192.168.150.203    pxc3

 

1、安装依赖包,卸载mysql mariadb等,调整环境

关掉防火墙,第一次搭建时忘记关了,导致启动第二个节点时一直报错,加入不到集群中

systemctl stop   firewalld
service iptables stop

关闭selinux,需要重启

vi /etc/selinux/config 
修改
SELINUX=disabled

查看是否有残留mysql或mariadb,有的话先卸载掉。

rpm -qa|grep mysql
rpm -qa|grep mariadb

安装RPM依赖

yum install -y perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perl-Time-HiRes.x86_64 socat

 

 

2、安装PXC

https://www.percona.com/downloads/Percona-XtraDB-Cluster-57/LATEST/

Software  选择:Linux-Generic,下载通用安装包

 

解压缩

tar xvf  Percona-XtraDB-Cluster-5.7.31-rel34-45.3.Linux.x86_64.glibc2.12.tar.gz -C /usr/local/

 

重命名

mv Percona-XtraDB-Cluster-5.7.31-rel34-45.3.Linux.x86_64.glibc2.12/ mysql

创建data目录

mkdir -p /usr/local/mysql/data/

初始化数据库

/usr/local/mysql/bin/mysqld --initialize --datadir=/usr/local/mysql/data --basedir=/usr/local/mysql --user=root

记住输出的这行日志,这里保存的是密码

2020-11-08T00:02:34.090014Z 1 [Note] A temporary password is generated for root@localhost: O;#X9tVOfQ=t

先简单修改/etc/my.cnf配置文件,后面还要再改一次

[mysqld]
#datadir=/var/lib/mysql
#socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

#[mysqld_safe]
log-error=/usr/local/mysql/mysqld.log
pid-file=/usr/local/mysql/mysql.pid

#
# include all files from the config directory
#
datadir=/usr/local/mysql/data
basedir=/usr/local/mysql
socket=/tmp/mysql.sock

 

启动数据库

/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=root

 

登录数据库

/usr/local/mysql/bin/mysql -uroot -p -S /tmp/mysql.sock

 

修改root密码

alter user root@localhost identified by 123456

创建sstuser用户,在集群中新节点加入时,通过SST方式同步数据时,需要用到这个用户,配置文件中也会用到,host一定是localhost,

之前参考过网上的精准授权语句,但在新节点加入集群时报错sstuser权限不足,暂时没有分析缺少哪个权限,简单粗暴的全加上了。

create user sstuser@localhost identified by 123456;
grant all privileges on *.* to  sstuser@localhost;

将/usr/local/mysql/bin 加入到path环境变量中

vi ~/.bash_profile
编辑
PATH=$PATH:$HOME/bin:/usr/local/mysql/bin
保存后,生效下这个文件
source ~/.bash_profile

为mysqld做软链接

cd /usr/usbin
ln -s /usr/local/mysql/bin/mysqld mysqld

安装innobackup 2.4

下载地址
https://www.percona.com/downloads/Percona-XtraBackup-2.4/LATEST/

yum install https://www.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.20/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.20-1.el7.x86_64.rpm

正规情况下应该添加mysql用户,并且为/usr/local/mysql目录授权mysql用户组,

由于是测试,我基本都是用root用户启动的mysql进程

useradd mysql
chown -R mysql.mysql /usr/local/mysql

 

关闭数据库命令如下,

./mysqladmin -uroot -p123456 -S /tmp/mysql.socket shutdown

 

-------------------------------------------------------------------------------------------------------

-------------------------第2 大步骤,三台机器都要操作一遍。----------------------------

-------------------------------------------------------------------------------------------------------

 

3、修改my.cnf配置文件

说明:

log-bin=mysql-bin   --开启binlog
log_slave_updates   --备库也写同步过来的binlog

server_id=203       ----server_id,每个实例都唯一
wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so     ----指定galera库
wsrep_cluster_name=pxc-cluster                           ----PXC集群名称,可以自己修改
wsrep_cluster_address=gcomm://192.168.150.201,192.168.150.202,192.168.150.203         ----集群三台机器的IP地址
wsrep_node_name=pxc3                                     ---本节点名称,集群中唯一
wsrep_node_address=192.168.150.203                       ---本节点IP地址,就是本服务器的IP地址。
wsrep_sst_method=xtrabackup-v2                           ---指定SST同步方式
wsrep_sst_auth=sstuser:123456                            ---xtrabackup软件需要用到的用户名和密码,之前已经创建了。
pxc_strict_mode=ENFORCING                                ----PXC运行模式,官方建议就是ENFORCING
binlog_format=ROW                                        ---binlog模式必须为row
default_storage_engine=InnoDB                            ---默认存储引擎为Innodb,PXC只支持innodb表的同步。
innodb_autoinc_lock_mode=2                               ---自增锁模式,必须为2

 

 

192.168.150.201,修改my.cnf配置文件,添加如下内容

log-bin=mysql-bin
log_slave_updates

server_id=201
wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so
wsrep_cluster_name=pxc-cluster
wsrep_cluster_address=gcomm://192.168.150.201,192.168.150.202,192.168.150.203
wsrep_node_name=pxc1
wsrep_node_address=192.168.150.201
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=sstuser:123456
pxc_strict_mode=ENFORCING
binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2

 

192.168.150.202,修改my.cnf配置文件,添加如下内容 

log-bin=mysql-bin
log_slave_updates

server_id=202
wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so
wsrep_cluster_name=pxc-cluster
wsrep_cluster_address=gcomm://192.168.150.201,192.168.150.202,192.168.150.203
wsrep_node_name=pxc2
wsrep_node_address=192.168.150.202
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=sstuser:123456
pxc_strict_mode=ENFORCING
binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2

 

 

192.168.150.203,修改my.cnf配置文件,添加如下内容 

log-bin=mysql-bin
log_slave_updates

server_id=203
wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so
wsrep_cluster_name=pxc-cluster
wsrep_cluster_address=gcomm://192.168.150.201,192.168.150.202,192.168.150.203
wsrep_node_name=pxc3
wsrep_node_address=192.168.150.203
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=sstuser:123456
pxc_strict_mode=ENFORCING
binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2

 

 

4、

先启动201节点,因为是启动集群中第个主节点,所以要加--wsrep-new-cluster 参数

mysqld --defaults-file=/etc/my.cnf --wsrep-new-cluster --user=root

再启动202节点

mysqld --defaults-file=/etc/my.cnf  --user=root

再启动203节点

mysqld --defaults-file=/etc/my.cnf  --user=root

 

PXC集群,启动成功,

登录201节点,执行show status like ‘%wsrep%‘; 可以查看集群状态,

mysql>  show status like %wsrep%;
+----------------------------------+----------------------------------------------------------------+
| Variable_name                    | Value                                                          |
+----------------------------------+----------------------------------------------------------------+
| wsrep_local_state_uuid           | 85718ad1-2276-11eb-a1ac-cbb3408042a7                           |
| wsrep_protocol_version           | 9                                                              |
| wsrep_last_applied               | 8                                                              |
| wsrep_last_committed             | 8                                                              |
| wsrep_replicated                 | 3                                                              |
| wsrep_replicated_bytes           | 720                                                            |
| wsrep_repl_keys                  | 4                                                              |
| wsrep_repl_keys_bytes            | 104                                                            |
| wsrep_repl_data_bytes            | 412                                                            |
| wsrep_repl_other_bytes           | 0                                                              |
| wsrep_received                   | 8                                                              |
| wsrep_received_bytes             | 782                                                            |
| wsrep_local_commits              | 0                                                              |
| wsrep_local_cert_failures        | 0                                                              |
| wsrep_local_replays              | 0                                                              |
| wsrep_local_send_queue           | 0                                                              |
| wsrep_local_send_queue_max       | 1                                                              |
| wsrep_local_send_queue_min       | 0                                                              |
| wsrep_local_send_queue_avg       | 0.000000                                                       |
| wsrep_local_recv_queue           | 0                                                              |
| wsrep_local_recv_queue_max       | 2                                                              |
| wsrep_local_recv_queue_min       | 0                                                              |
| wsrep_local_recv_queue_avg       | 0.125000                                                       |
| wsrep_local_cached_downto        | 5                                                              |
| wsrep_flow_control_paused_ns     | 0                                                              |
| wsrep_flow_control_paused        | 0.000000                                                       |
| wsrep_flow_control_sent          | 0                                                              |
| wsrep_flow_control_recv          | 0                                                              |
| wsrep_flow_control_interval      | [ 173, 173 ]                                                   |
| wsrep_flow_control_interval_low  | 173                                                            |
| wsrep_flow_control_interval_high | 173                                                            |
| wsrep_flow_control_status        | OFF                                                            |
| wsrep_cert_deps_distance         | 1.000000                                                       |
| wsrep_apply_oooe                 | 0.000000                                                       |
| wsrep_apply_oool                 | 0.000000                                                       |
| wsrep_apply_window               | 1.000000                                                       |
| wsrep_commit_oooe                | 0.000000                                                       |
| wsrep_commit_oool                | 0.000000                                                       |
| wsrep_commit_window              | 1.000000                                                       |
| wsrep_local_state                | 4                                                              |
| wsrep_local_state_comment        | Synced                                                         |
| wsrep_cert_index_size            | 3                                                              |
| wsrep_cert_bucket_count          | 22                                                             |
| wsrep_gcache_pool_size           | 2672                                                           |
| wsrep_causal_reads               | 0                                                              |
| wsrep_cert_interval              | 0.000000                                                       |
| wsrep_open_transactions          | 0                                                              |
| wsrep_open_connections           | 0                                                              |
| wsrep_ist_receive_status         |                                                                |
| wsrep_ist_receive_seqno_start    | 0                                                              |
| wsrep_ist_receive_seqno_current  | 0                                                              |
| wsrep_ist_receive_seqno_end      | 0                                                              |
| wsrep_incoming_addresses         | 192.168.150.202:3306,192.168.150.201:3306,192.168.150.203:3306 |
| wsrep_cluster_weight             | 3                                                              |
| wsrep_desync_count               | 0                                                              |
| wsrep_evs_delayed                |                                                                |
| wsrep_evs_evict_list             |                                                                |
| wsrep_evs_repl_latency           | 0/0/0/0/0                                                      |
| wsrep_evs_state                  | OPERATIONAL                                                    |
| wsrep_gcomm_uuid                 | 991e82fd-2290-11eb-b27e-cef2a67b4d13                           |
| wsrep_cluster_conf_id            | 7                                                              |
| wsrep_cluster_size               | 3                                                              |
| wsrep_cluster_state_uuid         | 85718ad1-2276-11eb-a1ac-cbb3408042a7                           |
| wsrep_cluster_status             | Primary                                                        |
| wsrep_connected                  | ON                                                             |
| wsrep_local_bf_aborts            | 0                                                              |
| wsrep_local_index                | 0                                                              |
| wsrep_provider_name              | Galera                                                         |
| wsrep_provider_vendor            | Codership Oy <info@codership.com>                              |
| wsrep_provider_version           | 3.45(ra60e019)                                                 |
| wsrep_ready                      | ON                                                             |
+----------------------------------+----------------------------------------------------------------+
71 rows in set (0.07 sec)

 

参数说明

    1)集群完整性检查:

        wsrep_cluster_state_uuid:在集群所有节点的值应该是相同的,有不同值的节点,说明其没有连接入集群.

        wsrep_cluster_conf_id:正常情况下所有节点上该值是一样的.如果值不同,说明该节点被临时”分区”了.当节点之间网络连接恢复的时候应该会恢复一样的值.

        wsrep_cluster_size:如果这个值跟预期的节点数一致,则所有的集群节点已经连接.

        wsrep_cluster_status:集群组成的状态.如果不为”Primary”,说明出现”分区”或是”split-brain”状况.

 

    2)节点状态检查:

        wsrep_ready: 该值为ON,则说明可以接受SQL负载.如果为Off,则需要检查wsrep_connected.

        wsrep_connected: 如果该值为Off,且wsrep_ready的值也为Off,则说明该节点没有连接到集群.(可能是wsrep_cluster_address或wsrep_cluster_name等配置错造成的.具体错误需要查看错误日志)

        wsrep_local_state_comment:如果wsrep_connected为On,但wsrep_ready为OFF,则可以从该项查看原因.

 

    3)复制健康检查:

        wsrep_flow_control_paused:表示复制停止了多长时间.即表明集群因为Slave延迟而慢的程度.值为0~1,越靠近0越好,值为1表示复制完全停止.可优化wsrep_slave_threads的值来改善.

        wsrep_cert_deps_distance:有多少事务可以并行应用处理.wsrep_slave_threads设置的值不应该高出该值太多.

        wsrep_flow_control_sent:表示该节点已经停止复制了多少次.

        wsrep_local_recv_queue_avg:表示slave事务队列的平均长度.slave瓶颈的预兆.

        最慢的节点的wsrep_flow_control_sent和wsrep_local_recv_queue_avg这两个值最高.这两个值较低的话,相对更好.

 

    4)检测慢网络问题:

        wsrep_local_send_queue_avg:网络瓶颈的预兆.如果这个值比较高的话,可能存在网络瓶颈

 

    5)冲突或死锁的数目:

        wsrep_last_committed:最后提交的事务数目

        wsrep_local_cert_failures和wsrep_local_bf_aborts:回滚,检测到的冲突数目

 

做写入测试,

201节点

create database ceshi;

202节点

create table t1(id int primary key auto_increment,name varchar(200));

203节点,可以看到创建的t1,也可以写入数据。

ysql> use ceshi;
Database changed
mysql> show tables;
+-----------------+
| Tables_in_ceshi |
+-----------------+
| t1              |
+-----------------+
1 row in set (0.00 sec)

5、

局限性

1.目前的复制仅仅支持InnoDB存储引擎。任何写入其他引擎的表,包括mysql.*表将不会复制。但是DDL语句会被复制的,因此创建用户将会被复制,但是insert into mysql.user…将不会被复制的。

2.DELETE操作不支持没有主键的表。没有主键的表在不同的节点顺序将不同,如果执行SELECT…LIMIT… 将出现不同的结果集。

3.在多主环境下LOCK/UNLOCK TABLES不支持。以及锁函数GET_LOCK(), RELEASE_LOCK()…

4.查询日志不能保存在表中。如果开启查询日志,只能保存到文件中。

5.允许最大的事务大小由wsrep_max_ws_rows和wsrep_max_ws_size定义。任何大型操作将被拒绝。如大型的LOAD DATA操作。

6.由于集群是乐观的并发控制,事务commit可能在该阶段中止。如果有两个事务向在集群中不同的节点向同一行写入并提交,失败的节点将中止。对于集群级别的中止,集群返回死锁错误代码(Error: 1213 SQLSTATE: 40001 (ER_LOCK_DEADLOCK)).

7.XA事务不支持,由于在提交上可能回滚。

8.整个集群的写入吞吐量是由最弱的节点限制,如果有一个节点变得缓慢,那么整个集群将是缓慢的。为了稳定的高性能要求,所有的节点应使用统一的硬件。

9.集群节点建议最少3个。2个也可以运行,但是官方不推荐这么做,因为3个节点是为了预防脑裂。

10.如果DDL语句有问题将破坏集群。建议使用pt-online-schema-change操作DDL。

 

 

6、

名词:
    WS:write set 写数据集
    IST: Incremental State Transfer 增量同步
    SST:State Snapshot Transfer 全量同步 
    UUID:节点状态改变及顺序的唯一标识。
    GTID:Global Transaction ID ,由UUID和偏移量组成。wsrep api 中定义的集群内全局事务id。

 

状态机变化阶段:
     1.OPEN: 节点启动成功,尝试连接到集群,如果失败则根据配置退出或创建新的集群
     2.PRIMARY: 节点处于集群PC中,尝试从集群中选取donor进行数据同步
     3.JOINER: 节点处于等待接收/接收数据文件状态,数据传输完成后在本地加载数据
     4.JOINED: 节点完成数据同步工作,尝试保持和集群进度一致
     5.SYNCED:节点正常提供服务:数据的读写,集群数据的同步,新加入节点的sst请求
     6.DONOR:节点处于为新节点准备或传输集群全量数据状态,对客户端不可用。

 

 

PXC会使用大概是4个端口号
3306 数据库对外服务的端口号
4444 请求SST SST: 指数据一个镜象传输 xtrabackup , rsync ,mysqldump 
4567 : 组成员之间进行沟通的一个端口号
4568 : 传输IST用的。相对于SST来说的一个增量。

搭建PXC MySQL5.7环境集群

上一篇:TensorFlow数据集项目


下一篇:OC面试题 - load与initialize