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

MySQL王者晋级之路(六)高可用集群之MHA

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

MySQL高可用集群

负载均衡:后端服务器没有状态,可任意分配,同时工作,增加负载和吞吐量
高可用性:后端服务器有状态,一主一备,一个工作一个等待接管服务,保证系统可用性
高可用100%是不存在的,生产中努力达到99.99%,即全年业务不可用时间大概只有52分钟

1)最常用的基于主从复制的方案:MHA和MM+Keepalived
2)基于Galera协议的Percona XtraDB Cluster(简称PXC)实现真正意义上的同步复制
3)基于中间件Proxy,如ProxySQL

MHA

MHA,即MasterHigh Availability Manager and Tools for MySQL,是采用Perl编写的一个脚本管理工具,适用于MySQL Replication环境,目的在于维护master主库的高可用性,是自动的master故障转移和slave提升软件包,基于标准的MySQL复制(异步/半同步)

MHA在生产环境使得得比较多,包括两个组成部分:MHA Manager管理节点和MHA Node数据节点

项目地址:
https://github.com/yoshinorim/mha4mysql-manager
https://github.com/yoshinorim/mha4mysql-node

MHA原理及优缺点

MHA Manager管理节点可以单独部署在一台独立服务器上管理多个master-slave集群,也可以部署在一台slave上。
MHA Manager探测集群中的node节点,当发现master故障后,可以自动将具有最新数据的slave提升为新的master,然后将所有其他slave导向新的master上,整个故障转移过程对程序是透明的
MHA node数据节点可以运行在每台MySQL服务器上,它通过监控具备解析和清理logs功能的脚本来加快故障转移

原理
MHA目的在于维持MySQL Replication中master库的高可用性,最大特点是可以修复多个slave之间的差异日志,最终使所有slave保持数据一致,然后从中选择一个充当新的master,并将其他slave指向它。当master故障时,可以通过对比slave之间IO thread读取主库binlog的pos号,选取最接近的slave作为备胎。其他从库可以通过与备选主库对比生成差异的中继日志,在备选主库上应用从原来master保存的binlog,同时将备选主库提升为master。最后在其他slave上应用相应的差异中继日志并从新的master开始复制

优点
故障切换时,可以自行判断哪个从库与主库数据最接近,然后切换,减少数据丢失
支持binlog server 可以提高binlog传送效率,进一步减少数据丢失风险
结合5.7的增强半同步功能,确保故障切换时数据不丢失
缺点
自动切换的脚本太简单,且比较老化
搭建MHA架构,需开启linux系统互信协议,有系统安全性风险

MHA工具包功能

1、Manager管理工具
masterha_check_ssh,检查mha的ssh配置
masterha_check_repl,检查数据库主从复制功能
masterha_manager,启动mha服务
masterha_check_status,查看当前mha运行状态
masterha_master_monitor,监测master是否宕机
masterha_master_switch,控制故障转移(自动或手动)
masterha_conf_host,添加或删除配置的server信息
2、Node数据节点工具
save_binary_logs,保存和复制binlog日志
apply_diff_replay_logs,识别差异的中继日志事件并应用于其他slave
filter_mysqlbinlog,去除不必要的rollback事件(mha已不再使用这个工具)
purge_relay_logs,清除中继日志(不会阻塞SQL线程)

实战

node1 192.168.10.110 master,数据节点
node2 192.168.10.120 slave1 ,数据节点
node3 192.168.10.130 slave2 ,数据节点,管理节点
VIP 192.168.10.100/32

