欢迎访问我的博客,你的支持,是我最大的动力!

MySQL王者晋级之路(七)高可用集群之Keepalived双主、PXC

Mysql-笔记 小马奔腾 6189℃ 评论
目录:
[显示]

Keepalived+双主架构

keepalived使用vip,利用keepalived自带的服务监控和自定义脚本实现mysql故障时自动切换

Keepalived

keepalived是基于vrrp协议的,虚拟冗余路由协议。master会向backup节点发送广播信号,当backup节点接收不到master发送的vrrp包时,会认为master宕机,这时会根据vrrp的优先级选举一个backup充当master,该master会持有vip,而vip是对处应用连接的ip,从而保证业务的正常运行

优先级,用1<254表示,数字越小优先级超低。当值为0时,表示放弃持有vip,值为255时,当前master优先级最高并持有vip

vrid,虚拟路由标识,同组机器内vrid必须一致,通常用0~255标识

官网:http://www.keepalived.org/
当前最新版本:http://www.keepalived.org/software/keepalived-2.0.5.tar.gz

keepalived启动后,会有watch dog、vrrp、health-check三个进程,watch dog负责监控vrrp和health-check进程,vrrp负责当master不可用时通过vrrp切换到backup服务器,health-check检测服务器健康状态

集群搭建思路

搭建思路:
1)需要两台MySQL服务器,互为主从,都可读写。一台负责写入,一台充当备用
2)安装Keepalived软件,yum的就可以
3)整理好Keepalivd配置文件,理清Keepalived三种状态;准备监控MySQL的脚本,便于检测到宕机,从而进行切换
4)两台机器的state都采用backup,且都是nopreempt非抢占模式,避免出现冲突和发生脑裂
注意事项:
1)切换机制要合理,避免切换不成功的现象发生
2)从库配置尽量与主库一致,性能不能太差,避免切换后的新主库影响线上业务
3)延迟问题,可以使用PXC完成实时同步功能,基本上可以实现没有延迟
4)Keepalived无法解决脑裂问题,因此在进行服务异常判断时,可以修改判断脚本,通过第三方节点补充检测来决定是否进行切换,可降低发生脑裂、冲突现象
5)设置节点状态时,都设置成backup状态且非抢占模式,通过优先级决定谁是主库,避免脑裂和冲突
6)云平台环境上,此架构可能不能搭建,因为VRRP协议可能被禁用

集群部署

结构:
192.168.10.110 主masterA
192.168.10.120 备masterB
192.168.10.100/24 VIP
gtid+row模式

部署过程:
第一步,分别在主备上创建同步复制帐号
create user 'repl'@'192.168.10.%' identified by 'repl123';
grant replication slave on *.* to 'repl'@'192.168.10.%';
第二步,搭建双主
change master to
-> master_host='192.168.10.120',
-> master_user='repl',
-> master_password='repl123',
-> master_auto_position=1;
start slave;
show slave status\G
第三步,在两台机器上安装keepalived软件
相关参考:http://pdf.us/2018/06/12/1311.html
这里安装版本2.0.4
wget https://github.com/hnakamur/keepalived-rpm/releases/download/2.0.4-1/keepalived-2.0.4-1.el7.x86_64.rpm
yum install keepalived-2.0.4-1.el7.x86_64.rpm
rpm -qa|grep keepalived
systemctl start keepalived
systemctl status keepalived
第四步,配置检测MySQL的脚本
通过判断MySQL服务是否宕机,确定停止Keepalived服务进行切换操作
cat /etc/keepalived/checkmysql.sh
create user 'healthcheck'@'192.168.10.%' identified by 'check123';  #不需要授任何权限,仅需执行show status命令
chmod +x /etc/keepalived/checkmysql.sh

第五步,修改Keepalive配置文件
cat /etc/keepalived/keepalived.conf

两台机器都是backup,且都是非抢占模式nopreempt,通过优先级高低判定谁是主。virtual_router_id要保持一致
第六步,启动和测试
启动两台机器的keepalived进程
#/etc/init.d/keepalived start
ip addr add 192.168.10.100/32 dev ens32   #要启动keepalived需要先把vip手动起起来
#ip addr delete 192.168.10.100/32 dev ens32
systemctl start keepalived
#systemctl status keepalived
#systemctl stop keepalived
#netstat -ltunp|grep 3306
#mysqld_safe &
#mysqladmin -uroot -proot123 shutdown
注意,主备checkmysql脚本不能全使用VIP,因为使用VIP后,当数据库宕机时,检测不成功,两台机器keepalived均会关闭
因为检查失败会关闭本端keepalived,所以自动切换只能发生一次
为防止两边keepalived一起退出,可配置主库检查本机mysql,备库检查本机mysql或不做检查
另,keepalived2.0.4在切换时,会打印数百行日志,在2.0.5中做了修复,不建议使用2.0.4版本

