MHA高可用

(所有主机都要做的)

修改主机名
[root@localhost ~]# hostnamectl set-hostname 主机名
实验环境:
192.168.100.101 master #mysql主,node节点
192.168.100.102 slave1 #mysql从,node节点
192.168.100.103 slave2 #mysql从,node节点
192.168.100.104 mha #mha管理节点

所有主机设置免密

[root@master ~]# ssh-keygen -t rsa
[root@master ~]# ssh-copy-id root@192.168.100.101
[root@master ~]# ssh-copy-id root@192.168.100.102
[root@master ~]# ssh-copy-id root@192.168.100.103
[root@master ~]# ssh-copy-id root@192.168.100.104

上传软件包

anaconda-ks.cfg mha4mysql-node-0.57-0.el7.noarch.rpm节点包 mhapath.tar.gz yum源依赖包

配置本地yum源

[root@master ~]# vim /etc/yum.repos.d/mhapath.repo
[mha]
name=mhapath
baseurl=file:///root/mhapath
enabled=1
gpgcheck=0

Mha安装依赖包

[root@master ~]# tar -zxvf mhapath.tar.gz #解压依赖包
[root@master ~]# vim /etc/yum.repos.d/centos7.repo
[CentOS7]
name=CentOS-server
baseurl=file:///mnt
enabled=1
gpgcheck=0
[root@master ~]# mount /dev/cdrom /mnt #挂在光驱

软件依赖和安装包

[root@master ~]# yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager --skip-broken --nogpgcheck
[root@master ~]# rpm -ivh mha4mysql-node-0.57-0.el7.noarch.rpm

安装完成后会在/usr/bin/目录下生成以下脚本文件:

[root@master bin]# cd /usr/bin/
[root@master bin]# ll app* filter* purge* save*
-rwxr-xr-x 1 root root 16381 5月 31 2015 apply_diff_relay_logs
-rwxr-xr-x 1 root root 4807 5月 31 2015 filter_mysqlbinlog
-rwxr-xr-x 1 root root 8261 5月 31 2015 purge_relay_logs
-rwxr-xr-x 1 root root 7525 5月 31 2015 save_binary_logs

管理节点

上传软件包
mha4mysql-manager-0.57-0.el7.noarch.rpm
安装软件包
rpm -ivh mha4mysql-manager-0.57-0.el7.noarch.rpm

搭建主从复制环境

配置/etc/my.cnf文件

Master:

log-bin=mysql-bin-master #启用二进制日志
server-id=1 #本机数据库ID 标示
binlog-do-db=HA #可以被从服务器复制的库, 二进制需要同步的数据库名
binlog-ignore-db=mysql #不可以被从服务器复制的库

slave1:

log-bin=mysql-slave1 #启用二进制日志
server-id=2 #本机数据库ID 标示
log_slave_updates=1 #从库会记录和主一样的二进制日志

slave2:

log-bin=mysql-slave2 #启用二进制日志
server-id=3 #本机数据库ID 标示
log_slave_updates=1 #从库会记录和主一样的二进制日志

所有mysql

[root@cong11 ~]# systemctl restart mysqld #重启服务

授权

slave用户用来主从同步,root用户给MHA使用
 mysql> grant replication slave on *.* to repl@'192.168.1.%' identified by '123456';
 mysql> grant all privileges on *.* to 'root'@'192.168.1.%' identified  by '123456';
所有从mysql
mysql> stop slave;
mysql>  change master to master_host='192.168.100.101',master_user='repl',master_password='123456';
mysql> start slave;
mysql> show slave status\G
mysql> set global relay_log_purge=0;  #不将relog日志清除,从服务器频繁拉取master数据,也会自动删除之前的二进制日志,但是在MHA环境中,这些中继日志在恢复其他从服务器时可能会被用到,因此需要禁用中继日志的自动删除功能。
mysql> set global read_only=1;	#只读,从库对外提供读服务,之所以没有写进配置文件,是因为slave随时会提升为master

配置MHA