第一步,配置三台主机免密码登录
node1:
vim /etc/hosts
192.168.10.110 node1
192.168.10.120 node2
192.168.10.130 node3
ssh-keygen
ssh-copy-id root@node1
ssh-keygen
ssh-copy-id root@node2
ssh root@node2
ssh-copy-id root@node3
ssh root@node3
node2/node3操作类似,注意,本机也需要添加
第二步,搭建主从环境
这里是一主两从,基于gtid+row模式
mysqld_safe &  #启动数据库
在主库上创建复制帐号
create user 'repl'@'192.168.10.%' identified by 'repl123';
grant replication slave on *.* to 'repl'@'192.168.10.%';
flush privileges;
在主库上创建管理帐号[所有库上都要创建该帐号]
create user 'admin'@'192.168.10.%' identified by 'admin123';
grant all privileges on *.* to 'admin'@'192.168.10.%';
flush privileges;
备份主库数据,因为是gtid同步,不需要添加-master-data参数
mysqldump --single-transaction -uroot -proot123 -A >/root/all.sql
scp all.sql root@node2:/root
scp all.sql root@node3:/root
在两个从库恢复数据
mysql -uroot -proot123 <all.sql
在两个从库启用主从复制
change master to
master_host='192.168.10.110',
master_user='repl',
master_password='repl123',
master_auto_position=1;
start slave;
show slave status\G
第三步,安装MHA-node节点
在三台主机上均需安装
安装MySQL依赖的Perl环境
yum install perl-DBD-MySQL
下载并解压
wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58.tar.gz
#https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
tar zxf mha4mysql-node-0.58.tar.gz
cd mha4mysql-node-0.58
yum install perl-CPAN*  #perl编译环境
perl Makefile.PL
make
make install
Installing /usr/local/share/perl5/MHA/BinlogManager.pm
Installing /usr/local/share/perl5/MHA/BinlogPosFindManager.pm
Installing /usr/local/share/perl5/MHA/BinlogPosFinderXid.pm
Installing /usr/local/share/perl5/MHA/BinlogHeaderParser.pm
Installing /usr/local/share/perl5/MHA/BinlogPosFinder.pm
Installing /usr/local/share/perl5/MHA/BinlogPosFinderElp.pm
Installing /usr/local/share/perl5/MHA/NodeUtil.pm
Installing /usr/local/share/perl5/MHA/SlaveUtil.pm
Installing /usr/local/share/perl5/MHA/NodeConst.pm
Installing /usr/local/share/man/man1/filter_mysqlbinlog.1
Installing /usr/local/share/man/man1/apply_diff_relay_logs.1
Installing /usr/local/share/man/man1/purge_relay_logs.1
Installing /usr/local/share/man/man1/save_binary_logs.1
Installing /usr/local/bin/filter_mysqlbinlog
Installing /usr/local/bin/apply_diff_relay_logs
Installing /usr/local/bin/purge_relay_logs
Installing /usr/local/bin/save_binary_logs
Appending installation info to /usr/lib64/perl5/perllocal.pod
第四步,安装MHA-manager管理节点
仅安装到node3
安装环境依赖
yum install perl-DBD-MySQL perl-Params-Validate perl-Config-Tiny
这两项需要下载安装,base仓库内没有:perl-Log-Dispatch perl-Parallel-ForkManager
https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/Packages/p/perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm
#有依赖perl-Email-Date-Format、perl-MIME-Lite、perl-MIME-Types、perl-Mail-Sender、perl-Mail-Sendmail
https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/Packages/p/perl-Email-Date-Format-1.002-15.el7.noarch.rpm  安装顺序1
https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/Packages/p/perl-MIME-Types-1.38-2.el7.noarch.rpm  安装顺序2
https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/Packages/p/perl-MIME-Lite-3.030-1.el7.noarch.rpm  安装顺序3
https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/Packages/p/perl-Mail-Sender-0.8.23-1.el7.noarch.rpm  安装顺序4,有base依赖
https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/Packages/p/perl-Mail-Sendmail-0.79-21.el7.noarch.rpm  安装顺序5
yum install perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm
https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/Packages/p/perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
yum install perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
安装管理节点
wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58.tar.gz
#https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
tar zxf mha4mysql-manager-0.58.tar.gz
cd mha4mysql-manager-0.58
perl Makefile.PL
- DBI ...loaded. (1.627)
- DBD::mysql ...loaded. (4.023)
- Time::HiRes ...loaded. (1.9725)
- Config::Tiny ...loaded. (2.14)
- Log::Dispatch ...loaded. (2.41)
- Parallel::ForkManager ...loaded. (1.18)
- MHA::NodeConst ...loaded. (0.58)
make
make install
Installing /usr/local/share/perl5/MHA/ManagerUtil.pm
Installing /usr/local/share/perl5/MHA/Config.pm
Installing /usr/local/share/perl5/MHA/HealthCheck.pm
Installing /usr/local/share/perl5/MHA/ServerManager.pm
Installing /usr/local/share/perl5/MHA/ManagerConst.pm
Installing /usr/local/share/perl5/MHA/FileStatus.pm
Installing /usr/local/share/perl5/MHA/ManagerAdmin.pm
Installing /usr/local/share/perl5/MHA/ManagerAdminWrapper.pm
Installing /usr/local/share/perl5/MHA/MasterFailover.pm
Installing /usr/local/share/perl5/MHA/MasterRotate.pm
Installing /usr/local/share/perl5/MHA/MasterMonitor.pm
Installing /usr/local/share/perl5/MHA/Server.pm
Installing /usr/local/share/perl5/MHA/SSHCheck.pm
Installing /usr/local/share/perl5/MHA/DBHelper.pm
Installing /usr/local/share/man/man1/masterha_stop.1
Installing /usr/local/share/man/man1/masterha_conf_host.1
Installing /usr/local/share/man/man1/masterha_check_repl.1
Installing /usr/local/share/man/man1/masterha_check_status.1
Installing /usr/local/share/man/man1/masterha_master_monitor.1
Installing /usr/local/share/man/man1/masterha_check_ssh.1
Installing /usr/local/share/man/man1/masterha_master_switch.1
Installing /usr/local/share/man/man1/masterha_secondary_check.1
Installing /usr/local/share/man/man1/masterha_manager.1
Installing /usr/local/bin/masterha_stop
Installing /usr/local/bin/masterha_conf_host
Installing /usr/local/bin/masterha_check_repl
Installing /usr/local/bin/masterha_check_status
Installing /usr/local/bin/masterha_master_monitor
Installing /usr/local/bin/masterha_check_ssh
Installing /usr/local/bin/masterha_master_switch
Installing /usr/local/bin/masterha_secondary_check
Installing /usr/local/bin/masterha_manager
Appending installation info to /usr/lib64/perl5/perllocal.pod
第五步,进行管理节点的配置
创建MHA家目录,编辑启动配置文件
mkdir -p /usr/local/mha
mkdir -p /etc/mha
vim /etc/mha/mha.conf

