一、MHA概述
1.MHA简介
- 在MySQL故障切换的过程中,MHA能做到0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能够最大程度上保证数据库的一致性,以达到真正意义上的高可用
- MHA由两部分组成管理节点(MHA manager)和数据节点(MHA Node)两部分组成
- MHA manager 可以单独部署在一台服务器上,可以部署在一台slave上面
2.MHA特点
- 自动故障切换过程中,MHA总会试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失
- 但这并不总是可行,例如如果主服务器硬件故障或者无法通过ssh访问,MHA则无法保存二进制日志,只能进行故障转移而丢失了最新的数据
- 使用MySQL5.5的半同步复制,可以大大降低数据丢失的风险。MHA可以与半同步复制结合起来,如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性,有时候可故意设置从节点慢于主节点,当发生意外删除数据库倒是数据丢失时可从从节点二进制日志中恢复。
二、MHA实验
1.实验环境
MySQL服务器
master 192.168.30.7 安装 node 组件
slave1 192.168.30.8 安装 node 组件
slave2 192.168.30.9 安装 node 组件
MHA-manager
192.168.30.6 管理节点,安装 manager 组件与node组件
2.mysql服务器配置
2.1 配置主从复制
主从复制配置
2.2 配置软链接
在三台mysql服务器上做
[root@master ~]# ln -s /usr/local/mysql/bin/mysql /usr/sbin //优化管理
[root@master ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin //节点恢复
2.3 所有数据库给用户提权
mysql> grant replication slave on *.* to 'myslave'@'192.168.30.%' identified by '123456'; //从库同步使用
Query OK, 0 rows affected, 1 warning (0.14 sec)
mysql> grant all privileges on *.* to 'mha'@'192.168.30.%' identified by 'manager'; //manager节点使用
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> grant all privileges on *.* to 'mha'@'master' identified by 'manager'; //以下三条都是为了防止MHA检查MySQL检查不通过,理论可不加
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> grant all privileges on *.* to 'mha'@'slave1' identified by 'manager';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> grant all privileges on *.* to 'mha'@'slave2' identified by 'manager';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges; //刷新权限表,使其立即生效
Query OK, 0 rows affected (0.01 sec)
2.4 所有从库开启只读功能
mysql> set global read_only=1; //对超级管理员不生效
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges; //刷新权限表,立即生效
Query OK, 0 rows affected (0.00 sec)
3.配置MHA
3.1 安装MHA依赖环境
[root@manager ~]# yum install epel-release --nogpgcheck -y //安装epel源,并且不进行gph检查
[root@manager ~]# yum install -y perl-DBD-MySQL \ //perl针对于mysql数据库
> perl-Config-Tiny \ //从配置文件中提拿其中的值
> perl-Log-Dispatch \ //log-日志
> perl-Parallel-ForkManager \ //多线程管理
> perl-ExtUtils-CBuilder \ //扩展工具
> perl-ExtUtils-MakeMaker \
> perl-CPAN //cpan perl中的数据库
3.2 所有服务器同步时间
[root@manager ~]# ntpdate ntp.aliyun.com //同步aliyun时间服务器
20 Jul 14:42:11 ntpdate[22762]: adjust time server 203.107.6.88 offset 0.001765 sec
[root@manager ~]#
3.3 所有服务器安装node组件
[root@manager opt]# tar xf mha4mysql-node-0.57.tar.gz -C /root //解压还原到/root下
[root@manager opt]# cd /root/mha4mysql-node-0.57/ //切换到node目录下
[root@manager mha4mysql-node-0.57]# perl Makefile.PL && make && make install //安装node组件
3.4 MHA节点安装manager组件
[root@manager opt]# tar xf mha4mysql-manager-0.57.tar.gz -C /root //解压还原
[root@manager opt]# cd /root/mha4mysql-manager-0.57/
[root@manager mha4mysql-manager-0.57]# perl Makefile.PL
*** Module::AutoInstall version 1.06
*** Checking for Perl dependencies...
[Core Features]
- 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.57)
*** Module::AutoInstall configuration finished.
Checking if your kit is complete...
Looks good
Writing Makefile for mha4mysql::manager
[root@manager mha4mysql-manager-0.57]# make && make install //安装manager组件
3.5 使用脚本管理VIP
[root@manager mha4mysql-manager-0.57]# cp -ra /root/mha4mysql-manager-0.57/samples/scripts/ /usr/local/bin
[root@manager mha4mysql-manager-0.57]# cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin
3.6 创建MHA软件目录
[root@manager bin]# mkdir /etc/masterha //创建软件目录
[root@manager bin]# cp /root/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/ //拷贝配置文件
[root@manager bin]# vim /etc/masterha/app1.cnf //修改为以下配置
[server default]
#日志文件
manager_log=/var/log/masterha/app1/manager.log
#工作目录
manager_workdir=/var/log/masterha/app1
#二进制文件
master_binlog_dir=/home/mysql
#故障转移切换的工具
master_ip_failover_script=/usr/local/bin/master_ip_failover
#在线切换VIP工具管理
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
#以下是密码账号的管理配置
password=manager
ping_interval=1 //设置监控主库,发送ping包的事件间隔,默认为3秒,尝试三次没有回应的时候自动进性failove
remote_workdir=/tmp
repl_password=123456
repl_user=myslave
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.30.8 -s 192.168.30.9
shutdown_script=""
ssh_user=root
user=mha
[server1]
hostname=192.168.30.7
port=3306
[server2]
candidate_master=1 //设置候选msater,如果设置了此参数,发送主从切换后,会将此库提升为主库
hostname=192.168.30.8
check_repl_delay=0 //关闭复制的检查,默认情况下如果一个slave落后master 100M的relay-logs(中继日志)的话,MHA将不会选择该slave作为新的master,设置为0的话会忽略此规则
port=3306
[server3]
hostname=192.168.30.9
port=3306
4.在所有服务器上设置ssh免密登录
ssh-keygen -t rsa
ssh-copy-id 192.168.30.6
ssh-copy-id 192.168.30.7
ssh-copy-id 192.168.30.8
ssh-copy-id 192.168.30.9
5.测试无密码认证
6.测试主从复制
7.测试
7.1 后台启动MHA
[root@manager ~]# nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
[1] 24707
[root@manager ~]# jobs
[1]+ Running nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
[root@manager ~]#
7.2 查看到当前的master节点
[root@manager ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:24707) is running(0:PING_OK), master:192.168.30.7
7.3 模拟故障查看master变化
[root@manager ~]# tail -f /var/log/masterha/app1/manager.log //实时监控日志
[root@manager ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:25216) is running(0:PING_OK), master:192.168.30.8 //虚拟IP已经变成192.168.30.8了
[root@manager ~]#
7.4 查看主从复制
7.5 修复原master
7.5.1 启动数据库
7.5.2 将其改为slave,加入主从
7.5.3 修改mha主配置文件
[root@manager ~]# vim /etc/masterha/app1.cnf //插入记录,因为在其失效时,会自动删除
7.5.4 重新测试主从复制
[root@manager ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:25216) is running(0:PING_OK), master:192.168.30.8
总结
MHA目前在MySQL高可用方面是一个相对成熟的解决方案,在进行故障切换的过程中,MHA能最大程度上保证数据库的一致性,以达到真正意义上的高可用