[root@mha ~]# mkdir -p /etc/masterha 存放配置文件的
[root@mha ~]# mkdir -p /var/log/masterha/app1 存放日志的
[root@mha ~]# vim /etc/masterha/app1.cnf 群集配置文件,可以多个

 [server default]
 manager_workdir=/var/log/masterha/app1
 manager_log=/var/log/masterha/app1/manager.log
 master_binlog_dir=/data/mysql/data
 user=root
 password=123456
 ping_interval=1
 remote_workdir=/tmp
 repl_user=repl
 repl_password=123456
 ssh_user=root
 
 [server1]
 hostname=192.168.100.101
 port=3306
 
 [server2]
 hostname=192.168.100.102
 port=3306
 candidate_master=1
 check_repl_delay=0
 
 [server3]
 hostname=192.168.100.103
 port=3306
注释,需要注意的几个地方

[server default]
manager_workdir=/var/log/masterha/app1 #设置manager的工作目录
manager_log=/var/log/masterha/app1/manager.log #设置manager的日志
master_binlog_dir=/data/mysql/data #设置master 保存binlog的位置,以便MHA可以找到master的日志,我这里的也就是mysql的数据目录
master_ip_failover_script= /usr/bin/master_ip_failover #设置vip自动故障切换时候的脚本
master_ip_online_change_script=/usr/bin/master_ip_online_change #设置手动切换时候的切换脚本

user=root
password=123456 #mysql给mha的用户名密码
ping_interval=1 #设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行railover,每过一秒看主还在不在
remote_workdir=/tmp #设置远端mysql在发生切换时binlog的保存位置
repl_user=repl #设置复制环境中的复制用户名
repl_password=123456 #设置复制用户的密码,主坏了,通过这个重新指定主
report_script=/usr/local/send_report #设置发生切换后发送的报警的脚本
shutdown_script="" #设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机放在发生脑裂,这里没有使用)
ssh_user=root #设置ssh的登录用户名,因为免密了,就不用输密码了

[server1]
hostname=192.168.100.101
port=3306

[server2]
hostname=192.168.100.102
port=3306
candidate_master=1 #设置为候选master,如果设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个主库不是集群中事件最新的slave
check_repl_delay=0 #默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master

[server3]
hostname=192.168.100.103
port=3306

检查MHA Manger到所有MHA Node的SSH连接状态:

[root@mha ~]# masterha_check_ssh --conf=/etc/masterha/app1.cnf

通过masterha_check_slave脚本查看整个集群的状态

