mysql配置MHA集群

**

本文针对Mysql–MHA集群搭建、vip配置及宕机之后数据库和manager恢复做记录**

搭建环境:

用4台服务器塔尖Mysql-MHA集群
服务器版本:CentOS 7.6
1、192.168.3.101 管理节点
2、192.168.3.102 主节点 msyql
3、192.168.3.103 从节点 msyql
4、192.168.3.104 主节点 msyql

Mysql搭建及mysql主从配置

略(自行查找)…
创建mha用户用于监控
grant all on . to mha@"%" Identified by “123456”;
flush privileges;
创建tongbu与用户用于同步
grant all on . to tongbu@"%" Identified by “123456”;
flush privileges;

搭建MHA

1:主机环境配置(IP/DNS/HOSTS/免密码)

[root@manager ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.3.101 manager
192.168.3.102 master
192.168.3.103 slave1
192.168.3.104 slave2

四台机器上都配置

Ssh免密码登录

[root@manager ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 回车
Enter passphrase (empty for no passphrase): 回车
Enter same passphrase again: 回车
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
1c:e6:0e:0f:85:5b:34:97:35:20:7d:77:c5:bd:a2:97 root@rhel6-64-1
The key's randomart image is:
+--[ RSA 2048]----+
|        +.o+o  .+|
|       o +o ... +|
|      . =  . . ..|
|       B .   . . |
|      + S   . o  |
|       =   . E   |
|        o   .    |
|                 |
|                 |
+-----------------+
[root@manager ~]# ssh-copy-id 192.168.3.101
The authenticity of host '192.168.3.101 (192.168.3.101)' can't be established.
RSA key fingerprint is 64:32:50:c4:06:be:b6:e7:95:13:76:48:3b:e7:8b:aa.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.28.7.202' (RSA) to the list of known hosts.
root@172.28.7.202's password: 输入3.101的秘钥
Now try logging into the machine, with "ssh '192.168.3.101'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

四台机器上都配置(执行四边确保每台设备都能免密连接)

[root@manager ~]# ssh 192.168.3.102(再进行登录测试,以不输入密码直接登录为准)
Last login: Thu Sep  8 15:19:27 2016 from 192.168.3.102

其他台配置方法与以上一致 保证每台登录互相无交互
配置完成后每一个都登录一次 过程略配置后查看

最后查看授权的秘钥

[root@manager ~]# cat .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA9OJqUQpcmfym4xVhMhf4chNyNgzUzT0y+89A5KBXwIv1nN3X9bMoXQhVzDWB2MlzqbZdVw4TgYyINfNpQtuFEa7nEUen8KDKACTtTU99xf8Wrzhsvm6hREEfKml1zrg46TFk3Yjil+3QDq7wefk2g12HYbJpE946Ffr49NilcgUrh6HimEW4eGgTQSpyLyfrd2VS9bUcJGxoEbpoeniZgpbHqT3hidhrCLTYzu2GBaNunZTPqbfljPp0SpCUVCBouAzjSj0j7xT6wer7X1BkHQU4ipqlGu/t3EEFhkrhKqh94Az5oM+K6g7zXbL5qhG+4JVhu/zY6ZmaOaDZ16kgJQ== root@manager ~
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAuuBt+8vSrz+4PTPcBE5ButQmgBOX93opESAxAqU1q/9fQA0Ytj+m80l4GgaxJNxJxYfaMNBo3eDPMzzLqVMHtG8j6IhKo3BBxeT9vbtHvOrgnxNy2MOJ9D+EDqMQ0r8IKQBwJbPCEDGGoBelJYnBDNO17doJ0UM1i5n4tLIeFwczIDbR7TNB/tym26Bv+yOmyrVsG7gOQT3mCoK6RSBC6fv0OAse00cjzYpfZnRAfldWTfqBsaibHqnoMWJpiqZH/gH3LoeFW3d7zwaU6kY0Oqux49sXGmI2UEgNfJhLaJbyXkc1JCD3UlISVWxNGi7kUCKz/bOjDxt5D15NdO/e0w== root@master ~
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAzumZFvTs4bai/qOMTkjW5w+dL+hvyhnYsRbANVnmTbCTyB2sGW2VkY46r/FDcAtXYULdzwOpN9hE+rRb8HYT3YCjx5RdvY+wJzpd239lzwAY691AD7PBUOMbZUoyV/Bim5wFrAjLXUJ+ER4Cahcn/n5ZbkVmBH4E3X/xdHXQj6weAPawjLSUryRfFKPUg6G/8yjLPPR61WbznmAuOi0Lbw/U5L5Hf0SZ1CcT7R+GLyea6WxQ2H9MCdTCV5i+mrC8LqGaDBbuVXq5ZUeb7WjbkfpBkep1g+yFnSzTBXRSKXRyi9vK2CAD+zLhdrGKrmvtng0QeWxo77VkgQkD0CYzxQ== root@slave1 ~
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAxsAASxEYfJbn6/PCh3lXRwxAifrigpQsExpP/4WPRFa1aCw53zABEfbq8T0rjDS7oZXjbMZ/hnMA6okdG9hLypplW+UcMIfKiyaTAOhs2CDKvopsfATRZbALaewP7+LLf4haYUoNOK0DI3Y7YRzgXG0pEUgWMfeBlLldNIDv3b7+UzBIPSe1WComqqPlLav/PyS7VJxfNxDMZ5slkkmmi6UJYep5KvsRkF+Ci/cyaywJmzllH6OLDuI+cEJBH3KDxnui9td3/Llr3+LfLoxcyRZIXJD5NMQrtKYzW/OzAfeWsT4iMSK4d1Gqg+SXdNh+c3cqPyVh8qEvnCeIszBIoQ== root@slave2 ~

配置sql命令的软链接

ln -s /opt/mysql-basedir/mysql/bin/mysqlbinlog	/usr/bin/mysqlbinlog
ln -s /opt/mysql-basedir/mysql/bin/mysql		/usr/bin/mysql

在MHA中,命令的调用是绝对路径,所以需要做相应的命令到/usr/bin,绝对路径不调用环境变量的命令。

MHA安装配置:
四台机器都要做:

在/opt目录下安装:
在所有节点安装MHA node所需的perl模块,如下:
#CentOS 6 下载点
rpm -ivh http: // dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
#CentOS 7 下载点
rpm -ivh http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

#安装所需控件

[root@manager ~]yum  install  -y  perl-DBD-MySQL  perl-Config-Tiny  perl-Log-Dispatch  perl-Parallel-ForkManager  perl-Time-HiRes   
[root@manager ~]yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-YAML-Tiny perl-PAR-Dist perl-Module-ScanDeps perl-Module-CoreList perl-Module-Build perl-CPAN perl-CPANPLUS perl-File-Remove perl-Module-Install

下载node和manager软件
#node git 地址:https://github.com/yoshinorim/mha4mysql-node
#manager git 地址:https://github.com/yoshinorim/mha4mysql-manager

node 所有机器都要安装
manager 只需要管理节点安装

[root@manager ~]yum -y install git clone https://github.com/yoshinorim/mha4mysql-node.git
[root@manager ~]yum -y install git clone  https://github.com/yoshinorim/mha4mysql-manager.git

可离线下载

管理节点安装

安装MHA
解压manager/node的tar.gz包
master和slave安装node即可

[root@manager ~]tar -zxvf mha4mysql-manager-0.58.tar.gz -C /usr/local/mha/
[root@manager ~]tar -zxvf mha4mysql-node-0.58.tar.gz -C /usr/local/mha/

manager配置

[root@manager ~]cd /usr/local/mha/mha4mysql-manager-0.58
[root@manager mha4mysql-manager-0.58]#perl Makefile.PL
[root@manager mha4mysql-manager-0.58]#....................
[root@manager mha4mysql-manager-0.58]#make && make install
[root@manager mha4mysql-manager-0.58]#....................
[root@manager mha4mysql-manager-0.58]#cd /usr/local/mha/mha4mysql-node-0.58
[root@manager mha4mysql-node-0.58]#perl Makefile.PL
[root@manager mha4mysql-node-0.58]#....................
[root@manager mha4mysql-node-0.58]#make && make install
[root@manager mha4mysql-node-0.58]#....................

注意:
在perl Makefile.PL时,可能会出现类似Can’t locate inc/Module/XXX.pm in @INC的报错
这是由于缺少组件造成的,只需要安装相应附件
例: yum -y install perl-Module-XXX 一般有对应的名字插件,安装就好
#node方面的都已经配好了,然后是manager节点的操作
其他(master/slave1/slave2)安装node节点的类似
配置 Manager 节点,以下步骤都是Manager节点操作
#新建MHA配置文件

[root@manager ~]# mkdir /var/log/mha/app1 -p
[root@manager ~]# touch /var/log/mha/app1/manager.log
[root@manager ~]# vi /etc/masterha.cnf
[server default]
#监控用户
#mysql创建的mha监控用户
user=mha
password=123456
#ssh 用户
ssh_user=root
#slave 用户--mysql创建的同步用户
repl_user=tongbu
repl_password=123456
#ping 三次不通判断失联
ping_interval=3
#使用其他主机去ping,判断是否主机本身故障
secondary_check_script=masterha_secondary_check -s 192.168.3.102 -s 192.168.3.103 -s 192.168.3.104
#相关脚本位置,都要自建,默认是没有的
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script= /usr/local/bin/master_ip_online_change
report_script=/usr/local/bin/send_report
#指定MHA日志目录
manager_workdir=/var/log/mha/app1
manager_log=/var/log/mha/app1/manager.log
#指定bin-log位置--master_binlog_dir的参数需要与master主配置文件 /etc/my.cnf 的datadir一致才可以
master_binlog_dir=/data/mysql
remote_workdir=/var/log/mha/mysqltmp
[server1]
hostname=192.168.3.102
port=3306
[server2]
hostname=192.168.3.103
port=3306
#是否无视落后进度让他成为master
candidate_master=1
check_repl_delay=0
[server3]
hostname=192.168.3.104
port=3306
#是否无视落后进度让他成为master
candidate_master=1
check_repl_delay=0

#manager和master在同一台服务器上时使用
#[server3]
#hostname=192.168.3.101
#永远不会成为master。多用于manager
#no_master=1
#port=3306 

#配置VIP
#为了防止脑裂发生,推荐生产环境采用脚本的方式来管理虚拟 ip,而不是使用 keepalived来完成

vi /usr/local/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
);
#定义VIP变量
#此处修改VIP地址,预先选择的VIP地址
my $vip = '192.168.3.100/24';
my $key = '1';
#修改ifconfig之后的网卡名,其他地方都不要改动
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";
               exit 0;
       }
       else {
               &usage();
               exit 1;
       }
}
sub start_vip() {
       `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
sub stop_vip() {
       return 0 unless ($ssh_user);
       `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";
} 