PXC

基于Galera协议的高可用集群架构。Galera Cluster是集成了Galera插件的MySQL集群。Galera replication是Codership提供的MySQL数据同步方案,具有高可用性,方便扩展,并可实现多节点间数据同步复制与读写,可保障数据库服务高可用及数据强一致性

基于Galera的高可用方案主要有:MariaDB Galera Cluster和Percona XtraDB Cluster,简称PXC。PXC在生产环境中用得更多且更成熟

PXC是近乎完美的MySQL高可用集群解决方案,最突出的特点是解决了复制延迟问题,基本可以达到实时同步,节点间是对等关系,本身是多主架构。
要搭建PXC至少需要三个MySQL实例,三个实例间不是主从模式,各自为主,三者是对等关系,不分从属,这就是multi-master架构。客户端写入和读取数据可以选择任意一个节点,该架构不共享任何数据,是高冗余架构。

PXC原理

PXC重要端口:
3306,对外服务端口号
4444,请求SST的端口,SST是数据库一个备份全量文件的传输
4567,组成员间进行沟通的端口
4568,传输IST,相对于SST来说的一个增量

客户端发起一个事务,该事务在本地执行,执行完成后要发起提交操作。在提交前,需要将该事务产生的复制写集广播出去,然后获取到一个全局事务ID,并传送到另一节点上。其他节点通过验证合并数据后,发现没有冲突数据,执行apply_cb,commit_cb动作,否则就取消discard此次事务操作。当前节点通过验证后,执行提交,返回OK,如果验证不通过,则执行回滚。
集群中如果某个节点没有验证通过,出现数据冲突,那么该节点会被踢出集群,并执行shutdown关机

PXC架构优缺点

优点:
1)实现集群高可用性和数据强一致性
2)真正的多节点读写的集群方案
3)达到实时同步
4)新加入的节点可以自动部署,无须提供手动备份,维护方便
5)多节点写入,数据库故障切换很容易
缺点:
1)新加入节点开销大,需复制完整数据,sst传输开销太大
2)任何更新事务都需要全局验证通过才会在每个节点上执行,集群性能受限于性能最差的节点
3)多节点并发写时,锁冲突问题比较严重
4)存在写扩大问题,所有节点都会发生写操作
5)只支持InnoDB存储引擎表
6)没有表级别的锁定,执行DDL会把整个集群锁住,且kill不了(建议osc操作)
7)所有表必须有主键,不然操作时会报错

PXC重要概念和重点参数

整个集群节点数最少3个,最大8个。最少3个是为防止脑裂,脑裂的标志是输入任何命令,返回结果都是unknown command。节点在集群中,会因为新节点的加入或者故障,同步失效等发生状态切换
节点状态变化阶段:
open,节点启动成功,尝试连接到集群
primary,节点已加入集群,在新节点加入时,选取donor进行数据同步时会产生的状态
joiner,节点处于等待接收同步文件时的状态
joined,节点完成数据同步工作,尝试保持和集群进度一致
synced,节点正常提供服务的状态,表示已同步完成并和集群进度保持一致
doner,节点处于为新加入的节点提供全量数据时的状态
注:doner节点是数据的贡献者,一个新节点加入集群,doner负责使用SST为新节点传输数据。若数据量大,不建议使用SST全量传输,可以考虑选建立主从关系,再加入集群

PXC有两种数据传输方式:SST全量传输,IST增量传输。SST传输有xtrabackup、mysqldump、rsync三种方法;增量传输方法只有xtrabackup。生产环境中一般数据量不大时,可以使用SST传输,但通常使用xtrabackup方法

搭建PXC集群时,需要在PXC配置文件中设置好如下参数

wsrep_cluster_name  ##标识集群名称
wsrep_cluster_address=gcomm: ##列出集群成员
wsrep_node_address ##当前节点IP
wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so ##指定Galera库
wsrep_sst_method=xtrabackup-v2 ##传输数据的方法
wsrep_sst_auth=sst:zs ##节点的数据库用户帐号和密码

