搭建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来说的一个增量。