个人博客

mysql高可用集群PXC

一、简介

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

picture

登陆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%';

picture

参数wsrep_cluster_size值为1,显示当前PXC集群只有一个节点。在初始化集群过程中,要注意的是第一个节点的启动方式。

2,启动其他节点:

其他的节点只要按照正常启动mysql即可,不需要使用bootstrap启动方式:

systemctl start mysqld

注:在启动一个节点成功后再启动另外一个节点,不要同时进行。

启动后会创建/mysql/目录和生成相应的mysql文件,密码自动和第一个节点同步,可以使用之前设置的密码直接登陆mysql。

这时,我们再看下集群的信息:

show status like 'wsrep%';

picture

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%';

picture

3,同步测试:

在节点1创建数据库testdb1:

create databse testdb1;

在节点2创建数据库testdb2:

create databse testdb2;

在节点3查看所有的数据库:

show databases;

picture

可以看出,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

可以查看原有的数据,确保数据都已经恢复。

相关标签
回到顶部