GCache,每个节点缓存当前最新的写集,若有新节点加入,可以把新数据的增量传递给新节点,而不再使用SST方式。涉及参数:
gcache.size 缓存写集的大小,默认128MB,通过wsrep_provider_options参数设置,建议2GB~4GB
gcache.mem_size 代表Gcache中内存缓存的大小,适度调大可以提高整个集群性能
gcache.page_size 若内存不足,直接将写集定入磁盘文件的大小

PXC架构搭建

环境:
192.168.10.110 node1 master1
192.168.10.120 node2 master2
192.168.10.130 node3 master3
三台机器防火墙、selinux关闭、server-id不一样

二进制包方式

设置SELINUX及防火墙
setenforce 0
vi /etc/selinux/config
SELINUX=permissive
防火墙允许端口:3306/4444/4567/4568或关闭防火墙
systemctl disable firewalld && systemctl stop firewalld
依赖

yum install perl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes openssl openssl-devel socat
软件 Percona-XtraDB-Cluster-5.7.22
https://www.percona.com/software/mysql-database/percona-xtradb-cluster
https://www.percona.com/downloads/Percona-XtraDB-Cluster-LATEST/Percona-XtraDB-Cluster-5.7.22-29.26/binary/tarball/Percona-XtraDB-Cluster-5.7.22-rel22-29.26.1.Linux.x86_64.ssl101.tar.gz
#ssl101: for CentOS 6 and CentOS 7
软件 Percona-XtraBackup-2.4.12
https://www.percona.com/software/mysql-database/percona-xtrabackup
https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.12/binary/tarball/percona-xtrabackup-2.4.12-Linux-x86_64.libgcrypt11.tar.gz
https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.12/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm
yum install percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm

节点一192.168.10.110上安装过程
解压软件包并赋予权限
mv Percona-XtraDB-Cluster-5.7.22-rel22-29.26.1.Linux.x86_64.ssl101.tar.gz /usr/local
cd /usr/local/
tar zxf Percona-XtraDB-Cluster-5.7.22-rel22-29.26.1.Linux.x86_64.ssl101.tar.gz
ln -s Percona-XtraDB-Cluster-5.7.22-rel22-29.26.1.Linux.x86_64.ssl101 mysql
groupadd mysql
useradd -g mysql mysql -s /sbin/nologin
chown -R mysql:mysql mysql/
mkdir -p /data/mysql
chown -R mysql:mysql /data/mysql
注入环境变量[可选]
vi /etc/profile 在末尾添加
export PATH=$PATH:/usr/local/mysql/bin
执行source /etc/profile
修改配置文件
vi /etc/my.cnf

初始化数据
cd /usr/local/mysql/bin
./mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql --datadir=/data/mysql/ --user=mysql --initialize
获取初始密码
cat /data/mysql/error.log |grep password
启动第一个节点
cd /usr/local/mysql/support-files
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
修改/etc/init.d/mysql文件【所有节点】
添加环境变量,因为SST时需要执行命令wsrep_sst_xtrabackup-v2
vi /etc/init.d/mysql 第125行
PATH="/sbin:/usr/sbin:/bin:/usr/bin:$basedir/bin:/usr/local/mysql/bin"
systemctl daemon-reload
##注意,启动第一个节点前,先要设置wsrep_cluster_address为空,以便初始化集群,否则集群无法启动
##wsrep_cluster_address=gcomm://
/etc/init.d/mysql bootstrap-pxc
登录修改root密码
./mysql -uroot -p
set password = 'root123';
alter user 'root'@'localhost' password expire never;
use mysql;
update user set host='%' where user='root';
flush privileges;
查看wsrep状态
show status like 'wsrep%';
创建集群sst帐号
CREATE USER 'sstuser'@'localhost' IDENTIFIED BY 'sstpassword';
GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost';
FLUSH PRIVILEGES;
第二个节点、第三个节点
/etc/init.d/mysql start
启用过程中会同步数据,原节点数据会被清空,所以无需设置root帐号,可以使用第一个节点的帐号登录
查看状态
mysql -uroot -proot123
show status like 'wsrep%';

yum方式