#配置报警邮件脚本
#安装邮件
yum install mailx -y

vi /etc/mail.rc
 #修改mail配置文件,在配置文件最后新增
#邮箱地址
set from=*****@163.com
#邮箱的smtp地址
set smtp=*****.163.com
#邮箱的用户名
set smtp-auth-user=*****
#这个并非邮箱密码,而是授权码
set smtp-auth-password=*****
set smtp-auth=login
vi /usr/local/bin/send_report
#!/bin/bash
source /root/.bash_profile
orig_master_host=`echo "$1" | awk -F = '{print $2}'`
new_master_host=`echo "$2" | awk -F = '{print $2}'`
new_slave_hosts=`echo "$3" | awk -F = '{print $2}'`
subject=`echo "$4" | awk -F = '{print $2}'`
body=`echo "$5" | awk -F = '{print $2}'`
email="ywzj_001@163.com"
tac /var/log/mha/app1/manager.log | sed -n 2p | grep 'successfully' > /dev/null
if [ $? -eq 0 ]
       then
       messages=`echo -e "MHA $subject 主从切换成功\n master:$orig_master_host -->
$new_master_host \n $body \n 当前从库:$new_slave_hosts"`
       echo "$messages" | mail -s "Mysql 实例宕掉,MHA $subject 切换成功" $email >