参数说明:
user/password,MySQL管理帐号,建议赋予all privileges权限
manager_workdir,mha manager的工作目录
manager_log,mha manager日志绝对路径
remote_workdir,mha node生成日志文件的路径,绝对路径
ssh_user,mha manager和node通过该用户连接到操作系统
repl_user/repl_password,复制时使用的用户名和密码
ping_interval,mha manager ping主库的间隔,连接三次失败后,即认为主库宕机,单位秒
master_ip_failover_script,failover切换脚本
master_ip_online_change_script,在线切换脚本
candidate_master,从不同从库中,提升一个可靠的库作为新主库,设置为1,优先成为master
no_master,为1时,意味该server从来不会成为新的master,该参数标记从来不成为新主的服务器
创建failover,online脚本目录
mkdir -p /usr/local/scripts
cat /usr/local/scripts/master_ip_failover

cat /usr/local/scripts/master_ip_online_change

chmod +x master_ip_failover
chmod +x master_ip_online_change
利用MHA工具检测SSH
#依赖:yum install perl-Time-HiRes
masterha_check_ssh --conf=/etc/mha/mha.conf
检测主从结构
masterha_check_repl --conf=/etc/mha/mha.conf
第六步,添加VIP
在主库上执行添加vip的过程,第一次手动添加
/sbin/ifconfig ens32:0 192.168.10.100   #ip addr add 192.168.10.100/24 dev ens32这种方式初始的VIP不能被去除,需用前面的方式
#/sbin/ifconfig ens32:0 down                #ip addr delete 192.168.10.100/24 dev ens32  删除VIP
ip addr show  #ip a
第七步,启动MHA服务
在管理节点执行MHA的启动
nohup masterha_manager --conf=/etc/mha/mha.conf > /tmp/mha_manager.log < /dev/null 2&1 &
验证启动是否成功
masterha_check_status --conf=/etc/mha/mha.conf
mha (pid:4811) is running(0:PING_OK), master:192.168.10.110
 第八步,模拟主库故障
在node1上执行
mysqladmin -uroot -proot123 shutdown
切换后,MHA进程会自动停止运行
恢复操作,把关掉的服务重新启动起来
mysqld_safe &
配置指向新的主库,配置主从
mysql -uroot -proot123
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
新的一主两从结构完成
第九步,手动恢复原来的主从
若希望原来的192.168.10.110变成主库,需要手动在线切换
在管理节点上执行:
masterha_master_switch --conf=/etc/mha/mha.conf --master_state=alive --new_master_host=192.168.10.110 --orig_master_is_new_slave
#inet 192.168.10.100/32 scope global ens32  #VIP方式有点问题,已修复
参数说明:
--master_state,代表当前主库状态为alive,192.168.10.120为当前主库
--new_master_host,代表切换后的新主库
--orig_master_is_new_slave,将原来的主库变为从库,该参数必须加
MHA常用管理命令:
masterha_check_repl,检查主从结构是否OK
masterha_check_ssh,检查SSH连接是否成功
masterha_check_status,查看MHA进程状态
masterha_manager,启动MHA服务
masterha_stop,停止MHA服务
说明:脚本中VIP的添加删除需要特别注意,/sbin/ifconfig ens32:0 192.168.10.100方式和ip addr add 192.168.10.100/24 dev ens32方式有差别,在删除VIP时,需要测试对应的删除方式,不然不能删除,会导致两个VIP同时存在的问题
注意:MHA脚本在执行完一次主备切换时,masterha_manager会退出

 

转载请注明:轻风博客 » MySQL王者晋级之路(六)高可用集群之MHA

喜欢 (1)or分享 (0)