设置SELINUX及防火墙
setenforce 0
vi /etc/selinux/config
SELINUX=permissive
防火墙允许端口:3306/4444/4567/4568或关闭防火墙
systemctl disable firewalld && systemctl stop firewalld
YUM安装
yum install http://www.percona.com/downloads/percona-release/redhat/0.1-6/percona-release-0.1-6.noarch.rpm
yum install Percona-XtraDB-Cluster-57
相关软件包
#http://repo.percona.com/release/
Percona-XtraDB-Cluster-57
http://repo.percona.com/release/7/RPMS/x86_64/Percona-XtraDB-Cluster-57-5.7.22-29.26.1.el7.x86_64.rpm
Percona-XtraDB-Cluster-shared-57
http://repo.percona.com/release/7/RPMS/x86_64/Percona-XtraDB-Cluster-shared-57-5.7.22-29.26.1.el7.x86_64.rpm
Percona-XtraDB-Cluster-shared-compat-57
http://repo.percona.com/release/7/RPMS/x86_64/Percona-XtraDB-Cluster-shared-compat-57-5.7.22-29.26.1.el7.x86_64.rpm
Percona-XtraDB-Cluster-client-57
http://repo.percona.com/release/7/RPMS/x86_64/Percona-XtraDB-Cluster-client-57-5.7.22-29.26.1.el7.x86_64.rpm
Percona-XtraDB-Cluster-server-57
http://repo.percona.com/release/7/RPMS/x86_64/Percona-XtraDB-Cluster-server-57-5.7.22-29.26.1.el7.x86_64.rpm
percona-xtrabackup-24
http://repo.percona.com/release/7/RPMS/x86_64/percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm
qpress
http://repo.percona.com/release/7/RPMS/x86_64/qpress-11-1.el7.x86_64.rpm
安装顺序
1)yum install Percona-XtraDB-Cluster-shared-compat-57-5.7.22-29.26.1.el7.x86_64.rpm #替换mariadb-libs-5.5.52
2)yum install Percona-XtraDB-Cluster-shared-57-5.7.22-29.26.1.el7.x86_64.rpm
3)yum install Percona-XtraDB-Cluster-client-57-5.7.22-29.26.1.el7.x86_64.rpm #很多perl依赖
4)yum install percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm #perl依赖和libev、rsync
5)yum install qpress-11-1.el7.x86_64.rpm
6)yum install Percona-XtraDB-Cluster-server-57-5.7.22-29.26.1.el7.x86_64.rpm #lsof、socat
7)yum install Percona-XtraDB-Cluster-57-5.7.22-29.26.1.el7.x86_64.rpm
8)yum install openssl #需要安装这个
说明
推荐的设置位于/etc/percona-xtradb-cluster.conf.d/mysqld.cnf
若你要使用推荐的mysqld.cnf文件,请备份好/etc/my.cnf
然后请执行rm -rf /etc/my.cnf
update-alternatives --install /etc/my.cnf my.cnf "/etc/percona-xtradb-cluster.cnf" 200
-------------
Percona XtraDB Cluster is distributed with several useful UDFs from Percona Toolkit.
Run the following commands to create these functions:
mysql -e "CREATE FUNCTION fnv1a_64 RETURNS INTEGER SONAME 'libfnv1a_udf.so'"
mysql -e "CREATE FUNCTION fnv_64 RETURNS INTEGER SONAME 'libfnv_udf.so'"
mysql -e "CREATE FUNCTION murmur_hash RETURNS INTEGER SONAME 'libmurmur_udf.so'"
启动服务
service mysql start  #systemctl start mysql
grep 'temporary password' /var/log/mysqld.log
mysql -u root -p
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root123';
exit
service mysql stop #systemctl stop mysql
配置第一个节点
配置文件/etc/my.cnf

初始化第一个节点
systemctl start mysql@bootstrap.service
查看状态
mysql -uroot -proot123
show status like 'wsrep%';
创建SST帐户
CREATE USER 'sstuser'@'localhost' IDENTIFIED BY 's3cret';
GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost';
FLUSH PRIVILEGES;
配置第二个节点
配置文件/etc/my.cnf同第一个,仅需修改wsrep_node_address=192.168.10.120
启动第二个节点
systemctl start mysql
启动节点会自动加入到集群,并接收SST全量备份,这意味着会完全清空该节点之前的数据
查看状态
mysql -uroot -proot123
show status like 'wsrep%';
配置第三个节点
同第二个
测试
create database percona;
use percona;
create table example (node_id int primary key,node_name varchar(30));
insert into percona.example values (1,'percona');
select * from percona.example;

PXC集群状态的监控