>/tmp/mailx.log 2>&1
       else
       messages=`echo -e "MHA $subject 主从切换失败\n master:$orig_master_host -->
$new_master_host \n $body" `
       echo "$messages" | mail -s ""Mysql 实例宕掉,MHA $subject 切换失败"" $email
>>/tmp/mailx.log 2>&1
fi 

#配置VIP更换脚本

vi /usr/local/bin/master_ip_online_change

#预先选择的VIP地址

 vip=`echo '192.168.3.100/24'`
key=`echo '1'`
command=`echo "$1" | awk -F = '{print $2}'`
orig_master_host=`echo "$2" | awk -F = '{print $2}'`
new_master_host=`echo "$7" | awk -F = '{print $2}'`
orig_master_ssh_user=`echo "${12}" | awk -F = '{print $2}'`
new_master_ssh_user=`echo "${13}" | awk -F = '{print $2}'`
#修改网卡名称
stop_vip=`echo "ssh root@$orig_master_host /usr/sbin/ifconfig ens33:$key down"`
start_vip=`echo "ssh root@$new_master_host /usr/sbin/ifconfig ens33:$key $vip"`
if [ $command = 'stop' ]
 then
   echo -e "\n\n\n****************************\n"
   echo -e "Disabled thi VIP - $vip on old master: $orig_master_host \n"
   $stop_vip
   if [ $? -eq 0 ]
     then
       echo "Disabled the VIP successfully"
     else
       echo "Disabled the VIP failed"
   fi
   echo -e "***************************\n\n\n"
 fi
       if [ $command = 'start' -o $command = 'status' ]
 then
   echo -e "\n\n\n*************************\n"
   echo -e "Enabling the VIP - $vip on new master: $new_master_host \n"
   $start_vip
   if [ $? -eq 0 ]
     then
       echo "Enabled the VIP successfully"
     else
       echo "Enabled the VIP failed"
   fi
   echo -e "***************************\n\n\n"
