MySQL高可用群集之MHA
相比MMM的优势:节约资源,不像MMM还需要再要一台Master服务器,这个可以直接把从服务器备用成主服务器
安装配置MHA高可用环境(环境如下图所示)
只需要一台服务器来管理,当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
注意:3台服务器的server-id这个参数不能一样,其他一样,配置完记得重启服务
3.分别都创建登录数据库用户,主服务器授权,从服务器同步数据,实现主从复制
mysqladmin -u root -h localhost -p'123456'
mysql -uroot -p123456
主服务器:
查询二进制文件和位置变量:mysql> show master status;
主服务器授权: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状态,再测试是否主从复制成功
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用户密码即可,其他三台类似
补充:出现以下错误解决方式
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
添加以下部分
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
8.使用工具检测配置连接的状况
测试SSH无密码登录,如果正常如下图所示
masterha_check_ssh -conf=/etc/masterha/app1.cnf
测试mysql主从连接情况:masterha_check_repl -conf=/etc/masterha/app1.cnf
下图为成功
补充:可能出现的错误解决方法
★测试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
测试关闭掉主服务器看是否移动到备用master服务器上(查询日志查看状态)
cat /var/log/masterha/app1/manager.log
说明实验成功