[root@mha ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf

如果 not ok 需要删除之前健康检查的文件,这是因为之前健康检查报错

[root@mha ~]# rm -rf /var/log/masterha/app1/app1.master_status.health

重新查看集群状态

[root@mha ~]# masterha_check_slave --conf=/etc/masterha/app1.cnf

开启MHA监控
 [root@cong10 ~]# 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将会从配置文件中移除。如果再把主添回来,还要重新指定,mha是一次性的
–manger_log 日志存放位置
–ignore_last_failover 在缺省情况下,如果MHA检测到连续发生宕机,且两次宕机间隔不足8小时的话,则不再进行Failover故障转移,该参数代表忽略上次MHA触发切换产生的文件。默认情况下,MHA发生切换后会在日志目录,也就是上面设置的/data产生app1.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后删除该文件,为了方便,这里设置为–ignore_last_failover。

查看MHA Manager监控是否正常
 [root@mha ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
 app1 (pid:7261) is running(0:PING_OK), master:192.168.100.101

关闭MHA监控

[root@mha ~]# masterha_stop --conf=/etc/masterha/app1.cnf

开启监控

[root@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 &
打开新窗口查看日志
[root@mha ~]# tail -f /var/log/masterha/app1/manager.log
模拟主库故障

[root@mha ~]# systemctl stop mysqld
看日志master是否切换成功

从cong13查看show slave status\G

[root@mha ~]# mysql -uroot -p123456
mysql> show slave status\G

VIP

mysql主上配置VIP

[root@master ~]# ifconfig ens33:1 192.168.100.88 netmask 255.255.255.0 up
[root@master ~]# ifconfig

在主配置文件里开启脚本

[root@mha ~]# vim /etc/masterha/app1.cnf
#添加一句话 ssh_user=root 在这句话后添加这句话
master_ip_failover_script=/usr/bin/master_ip_failover #开启脚本

编写脚本/usr/bin/master_ip_failover,是perl脚本语言

[root@mha ~]# vim /usr/bin/master_ip_failover

 #!/usr/bin/env perl
 use strict;
 use warnings FATAL => 'all';
 
 use Getopt::Long;
 
 my (
     $command,          $ssh_user,        $orig_master_host, $orig_master_ip,
     $orig_master_port, $new_master_host, $new_master_ip,    $new_master_port
 );
 
 my $vip = '192.168.100.88/24';
 my $key = '1';
 my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
 my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
 
 GetOptions(
     'command=s'          => \$command,
     'ssh_user=s'         => \$ssh_user,
     'orig_master_host=s' => \$orig_master_host,
     'orig_master_ip=s'   => \$orig_master_ip,
     'orig_master_port=i' => \$orig_master_port,
     'new_master_host=s'  => \$new_master_host,
     'new_master_ip=s'    => \$new_master_ip,
     'new_master_port=i'  => \$new_master_port,
 );
 
 exit &main();
 
 sub main {
 
     print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";
 
     if ( $command eq "stop" || $command eq "stopssh" ) {
 
         my $exit_code = 1;
         eval {
             print "Disabling the VIP on old master: $orig_master_host \n";
             &stop_vip();
             $exit_code = 0;
         };
         if ($@) {
             warn "Got Error: $@\n";
             exit $exit_code;
         }
         exit $exit_code;
     }
     elsif ( $command eq "start" ) {
 
         my $exit_code = 10;
         eval {
             print "Enabling the VIP - $vip on the new master - $new_master_host \n";
             &start_vip();
             $exit_code = 0;
         };
         if ($@) {
             warn $@;
             exit $exit_code;
         }
         exit $exit_code;
     }
     elsif ( $command eq "status" ) {
         print "Checking the Status of the script.. OK \n";
         #`ssh $ssh_user\@cluster1 \" $ssh_start_vip \"`;
         exit 0;
     }
     else {
         &usage();
         exit 1;
     }
 }
 
 #A simple system call that enable the VIP on the new master
 sub start_vip() {
     `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
 }
 #A simple system call that disable the VIP on the old_master
 sub stop_vip() {
     `ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
 }
 
 sub usage {
     print
     "Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
 }
给脚本添加可执行权限
[root@master ~]# chmod +x /usr/bin/master_ip_failover

检查MHA Manger到所有MHA Node的SSH连接状态:

[root@master ~]# masterha_check_ssh --conf=/etc/masterha/app1.cnf
 
检查整个集群复制环境状况

需要删除之前健康检查的文件

 [root@master ~]# rm -rf /var/log/masterha/app1/app1.master_status.health
 [root@master ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf 

如果还是报错再删除一边健康检查文件

开启MHA Manager监控
 [root@master ~]# 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] 7418
查看MHA Manager监控是否正常
[root@master ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
 app1 (pid:7418) is running(0:PING_OK), master:192.168.100.101
打开窗口观察日志
[root@master ~]# tail -f /var/log/masterha/app1/manager.log
模拟主库挂掉
 [root@cong12 ~]# systemctl stop mysqld
看日志是否切换master成功

可以看到master已经切换到192.168.100.101
从库(备用主):查看VIP是否漂移过来

 [root@slave1 ~]# ip a

主库指定(新主):

mysql> change master to master_host='192.168.100.102',master_user='slave',master_password='123456';

需要 添加/修改 mha配置文件,才能重新监控

[root@master ~]# vim /etc/masterha/app1.cnf

 [server default]
 manager_workdir=/var/log/masterha/app1
 manager_log=/var/log/masterha/app1/manager.log
 master_binlog_dir=/data/mysql/data
master_ip_failover_script=/usr/bin/master_ip_failover  #重新添加这句话,开启脚本

 user=root
 password=123456
 ping_interval=1
 remote_workdir=/tmp
 repl_user=repl
 repl_password=123456
 ssh_user=root
 
 [server1]		#需要添加新主ip和端口
 hostname=192.168.100.101
 port=3306
 
 [server2]		#重新指定备用从是谁
 hostname=192.168.100.102
 port=3306
 candidate_master=1
 check_repl_delay=0
 
 [server3]
 hostname=192.168.100.103
 port=3306
检查现在整个集群复制环境状况

需要删除之前健康检查的文件

 [root@master ~]# rm -rf /var/log/masterha/app1/app1.master_status.health
 [root@master ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf 

如果还是报错再删除一边健康检查文件

开启MHA Manager监控
 [root@master ~]# 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] 7418
查看MHA Manager监控是否正常
[root@master ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
 app1 (pid:7418) is running(0:PING_OK), master:192.168.100.102
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值