MySQL高可用群集之MHA

相比MMM的优势:节约资源,不像MMM还需要再要一台Master服务器,这个可以直接把从服务器备用成主服务器

安装配置MHA高可用环境(环境如下图所示)

mysql MGR MSR比较 mysql mmm和mha对比_mysql

只需要一台服务器来管理,当Master主服务器故障时vip虚拟ip会自动偏移到从服务器上,从服务器会顶当主服务器

MHA的工作原理:1.从宕机崩溃的master保存二进制日志事件(binlog events)

                              2.识别含有最新更新的slave

                              3.应用差异的中继日志(relay log)到其他的slave

                              4.应用从master保存的二进制日志事件(binlog events)

                              5.提升一个slave为新的master

                              6.使其他的slave连接新的master进行复制

安装包自带的工具

Manager工具包主要包括以下几个工具:

masterha_check_ssh:检查MHA的SSH配置状况

masterha_check_repl:检查MySQL复制状况

masterha_manger:启动MHA

masterha_check_status:检测当前MHA运行状态

masterha_master_monitor:检测master是否宕机

masterha_master_switch:控制故障转移(自动或者手动)

masterha_conf_host:添加或删除配置的server信息

Node工具包(这些工具通常由MHA Manager的脚本触发,无需人为操作)主要包括以下几个工具:

save_binary_logs:保存和复制master的二进制日志

apply_diff_relay_logs:识别差异的中继日志事件并将其差异的事件应用于其他的slave

filter_mysqlbinlog:去除不必要的ROLLBACK事件(MHA已不再使用这个工具)

purge_relay_logs:清除中继日志(不会阻塞SQL线程)

MHA配置搭建

1.三台服务器下载安装数据库

yum -y install mysql mysql-server mysql-devel

2.修改配置文件/etc/my.cnf

vim /etc/my.cnf

mysql MGR MSR比较 mysql mmm和mha对比_perl_02

注意:3台服务器的server-id这个参数不能一样,其他一样,配置完记得重启服务

3.分别都创建登录数据库用户,主服务器授权,从服务器同步数据,实现主从复制

mysqladmin -u root -h localhost -p'123456'

mysql -uroot -p123456

主服务器:

查询二进制文件和位置变量:mysql> show master status;

mysql MGR MSR比较 mysql mmm和mha对比_服务器_03

主服务器授权:mysql> grant all on *.* to 'test'@'192.168.0.%' identified by '123456';

两台从服务器:mysql>change master to master_host='192.168.0.101',master_user='test',master_password='123456',master_log_file='mysql-bin.000018',master_log_pos=107;

mysql> start slave;

两台从服务器授权为了后面配置MHA检测主从测试

mysql>grant all on *.* to 'test'@'192.168.0.%' identified by '123456';

查看slave状态,再测试是否主从复制成功

mysql MGR MSR比较 mysql mmm和mha对比_perl_04

4.设置无密码密钥通信

在四台服务器上都要做其他三台服务器的无密码密钥通信,让每台主机都可以互相无密码密钥进行远程连接

下面以MHA-manger主机192.168.0.110为例子

ssh-keygen -t rsa(一直按回车)

ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.0.101

ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.0.103

ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.0.104

每次输入本机的root用户密码即可,其他三台类似

补充:出现以下错误解决方式

mysql MGR MSR比较 mysql mmm和mha对比_mysql_05

ssh -o StrictHostKeyChecking=no 192.168.0.101

想要以后不会出现这种问题或者修改配置文件/etc/ssh/ssh_config

最后添加

StrictHostKeyChecking no

UserKnownHostsFile /dev/null

5.安装node组件

所有服务器上都安装MHA依赖环境,就是perl模块(首先需要先安装epel源)

epel源下载安装

wget http://mirrors.yun-idc.com/epel/6/x86_64/epel-release-6-8.noarch.rpm

rpm -ivh epel-release-6-8.noarch.rpm

安装依赖包perl模块

yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-CPAN

所有(四台)服务器安装node组件

注意:manager 依赖 node 组件,CentOS7.3 必须选择 0.57 版本

解压编译安装node组件

tar zxvf mha4mysql-node-0.56.tar.gz》cd mha4mysql-node-0.56》perl Makefile.PL》make && make install

6.在MHA-manger主机上安装manger组件

在manger主机上编译安装manager组件

tar zxvf mha4mysql-manger-0.56.tar.gz》cd mha4mysql-manger-0.56》perl Makefile.PL》make && make install

7.MHA-manger主机上配置MHA

把解压包里面的相关脚本复制到/usr/local/bin目录

cp -ra samples/scripts /usr/local/bin/

复制上述的自动切换时 VIP 管理的脚本到/usr/local/bin目录,这里使用脚本管理VIP,也是推荐的一种方式,生产环境不太建议使用 keepalived,再进行修改

cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin

vim /usr/local/bin/master_ip_failover

mysql MGR MSR比较 mysql mmm和mha对比_mysql MGR MSR比较_06

添加以下部分
my $vip = '192.168.100.200/24';
my $key = "1";
my $ssh_start_vip = "/sbin/ifconfig eth1:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth1:$key down";
my $exit_code = 0;    

创建目录,从解压包里复制配置文件模板使用修改

mkdir /etc/masterha

cp samples/conf/app1.cnf /etc/masterha/

vim /etc/masterha/app1.cnf

mysql MGR MSR比较 mysql mmm和mha对比_perl_07

8.使用工具检测配置连接的状况

测试SSH无密码登录,如果正常如下图所示

 masterha_check_ssh -conf=/etc/masterha/app1.cnf

mysql MGR MSR比较 mysql mmm和mha对比_服务器_08

测试mysql主从连接情况:masterha_check_repl -conf=/etc/masterha/app1.cnf

下图为成功

mysql MGR MSR比较 mysql mmm和mha对比_mysql MGR MSR比较_09

补充:可能出现的错误解决方法

★测试SSH无密码登陆报错

检查是否每台机器都给其他三台主机发送的密钥

★测试 mysq 主从连接情况报错

如果不是给的所有权限注意3台mysql数据库应该给那些数据库的操作权限,操作权限是否没有给够,少了什么权限

注意检查你的/etc/masterha/app1.cnf配置文件是否是用户和密码设置的跟授权时的不一致

9.开启服务查看状态测试湿粉扑成功

开启MHA服务: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 &

--remove_dead_master_conf:该参数代表当发生主从切换后,老的主库的 ip 将会从配置文件中移除。

--manger_log:设置日志存放位置

--ignore_last_failover:在缺省情况下,如果 MHA 检测到连续发生宕机,且两次宕机间隔不足 8 小时的话,则不会进行 Failover,之所以这样限制是为了避免 ping-pong 效应。该参数代表忽略上次 MHA 触发切换产生的文件,默认情况下, MHA 发生切换后会在日志记目录,也就是上面设置的日志 app1.failover.complete 文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件,为了方便,这里设置为–ignore_last_failover

查看状态是否成功:masterha_check_status --conf=/etc/masterha/app1.cnf

mysql MGR MSR比较 mysql mmm和mha对比_mysql MGR MSR比较_10

测试关闭掉主服务器看是否移动到备用master服务器上(查询日志查看状态)

cat /var/log/masterha/app1/manager.log

mysql MGR MSR比较 mysql mmm和mha对比_mysql MGR MSR比较_11

说明实验成功