show global status like 'wsrep%'; 查看集群状态参数:
wsrep_cluster_state_uuid 集群uuid,集群中所有节点值相同,若存在不同值,说明没有连入集群
wsrep_cluster_size 节点数量
wsrep_cluster_status 集群状态,若不为primary,说明出现"分区"或"脑裂"
wsrep_local_state_comment 节点状态,有4个值:
joining,节点正在加入集群
donor,当前节点正在提供数据
joined,当前节点已成功加入集群
synced,当前节点与整个集群是同步状态
wsrep_last_committed 最后提交的事务数目
wsrep_ready 值为ON表示当前节点可以正常服务,若值为OFF则该节点可能发生脑裂或者网络问题

从节点在线转化为PXC节点

默认,一个新节点加入PXC集群,需要SST全量备份传输,这样可能整体拉垮集群性能
好的解决办法是,让即将加入的节点先成为PXC某个节点的从库,然后在线通过IST方式加入集群中

192.168.10.140配置如下

cat /etc/my.cnf
[client]
port = 3306
socket = /tmp/mysql.sock
[mysql]
prompt = "\u@db \R:\m:\s [\d]> "
no-auto-rehash
[mysqld]
user = mysql
port = 3306
basedir = /usr/local/mysql
datadir = /data/mysql
socket = /tmp/mysql.sock
log-error = /data/mysql/error.log
character-set-server = utf8mb4
server_id = 3306140# PXC
binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2

初始化数据
cd /usr/local/mysql/bin
./mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql --datadir=/data/mysql/ --user=mysql --initialize
获取初始密码
cat /data/mysql/error.log |grep password
启动第一个节点
cd /usr/local/mysql/support-files
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
修改/etc/init.d/mysql文件【所有节点】
添加环境变量,因为SST时需要执行命令wsrep_sst_xtrabackup-v2
vi /etc/init.d/mysql 第125行
PATH="/sbin:/usr/sbin:/bin:/usr/bin:$basedir/bin:/usr/local/mysql/bin"
#systemctl daemon-reload
启动节点
/etc/init.d/mysql start #systemctl start mysql
./mysql -uroot -p
set password = 'abc';
alter user 'root'@'localhost' password expire never;

在集群上建立主从同步帐号(192.168.10.110上)
create user 'bak'@'192.168.10.%' identified by 'bak123';
grant replication slave on *.* to 'bak'@'192.168.10.%';
flush privileges;
建立主从关系
./mysqldump --single-transaction -uroot -proot123 -A --master-data=2 > /root/all.sql
在140上恢复数据
./mysql -uroot -pabc < /root/all.sql
change master to
master_host='192.168.10.110',
master_user='bak',
master_password='bak123',
master_log_file='mysql-binlog.000003',
master_log_pos=154;
start slave;
show slave status\G
注意:集群上其他节点增删改不会记录到binlog日志中,因此需要添加log_slave_updates到配置文件中
数据库运行一段时间..
stop slave;
show slave status\G 发现此时位置在mysql-binlog.000003 419
关闭mysql服务
systemctl stop mysql
在配置文件中添加PXC参数

wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so
wsrep_cluster_name=pxc-cluster
wsrep_cluster_address=gcomm://192.168.10.110,192.168.10.120,192.168.10.130,192.168.10.140

#wsrep_node_name=node1
wsrep_node_address=192.168.10.140

wsrep_provider_options="gcache.size=1G"
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=sstuser:sstpassword

#pxc_strict_mode=ENFORCING

在110上确认PXC需要同步的位置
./mysqlbinlog -v -v /data/mysql/mysql-binlog.000003
# at 388
#180723 22:26:16 server id 0 end_log_pos 419 CRC32 0x329aa77b Xid = 20
COMMIT/*!*/;
# at 419
在419没有增删改操作,在388处Xid=20
PXC集群中的grastate.dat文件
cat grastate.dat
# GALERA saved state
version: 2.1
uuid: 5dd7cc01-8e61-11e8-919f-de8a38009513
seqno: -1
safe_to_bootstrap: 0
其中seqno是集群中wsrep_last_committed的值,根据该值可以直接判断下次节点启动时做增量传输的位置,因为110是正在运行的状态,所以seqno=-1(非正常关闭,也会是-1)
复制110上的grastate.dat文件到140,并设置sequno=20,修改文件属主
scp grastate.dat 192.168.10.140:/data/mysql
chown mysql:mysql grastate.dat
启动140
systemctl start mysql
reset slave all;  删除主从配置

转载请注明:轻风博客 » MySQL王者晋级之路(七)高可用集群之Keepalived双主、PXC

喜欢 (1)or分享 (0)