fi 

#赋予脚本权限
#*代表之前创建的三个脚本

chmod 555 /usr/local/bin/*
chmod 555 /usr/local/bin/master_ip_failover
chmod 555 /usr/local/bin/master_ip_online_change
chmod 555 /usr/local/bin/send_report

#测试MHA设置是否正确

masterha_check_repl --conf=/etc/masterha.cnf 

部分报错及解决方法:

Fri Mar 11 14:34:47 2022 - [info]   Connecting to root@192.168.3.102(192.168.3.102:22).. 
Failed to save binary log: Binlog not found from /opt/mysql/log/! If you got this error at MHA Manager, please set "master_binlog_dir=/path/to/binlog_directory_of_the_master" correctly in the MHA Manager's configuration file and try again.
 at /usr/local/bin/save_binary_logs line 123.
	eval {...} called at /usr/local/bin/save_binary_logs line 70
	main::main() called at /usr/local/bin/save_binary_logs line 66
Fri Mar 11 14:34:47 2022 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln161] Binlog setting check failed!
Fri Mar 11 14:34:47 2022 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln408] Master configuration failed.
Fri Mar 11 14:34:47 2022 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln427] Error happened on checking configurations.  at /usr/local/bin/masterha_check_repl line 48.
Fri Mar 11 14:34:47 2022 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln525] Error happened on monitoring servers.
Fri Mar 11 14:34:47 2022 - [info] Got exit code 1 (Not master dead).

MySQL Replication Health is NOT OK!
 解决方法:
 此时是因为manager的配置文件vim vim /etc/masterha.cnf
master_binlog_dir=/usr/local/mysql/data
需要与master主配置文件 /etc/my.cnf 一致才可以
datadir=/data/mysql



Wed Mar  2 15:41:32 2022 - [error][/usr/local/share/perl5/MHA/Server.pm, ln180] Got MySQL error when connecting 192.168.3.101(192.168.3.101:3306) :1045:Access denied for user 'mha'@'manager' (using password: YES), but this is not a MySQL crash. Check MySQL server settings.
Wed Mar  2 15:41:32 2022 - [error][/usr/local/share/perl5/MHA/ServerManager.pm, ln301]  at /usr/local/share/perl5/MHA/ServerManager.pm line 297.
Wed Mar  2 15:41:33 2022 - [error][/usr/local/share/perl5/MHA/ServerManager.pm, ln309] Got fatal error, stopping operations
Wed Mar  2 15:41:33 2022 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln427] Error happened on checking configurations.  at /usr/local/share/perl5/MHA/MasterMonitor.pm line 329.
Wed Mar  2 15:41:33 2022 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln525] Error happened on monitoring servers.
Wed Mar  2 15:41:33 2022 - [info] Got exit code 1 (Not master dead).

MySQL Replication Health is NOT OK!
解决方法:
用户权限问题:
grent......
failed.....


Fri Mar 11 14:56:43 2022 - [info]   Connecting to root@192.168.3.103(192.168.3.103:22).. 
Can't exec "mysqlbinlog": No such file or directory at /usr/local/share/perl5/MHA/BinlogManager.pm line 106.
mysqlbinlog version command failed with rc 1:0, please verify PATH, LD_LIBRARY_PATH, and client options
 at /usr/local/bin/apply_diff_relay_logs line 532.
Fri Mar 11 14:56:43 2022 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln208] Slaves settings check failed!
Fri Mar 11 14:56:43 2022 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln416] Slave configuration failed.
Fri Mar 11 14:56:43 2022 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln427] Error happened on checking configurations.  at /usr/local/bin/masterha_check_repl line 48.
Fri Mar 11 14:56:43 2022 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln525] Error happened on monitoring servers.
Fri Mar 11 14:56:43 2022 - [info] Got exit code 1 (Not master dead).

MySQL Replication Health is NOT OK!
解决方法:
ln -s /usr/local/mysql/bin/mysqlbinlog  /usr/bin/mysqlbinlog
ln -s /home/mysql/mysql/bin/mysqlbinlog /usr/local/bin/mysqlbinlog 




Fri Mar 11 15:12:08 2022 - [info]   Connecting to root@192.168.3.103(192.168.3.103:22).. 
Creating directory /var/log/mha/mysqltmp.. done.
  Checking slave recovery environment settings..
    Opening /data/mysql/relay-log.info ... ok.
    Relay log found at /data/mysql, up to mysql-relay-bin.000003
    Temporary relay log file is /data/mysql/mysql-relay-bin.000003
    Checking if super_read_only is defined and turned on.. not present or turned off, ignoring.
    Testing mysql connection and privileges..
sh: mysql: command not found
mysql command failed with rc 127:0!
 at /usr/local/bin/apply_diff_relay_logs line 404.
	main::check() called at /usr/local/bin/apply_diff_relay_logs line 536
	eval {...} called at /usr/local/bin/apply_diff_relay_logs line 514
	main::main() called at /usr/local/bin/apply_diff_relay_logs line 121
Fri Mar 11 15:12:09 2022 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln208] Slaves settings check failed!
Fri Mar 11 15:12:09 2022 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln416] Slave configuration failed.
Fri Mar 11 15:12:09 2022 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln427] Error happened on checking configurations.  at /usr/local/bin/masterha_check_repl line 48.
Fri Mar 11 15:12:09 2022 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln525] Error happened on monitoring servers.
Fri Mar 11 15:12:09 2022 - [info] Got exit code 1 (Not master dead).

MySQL Replication Health is NOT OK!

解决方法:
ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql

。。。
MySQL Replication Health is OK.

最后 显示OK,才算正常,否则就要看报错信息,按照之前的操作配置,基本不会有错误。
#在主库,而不是Manager管理口,配置VIP到网口
/usr/sbin/ifconfig ens33:192.168.3.100/24
注意:如果是最小化安装,需yum ifconfig
yum -y install net-tools

#在Manager节点操作
#启动MHA
nohup masterha_manager --conf=/etc/masterha.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &
#检查状态
[root@mha03 bin]# masterha_check_status --conf=/etc/masterha.cnf
masterha (pid:15546) is running(0:PING_OK), master:192.168.157.128
#显示OK则正常

VIP转换测试:
第一次配置VIP时,需要手动添加主库的虚拟IP:

[root@master ~]# ifconfig ens33:1 192.168.3.100/24
[root@master ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:75:fb:df brd ff:ff:ff:ff:ff:ff
    inet 192.168.3.102/24 brd 192.168.3.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.3.100/24 brd 192.168.3.255 scope global secondary ens33:1
       valid_lft forever preferred_lft forever

然后重启MHA:

[root@manager ~]# masterha_stop --conf=/etc/masterha.cnf
Stopped masterha successfully.
[root@manager ~]# nohup masterha_manager --conf=/etc/masterha.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &
[1] 17520

测试是否配置成功:
能否进行IP漂移
查看manager状态:

[root@manager ~]# masterha_check_status --conf=/etc/masterha.cnf
masterha (pid:17520) is running(0:PING_OK), master:192.168.3.102
[1] 17520

停止主库mysql

[root@master ~]# service mysql stop
Shutting down MySQL............ SUCCESS! 

再次查看manager状态:

[root@manager ~]# masterha_check_status --conf=/etc/masterha.cnf
masterha is stopped(2:NOT_RUNNING).
[1]+  Done                    nohup masterha_manager --conf=/etc/masterha.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1

MHA集群只处理一次vip漂移,之后停止运行,请及时修复

查看navicat正常连接vip,vip漂移成功
查看slave1及slave2状态

slave1----mysql> show slave status \G;
Empty set (0.00 sec)

slave2--mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.3.103

可查看到主节点切换到192.168.3.103服务器上

[root@manager ~]# masterha_check_status --conf=/etc/masterha.cnf
masterha is stopped(2:NOT_RUNNING).
[1]+  Done                    nohup masterha_manager --conf=/etc/masterha.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1

修复主库:

[root@master ~]# service mysql start
Starting MySQL. SUCCESS!
mysql> change master to
    -> master_host='192.168.3.103',
    -> master_port=3306,
    -> master_auto_position=0,
    -> master_user='tongbu',
    -> master_password='123456';
mysql> start slave;
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.3.103
                  Master_User: tongbu
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 6508
               Relay_Log_File: master-relay-bin.000003
                Relay_Log_Pos: 1848
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 

Slave_IO_Running: 和Slave_SQL_Running:都显示yes主库修复完成
确保起见请自行查看主库与从库数据是否一致

到这一步,主从就已经修复完成,然后继续修复mha中manager的配置文件:

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

添加节点信息

[server1]
candidate_master=1
check_repl_delay=0
hostname=192.168.3.102
port=3306

重启manager服务

[root@manager ~]# nohup masterha_manager --conf=/etc/masterha.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &

查看manager状态

[root@manager ~]# masterha_check_status --conf=/etc/masterha.cnf
masterha (pid:18821) is running(0:PING_OK), master:192.168.3.103

修复完成!!!

手动切换主库信息:
1:先关闭mha

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

执行切换语句:

masterha_master_switch --conf=/etc/masterha.cnf --master_state=alive  --new_master_host=192.168.3.102  --orig_master_is_new_slave --running_updates_limit=10000 --interactive=0 

检查每个库状态,查看是否切换成功:

mysql> show slave status\G;

开启mha

[root@manager ~]# nohup masterha_manager --conf=/etc/masterha.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &

再次检查mha状态:

[root@manager ~]# masterha_check_status --conf=/etc/masterha.cnf
masterha (pid:6139) is running(0:PING_OK), master:192.168.3.102

参数详解:

--master_state=dead
    强制的参数,参数值为"dead" 或者 "alive" . 如果 设置为 alive 模式,masterha_master_switch 开始在线主库切换操作。

--dead_master_host=(hostname)
    强制参数,宕机的主库所在的主机名称。--dead_master_ip 和 --dead_master_port 是可选参数,如果这些参数没有设置,--dead_master_ip 就是 --dead_master_host 解析的IP地址。--dead_master_port 为 3306

--new_master_host=(hostname)
    新主机地址,可选参数,这个参数在你明确新的主库的主机,非常有用。(这就意味着你不需要让MHA来决定新的主库)。如果不设置此参数,MHA 将会利用自动failover的规则来选择新的主库。如果设置--new_master_host,MHA选择此主机为新的主库,如果不能成为主库,MHA将会退出

--interactive=(0|1)
    如果设置为0,在masterha_master_switch,它自动执行故障转移(非交互式)。这实际上是和masterha_manager的内部运行机制一样,这种非交互式故障转移是有用的,如果你已经证实了master死了,但你想尽快做故障转移。非交互式故障转移也是有用的,如果你使用其他现有的主监控软件和要调用的非交互式故障转移命令软件。典型的例子是masterha_master_switch调用从集群软件像起搏器。

--ssh_reachable=(0|1|2)
    指定master 经过SSH是否可达。0:不可达、1:可达、2:未知(默认值)。 如果设置为了2,此命令内部将会检测通过SSH 是否可达master,并且跟新SSH 状态。如果可达,且设置master_ip_failover_script 或者 shutdown_script .将会执行"--command=stopssh"。否则,执行 "--command=stop"。另外,如果宕机的master通过SSH可达,failover脚本试图从宕机的master机器上拷贝没有没有发送的binlog。

--skip_change_master
    如果设置此参数,当发生failover的时候,MAH 在应用完不同的relay log退出,忽略CHANGE MASTER 和 START SLAVE 操作。所以 slaves 不会指向 新的master. 开启此参数,有利于手动的二次检查slave 恢复是否成功

--skip_disable_read_only
    设置此参数,MHA 将不会在新的主库上执行 SET GLOBAL read_only =0 操作,有利于手动操作

--last_failover_minute=(minutes)
    参考master_manager 

--ignore_last_failover
    参考master_manager

--wait_on_failover_error=(seconds)
    类似于master_manager, 此参数只用于自动的/非交互式的failover。如果没有设置--interval=0,wait_on_failover_error 将会被忽略,在发生错误的时候不会sleep。

--remove_dead_master_conf
    参考masterha_manager

--wait_until_gtid_in_sync(0|1)
    此参数从0.56版本开始可用,如果设置成1,当基于GITD的failover时,MHA 会等待所有的从库追上新主库的GITD

--skip_change_master
    此参数从0.56版本开始可用,如果开启此选项,MHA 跳过 CHANGE MASTER 的操作

--skip_disable_read_only
    此参数从0.56版本开始可用,如果开启此选项,MHA 将会在新的master 跳过 SET GLOBAL read_only = 0;

--ignore_binlog_server_error
    此参数从0.56版本开始可用,如果开启此选项,当执行failover的时,MHA忽略binlog server上任何错误

切换主库

        有时你可能想做预定的主切换,即使当前的master正在运行。典型的例子是取代部分损坏的硬件或升级主服务器。你不能取代一个RAID控制器或增加内存没有停止服务器。在这种情况下,您需要分配一个预定的维护时间,你必须迁移到不同的服务器的master。
masterha_master_switch命令可以用来运行计划总开关。
$ masterha_master_switch --master_state=alive --conf=/etc/app1.cnf --new_master_host=host2
--master_state=alive必须设置。调度主开关的程序流与从主故障转移有稍微的不同。例如,你不需要关闭主服务器,但你需要确保写查询不在主上执行。通过设置主ip网上变更脚本,您可以控制阻塞当前master不允许写(即drop可写的用户,设置read_only = 1,等等)在执行FLUSH TABLES WITH READ LOCK,和如何让写在新master。
Online master switch开始只有当所有下列条件得到满足。
 1. IO threads on all slaves are running   // 在所有slave上IO线程运行。
 2. SQL threads on all slaves are running  //SQL线程在所有的slave上正常运行。
 3. Seconds_Behind_Master on all slaves are less or equal than --running_updates_limit seconds  // 在所有的slaves上 Seconds_Behind_Master 要小于等于  running_updates_limit seconds
 4. On master, none of update queries take more than --running_updates_limit seconds in the show processlist output  // 在主上,没有更新查询操作多于running_updates_limit seconds 在show processlist输出结果上。
这些限制的原因是出于安全原因,并尽快切换到新主库。masterha_master_switch需要以下参数切换时主在线。

    --new_master_host=(hostname)
        新主机地址,可选参数,这个参数在你明确新的主库的主机,非常有用。(这就意味着你不需要让MHA来决定新的主库)。如果不设置此参数,MHA 将会利用自动failover的规则来选择新的主库。如果设置--new_master_host,MHA选择此主机为新的主库,如果不能成为主库,MHA将会退出

   --orig_master_is_new_slave
        当完成主库切换后,原先的主库将作为现在主库的slave运行。默认:不开启(原先的主库不会加入到新的复制环境中)。如果开启此选项,需要在配置文件中设置repl_password参数,由于当期的Master并不知道新的Master的replication的密码

  --remove_orig_master_conf 
        如果设置此参数,当成功failover后,MHA manager将会自动删除配置文件中关于dead master的配置选项。

  --skip_lock_all_tables
        当在做主库切换的时候,MHA会在原先的主库上执行FLUSH TABLES WITH READ LOCK 操作,确保没有跟新操作,但是FLUSH TABLES WITH READ LOCK 操作是非常耗费资源的,并且你可以在原先的主库确定没有跟新操作(通过master_ip_online_change_script 中kill all clients操作等)。可以利用此选项避免锁表。

mha日常维护命令:
1.查看ssh登陆是否成功
masterha_check_ssh --conf=/etc/masterha.cnf

2.查看复制是否建立好
masterha_check_repl --conf=/etc/masterha.cnf

3.启动mha
nohup masterha_manager --conf=/etc/masterha.cnf > /tmp/mha_manager.log < /dev/null 2>&1 &
当有slave节点宕掉的情况是启动不了的,加上–ignore_fail_on_start即使有节点宕掉也能启动mha
nohup masterha_manager --conf=/etc/masterha.cnf --ignore_fail_on_start > /tmp/mha_manager.log < /dev/null 2>&1 &

4.检查启动的状态
masterha_check_status --conf=/etc/masterha.cnf

5.停止mha
masterha_stop --conf=/etc/masterha.cnf

6.failover后下次重启
每次failover切换后会在管理目录生成文件app1.failover.complete ,下次在切换的时候会发现有这个文件导致切换不成功,需要手动清理掉。
rm -rf /masterha/app1/app1.failover.complete
也可以加上参数–ignore_last_failover

7.手工failover
手工failover场景,master死掉,但是masterha_manager没有开启,可以通过手工failover:
masterha_master_switch --conf=/etc/masterha.cnf --dead_master_host=10.50.2.10 --master_state=dead --new_master_host=10.50.2.12 --ignore_last_failover

8.masterha_manager是一种监视和故障转移的程序。另一方面,masterha_master_switch程序不监控主库。 masterha_master_switch可以用于主库故障转移,也可用于在线总开关。

9.手动在线切换
masterha_master_switch --conf=/etc/app1.cnf --master_state=alive --new_master_host=192.168.119.74 --orig_master_is_new_slave
或者
masterha_master_switch --conf=/etc/app1.cnf --master_state=alive --new_master_host=192.168.119.74 --orig_master_is_new_slave --running_updates_limit=10000 --orig_master_is_new_slave切换时加上此参数是将原master变为slave节点,如果不加此参数,原来的master将不启动
–running_updates_limit=10000 切换时候选master如果有延迟的话,mha切换不能成功,加上此参数表示延迟在此时间范围内都可切换(单位为s),但是切换的时间长短是由recover时relay日志的大小决定
手动在线切换mha,切换时需要将在运行的mha停掉后才能切换。
在备库先执行DDL,一般先stop slave,一般不记录mysql日志,可以通过set SQL_LOG_BIN = 0实现。然后进行一次主备切换操作,再在原来的主库上执行DDL。这种方法适用于增减索引,如果是增加字段就需要额外注意。
可以通过如下命令停止mha
masterha_stop --conf=/etc/app1.cnf

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值