mysql高可用集群PXC
作者:向前的步伐 / 发表: 2020年2月20日 15:26 / 更新: 2020年2月20日 15:26 / mysql / 阅读量:987
一、简介
PXC是mysql的套高可用集群的解决方案,跟传统的主从复制集群相比,PXC解决了数据复制延迟的问题,基本上可以达到实时同步,而且节点之间的关系是对等的。PXC最关注的是数据的一致性,对待事务的行为,要么在所有节点上执行,要么都不执行,它的实现机制决定了它对待一致性非常严格,这也能非常完美的保证mysql集群的数据一致性。
PXC常用端口:
- 3306:数据库对外的端口号。
- 4444:请求SST的端口。
- 4567:组成员之间进行沟通的一个端口号。
- 4568:用于传输IST。
注释:
SST(State Snapshot Transfer): 全量传输。
IST(Incremental state Transfer):增量传输。
二、PXC的特性和优缺点
特性:
- 完全兼容mysql。
- 同步复制,事务要么所有节点提交,要么都不提交。
- 多主复制,可以在任意节点上进行写操作。
- 在从服务器上并行应用事件,真正意义上的并行复制。
- 节点自动配置,数据一致性,不再是异步复制。
- 故障切换,因为支持多点写数据,所以数据库故障时,可以很容易的进行故障切换。
- 自动节点克隆,在新增节点或停机维护时,增量数据或者基础数据不需要人工备份,集群会自动拉取在线节点的数据,最终保证数据的一致性。
优点:
- 强一致性,无同步延迟。
缺点:
- 复制只innodb引擎,其他的存储引擎的更改不复制。
- 写入的效率取决于集群中最慢的节点。
三、PXC和主从复制的区别
主从复制:
- 数据同步是单向的,master负责写,然后异步复制在slave;如果slave写入数据,不会复制给master。
- 异步复制,从和主无法保证数据的一致性。
PXC:
- 数据同步是双向的,任何一个节点的mysql写入数据,都会同步到其他节点。
- 同步复制,事务在所有集群节点中同时提交,要么同时不提交。
四、安装PXC
首先准备3台机器:192.168.0.221,192.168.0.222,192.168.0.223。
1,更新percona-release的yum源:
rpm -Uvh https://www.percona.com/redir/downloads/percona-release/redhat/0.1-6/percona-release-0.1-6.noarch.rpm
2,移除依赖:
yum -y remove mariadb-libs
3,安装依赖:
yum -y install socat
yum -y install libev
yum -y install perl-Digest-MD5
yum -y install perl-Digest-MD5 perl-Digest-SHA perl-Digest-SHA1
yum -y install qpress --nogpgcheck
注:这里不使用--nogpgcheck安装,会出现yum安装错误。这个问题是用户仓库中的rpm包有时候是自己制作的,或者从第三方获取,这个时候安装就会有问题。yum安装的时候会检查是否是官方发布的,当然可以用过添加--nogpgcheck来强制安装。
4,安装percona组件:
yum -y install Percona-XtraDB-Cluster-shared-57 --nogpgcheck
yum -y install Percona-XtraDB-Cluster-shared-compat-57 --nogpgcheck
yum -y install percona-xtrabackup-24 --nogpgcheck
yum -y install Percona-XtraDB-Cluster-client-57 --nogpgcheck
yum -y install Percona-XtraDB-Cluster-server-57 --nogpgcheck
yum -y install Percona-XtraDB-Cluster-57 --nogpgcheck
五、配置mysql集群
修改/etc/my.cnf文件:
#
# The Percona XtraDB Cluster 5.7 configuration file.
#
#
# * IMPORTANT: Additional settings that can override those from this file!
# The files must end with '.cnf', otherwise they'll be ignored.
# Please make any edits and changes to the appropriate sectional files
# included below.
#
[mysqld]
datadir=/mysql
port=3306
#socket=/mysql/mysql-node1.sock #socket不要指定,配了反而会出问题,让它自己去生成/var/lib/mysql/mysql.sock
### 可以不指定pid-file路径,默认生成路径为 $datadir/$hostname.pid ####
pid-file=/mysql/mysql-node1.pid
### 建议指定log-error路径,不指定log-error的话,也会生成一个 $datadir/$hostname.err,但该文件中是没有临时密码的,导致无法登录数据库 ####
log-error=/mysql/mysql-node1.err
default_storage_engine=InnoDB
character-set-server=utf8
log_timestamps=SYSTEM #默认是UTC,需要我们指定为SYSTEM
max_connections=5000
#server-id 服务器唯一ID,默认是1,一般取IP最后一段
server-id=221
#启用二进制日志
log-bin=bin-log
binlog_format=ROW
#主键自增长不锁表,只能设置为2,设置为0或1时会无法正确处理死锁问题
innodb_autoinc_lock_mode=2
expire_logs_days=7
log-slave-updates=1
#跳过DNS解析
#跳过DNS主机名查找,提高响应速度
skip-name-resolve
#跳过主机名缓存
skip-host-cache
wsrep_provider=/usr/lib64/libgalera_smm.so
wsrep_cluster_name=pxc-cluster
wsrep_node_name=node1
# Galera不指定端口的话,默认 4567
wsrep_cluster_address=gcomm://192.168.0.221:5020,192.168.0.222:5020,192.168.0.223:5020
wsrep_provider_options="base_port=5020;"
wsrep_node_address=192.168.0.221:5020
wsrep_slave_threads=6
#sst syc method
wsrep_sst_method=xtrabackup-v2
#wsrep_sst_method=rsync
#sst user and password
wsrep_sst_auth="sstuser:123456"
#开启普通的sql日志(如果是集群,只开启一个节点即可,保证能有日志查就行了,其他节点可开可不开)
general_log=on #默认为off 关闭 ,开启后会生成 $datadir/$hostname.log 文件,记录执行的每一条sql,就连commit这种sql语句都会记录下来
#添加慢查询日志
#log_output=file #不写的话默认是file.如果想将mysql慢查询日志写入表,则必须明确指定
log_output=table
slow_query_log=on #开启慢查询 #默认是不开启 off
#slow_query_log_file=/mysql/mysql-slow.log #不指定的话,默认值是 $datadir/$hostname-slow.log #指定的话,路径必须指定在 $datadir 目录下,否则设置slow_query_log=on无效
long_query_time=2 # 所有超过2s的sql都被记录下来
########如果需要还可以开启查询缓存query_cache,默认是不开启##########
上面配置的是192.168.0.221服务器的配置文件,其他节点的配置文件类似,只需要修改上对应的IP,node name,server id即可。
六、启动PXC集群
1,启动第一个节点:
启动节点前,要先关闭selinux校验:
setenforce 0
sed -i "s/^SELINUX\=enforcing/SELINUX\=disabled/g" /etc/selinux/config
第一个节点,必须使用下面的命令启动集群:
systemctl start mysql@bootstrap.service
然后找到mysql的初始化密码:
grep 'temporary password' /mysql/mysql-node1.err
登陆mysql修改root密码:
alter user root@localhost identified by '123456';
接着创建用于同步数据的sstuser用户并授权,密码要和配置文件中一致(wsrep_sst_auth="sstuser:123456"):
create user 'sstuser'@'localhost' identified by '123456';
grant reload,lock tables,process,replication client on *.* to sstuser@localhost;
flush privileges;
查看当前集群的状态:
show status like 'wsrep%';
参数wsrep_cluster_size值为1,显示当前PXC集群只有一个节点。在初始化集群过程中,要注意的是第一个节点的启动方式。
2,启动其他节点:
其他的节点只要按照正常启动mysql即可,不需要使用bootstrap启动方式:
systemctl start mysqld
注:在启动一个节点成功后再启动另外一个节点,不要同时进行。
启动后会创建/mysql/目录和生成相应的mysql文件,密码自动和第一个节点同步,可以使用之前设置的密码直接登陆mysql。
这时,我们再看下集群的信息:
show status like 'wsrep%';
wsrep_incoming_addresses的值为192.168.0.221:3306, 192.168.0.222:3306, 192.168.0.223:3306。
wsrep_cluster_size的值为 3,说明此时的集群节点数为3。
如果这个过程节点2或者节点3启动不成功,可以从几个方面排查问题:
1)配置文件错误。
2)防火墙没有开启相应的端口,比如5020。
3)忘记进行授权账号。
4)xtrabackup没有安装或者安装有问题。
节点都启动成功后,会按照配置自动加入PXC集群,这时可以将节点1的mysql关闭,再按正常的方式启动mysql:
systemctl stop mysql@bootstrap.service
systemctl start mysqld
登陆mysql后,查看集群的状态是否还都是3个节点:
show status like 'wsrep_clu%';
3,同步测试:
在节点1创建数据库testdb1:
create databse testdb1;
在节点2创建数据库testdb2:
create databse testdb2;
在节点3查看所有的数据库:
show databases;
可以看出,PXC集群内的节点都可以写,同时会同步的其他的节点的数据库中去。
现在可以尝试停掉节点1,节点2的mysql,然后在节点3中写入数据,这时再启动节点1和节点2,数据就会同步到节点1和节点2中。
由此可见,当集群的某节点掉线之后,其他节点还是可以继续工作的,新写入的数据会在掉线的节点重新连接上的时候,完成同步。
针对重新上线的节点PXC有2种方式完成数据传输:SST和IST。
SST通常是在新节点加入到PXC集群的时候,从其他的节点复制全部数据,在PXC通常有3种可用的方式完成SST:mysqldump, rsync, xtrabackup。
mysqldump和rsync的缺点就是在数据传输的过程中,PXC集群会变成只读,SST会对数据库加只读锁。而使用xtrabackup则不需要在数据同步过程施加锁,仅仅同步.frm文件,类似于常规的备份。
IST用于只将数据的增量变法从一个节点复制到另外一个节点。
虽然SST使用xtrabackup不加锁,但SST仍可能扰乱服务正常运行。而IST不会,如果一个节点掉线的时间比较短,再次上线只会复制增量部分。IST是使用缓存机制实现的,而且缓存区大小可设置。所以只有当要传输的数据小于设置的缓存大小时,才可以使用IST,否则必须使用SST。
4,PXC所有节点掉线后恢复方式:
当集群中所有节点都掉线了,此时mysql节点无法加入到集群中,需要先停止掉所有节点的mysql(如果存在僵尸进程的话)。然后删除第一个节点的/mysql目录下的grastate.dat、galera.cache两个文件(其他节点不用删除),然后再使用第一个节点以初始化的方式启动集群:
systemctl start mysql@bootstrap.service
然后再将另外2个节点接入到集群即可。
七、PXC数据备份与还原
1,全量备份:
innobackupex --user=root --password=123456 --socket=/var/lib/mysql/mysql.sock /home/backup/full
2,备份还原:
先停掉mysql服务并整理备份:
systemctl stop mysql
innobackupex --apply-log --redo-only /home/backup/full/2020-02-20_23-05-52
接着清空数据库:
rm -rf /mysql/*
再恢复数据:
innobackupex --defaults-file=/etc/my.cnf --copy-back /home/backup/full/2020-02-20_23-05-52
然后修复属主属组关系:
chown -R mysql:mysql /mysql/
最后启动mysql服务:
systemctl start mysql
可以查看原有的数据,确保数据都已经恢复。