**

本文针对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_keysto 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 ]thenmessages=`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>&1elsemessages=`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' ]thenecho -e "\n\n\n****************************\n"echo -e "Disabled thi VIP - $vip on old master: $orig_master_host \n"$stop_vipif [ $? -eq 0 ]thenecho "Disabled the VIP successfully"elseecho "Disabled the VIP failed"fiecho -e "***************************\n\n\n"fiif [ $command = 'start' -o $command = 'status' ]thenecho -e "\n\n\n*************************\n"echo -e "Enabling the VIP - $vip on new master: $new_master_host \n"$start_vipif [ $? -eq 0 ]thenecho "Enabled the VIP successfully"elseecho "Enabled the VIP failed"fiecho -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 70main::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/mysqlWed 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 optionsat /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.000003Temporary relay log file is /data/mysql/mysql-relay-bin.000003Checking 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 536eval {...} called at /usr/local/bin/apply_diff_relay_logs line 514main::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 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::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 1000link/ether 00:0c:29:75:fb:df brd ff:ff:ff:ff:ff:ffinet 192.168.3.102/24 brd 192.168.3.255 scope global noprefixroute ens33valid_lft forever preferred_lft foreverinet 192.168.3.100/24 brd 192.168.3.255 scope global secondary ens33:1valid_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 eventMaster_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 eventMaster_Host: 192.168.3.103Master_User: tongbuMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000002Read_Master_Log_Pos: 6508Relay_Log_File: master-relay-bin.000003Relay_Log_Pos: 1848Relay_Master_Log_File: mysql-bin.000002Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_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 seconds4. 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

mysql配置MHA集群相关推荐

  1. MySQL 部署MHA集群部署

    目录 MySQL 部署MHA集群部署 MHA集群概述 MHA介绍 MHA简介 MHA组成 MHA工作过程 MHA集群架构 MHA工作过程 拓扑结构 IP规划 拓扑图 部署MHA集群 准备集群环境 安装 ...

  2. 三十六.MHA集群概述 、 部署MHA集群 测试配置

    1.准备MHA集群环境 准备6台虚拟机,并按照本节规划配置好IP参数 在这些虚拟机之间实现SSH免密登录 在相应节点上安装好MHA相关的软件包 使用6台RHEL 7虚拟机,如图-1所示.准备集群环境, ...

  3. Step By Step 搭建 MySql MHA 集群

    关于MHA    MHA(Master High Availability)是一款开源的mysql高可用程序,目前在mysql高可用方面是一个相对成熟的解决方案.MHA 搭建的前提是MySQL集群中已 ...

  4. 部署mysql MHA集群

    MHA 集群 集群:使用多台服务器提供相同的服务 集群类型:LB(负载均衡集群) HA (高可用集群) 拓扑结构 master51|| | | | | | slave52 slave53 slave5 ...

  5. mysql MHA 集群搭建

    MHA 集群 集群:使用多台服务器提供相同的服务 集群类型:LB(负载均衡集群) HA (高可用集群) 拓扑结构 master51|| | | | | | slave52 slave53 slave5 ...

  6. window7 MySql Cluster数据库集群配置

    MySql Cluster数据库集群配置 先来看一张mysql集群的架构图: 上图一共分了四层:Applications.SQL.Storage.Management. –Applications主要 ...

  7. 如何在Ubuntu 16.04上使用MySQL 5.6配置Galera集群

    原作者:梅丽莎安德森  转载翻译:https://www.digitalocean.com/community/tutorials/how-to-configure-a-galera-cluster- ...

  8. DBA(六):MHA集群

    MHA集群概述 MHA介绍 MHA(Master High Availability) 由日本DeNA公司youshimaton开发 是一套优秀的实现MySQL高可用的解决方案 数据库的自动解决故障切 ...

  9. Docker搭建MySQL的PXC集群

    一.简介 PXC属于一套近乎完美的mysql高可用集群解决方案,相比那些比较传统的基于主从复制模式的集群架构MHA和MM+keepalived,galera cluster最突出特点就是解决了诟病已久 ...

最新文章

  1. 【干货】新手炼丹经验总结
  2. 程序员出身,身价 340 亿!没有他,可能我们刷不了 B 站
  3. 现代信用卡管理(二)
  4. 但这是不可能的,或者无法发现JIT破坏了您的代码。
  5. oracle账户解锁28000,oracle 下载 账号密码ORA-28000账户被锁和解锁
  6. Google 正式开源 Jib ,帮助 Java 应用快速容器化
  7. 白盒测试六种方法案例分析
  8. 测试人员做到这几点,线上80%的BUG将落入你手,企业将避免重大风险
  9. machine learning for hacker记录(3) 贝叶斯分类器
  10. 收藏 | OpenCV新手入门预处理
  11. java8四大核心函数式接口(模拟实现,全网最通俗易懂)
  12. 机器学习实战(四)逻辑回归LR(Logistic Regression)
  13. 微信小程序从云开发到上线
  14. 第一个web项目-微信小程序后端开发
  15. At91sam9g35K烧录Linux系统
  16. 【直击DTCC】宝存CEO阳学仕:如何保障SSD的IO确定性?
  17. LabVIEW崩溃后如何排查故障
  18. 【angular学习】自定义实现双向绑定
  19. Halide(win10vs2019环境搭建)小试牛刀
  20. 网络安全热门资料 精品工具——下载目录

热门文章

  1. 解决 Element-ui 按钮点击放开后 不会自动失焦 仍是悬停样式
  2. 人工智能的基本概念与分类
  3. ROS+Opencv的双目相机标定和orbslam双目参数匹配
  4. 微信小程序 登录失效后处理
  5. SAP请求TR管理小技巧(持续更新)
  6. 最简单的微信视频号下载方法,收藏备用超级实用
  7. 嘉霖浦厨卫荣膺国际设计大奖 全方位展现品牌实力
  8. 微信小程序中使用echart、动态加载几条折线
  9. 红台发图微信后台发送教程
  10. Kubernetes CKA认证运维工程师笔记-Kubernetes安全