export LANG=en_US

机器 VPN ip linux 账号/密码
manager2 172.28.20.131 10.1.1.11 
mysql2 - z(主) 172.28.20.133 10.1.1.13 
mysql2 - c(从) 172.28.20.135 10.1.1.15 
mysql2 - b(备) 172.28.20.137 10.1.1.17

1.部署MHA

接下来部署MHA,具体的搭建环境如下(所有操作系统均为centos 6.2 64bit,不是必须,server03和server04是server02的从,复制环境搭建后面会简单演示,但是相关的安全复制不会详细说明,需要的童鞋请参考前面的文章,MySQL Replication需要注意的问题):

角色 ip地址 主机名 server_id 类型
Monitor host 192.168.0.20 148 server01 - 监控复制组
Master 192.168.0.50 145 server02 1 写入
Candicate master 192.168.0.60 146 server03 2 读
Slave 192.168.0.70 147 server04 3 读

MHA软件由两部分组成,Manager工具包和Node工具包,具体的说明如下。
其中master对外提供写服务,备选master(实际的slave,主机名server03)提供读服务,slave也提供相关的读服务,一旦master宕机,将会把备选master提升为新的master,slave指向新的master

[root@jspospdb ~]# mysql -uroot -proot
[root@jspospdb-bak ~]# service mysqld start

(1)在所有 节点 安装MHA node所需的perl模块(DBD:mysql),安装脚本如下:

export LANG=en_US

[root@192.168.0.145 ~]# cat install.sh
#!/bin/bash
wget http://xrl.us/cpanm --no-check-certificate
mv cpanm /usr/bin
chmod 755 /usr/bin/cpanm
cat > /root/list << EOF
install DBD::mysql
EOF
for package in `cat /root/list`
do
cpanm $package
done

如果有安装epel源,也可以使用yum安装
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

rpm -qa |grep -i dbd

[root@ums-data-bak bai]# yum install perl-DBD-MySQL -y

(2)在所有的节点安装mha node:
# tar zxvf mha4mysql-node-0.56.tar.gz
# cd mha4mysql-node-0.56
# perl Makefile.PL
# make && make install

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
报错一:
[root@jspospdb-manager mha4mysql-node-0.56]# perl Makefile.PL
Can't locate Module/Install/Admin.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at inc/Module/Install.pm line 160.
BEGIN failed--compilation aborted at Makefile.PL line 1.
[root@jspospdb-manager mha4mysql-node-0.56]#

解决办法:
yum install cpan -y
yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker -y
cpan ExtUtils::Install

如果不想用cpan安装,那就使用下面这条命令

yum install perl-ExtUtils-Embed -y

yum -y install perl-CPAN

解决方法:

export LANG=en_US
yum install perl-Mail-Sender
yum install perl-Log-Dispatch

注意:mha是由perl编写,因此依赖perl模块,我们使用epel源来安装相关perl模块。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

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

[root@192.168.0.50 bin]# cd /usr/local/bin
[root@192.168.0.50 bin]# ll
total 40
-r-xr-xr-x 1 root root 15498 Apr 20 10:05 apply_diff_relay_logs
-r-xr-xr-x 1 root root 4807 Apr 20 10:05 filter_mysqlbinlog
-r-xr-xr-x 1 root root 7401 Apr 20 10:05 purge_relay_logs
-r-xr-xr-x 1 root root 7263 Apr 20 10:05 save_binary_logs

(2)安装MHA Manager。首先安装MHA Manger依赖的perl模块(我这里使用yum安装):

manager

yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes -y

#这两个yum没有安装上 perl-Log-Dispatch perl-Parallel-ForkManager
yum install perl-Mail-Sender
yum install perl-Log-Dispatch

wget http://rpmfind.net/linux/dag/redhat/el6/en/x86_64/dag/RPMS/perl-Log-Dispatch-2.26-1.el6.rf.noarch.rpm

wget ftp://rpmfind.net/linux/dag/redhat/el6/en/x86_64/dag/RPMS/perl-Parallel-ForkManager-0.7.5-2.2.el6.rf.noarch.rpm

wget ftp://rpmfind.net/linux/dag/redhat/el6/en/x86_64/dag/RPMS/perl-Mail-Sender-0.8.16-1.el6.rf.noarch.rpm

wget ftp://rpmfind.net/linux/dag/redhat/el6/en/x86_64/dag/RPMS/perl-Mail-Sendmail-0.79-1.2.el6.rf.noarch.rpm

rpm -ivh perl-Config-Tiny-2.12-1.el6.rfx.noarch.rpm & rpm -ivh perl-Mail-Sender-0.8.16-1.el6.rf.noarch.rpm & rpm -ivh perl-Mail-Sendmail-0.79-1.2.el6.rf.noarch.rpm & rpm -ivh perl-Net-Telnet-3.03-2.el6.rfx.noarch.rpm
yum localinstall perl-Log-Dispatch-2.26-1.el6.rf.noarch.rpm
yum localinstall perl-Parallel-ForkManager-0.7.5-2.2.el6.rf.noarch.rpm

rpm -qa |grep -i perl-Net-Telnet
rpm -qa |grep -i perl-Mail
rpm -qa |grep -i perl-Log
rpm -qa |grep -i perl-Config
rpm -qa |grep -i perl-Parallel

任何包下载去这个网址搜索:
http://rpm.pbone.net/index.php3/stat/4/idpl/16393956/dir/redhat_el_6/com/perl-Config-Tiny-2.12-1.el6.rfx.noarch.rpm.html

http://www.rpmfind.net/linux/rpm2html/search.php?query=perl(Log%3A%3ADispatch%3A%3AFile)

[root@DB-mysql1-b bin]# rpm -qa |grep -i dbd
perl-DBD-SQLite-1.27-3.el6.x86_64
perl-DBD-MySQL-4.013-3.el6.x86_64
[root@DB-mysql1-b bin]# rpm -e --nodeps perl-DBD-SQLite-1.27-3.el6.x86_64
[root@DB-mysql1-b bin]# rpm -e --nodeps perl-DBD-MySQL-4.013-3.el6.x86_64
[root@DB-mysql1-b bin]# yum install perl-DBD-MySQL -y

安装MHA Manager软件包:

wget http://mysql-master-ha.googlecode.com/files/mha4mysql-manager-0.53.tar.gz
tar zxvf mha4mysql-manager-0.56.tar.gz
cd mha4mysql-manager-0.56
perl Makefile.PL
make && make install

安装完成后会在/usr/local/bin目录下面生成以下脚本文件,前面已经说过这些脚本的作用,这里不再重复
[root@192.168.66.148 bin]# cd /usr/local/bin
[root@192.168.66.148 bin]# ll

[root@ums-data-manager ~]# cd /mha4mysql-manager-0.56/samples/scripts
[root@192.168.66.148 scripts]# cp * /usr/local/bin/

--------------------

3.配置SSH登录无密码验证(使用key登录,工作中常用)我的测试环境已经是使用key登录,服务器之间无需密码验证的。关于配置使用key登录,我想我不再重复。但是有一点需要注意:不能禁止 password 登陆,否则会出现错误

.配置SSH登录无密码验证 (每个节点都执行)

机器 VPN ip linux 账号/密码
manager1 172.28.20.130 10.1.1.10 
mysql1-z(主) 172.28.20.132 10.1.1.12 
mysql1-c(从) 172.28.20.134 10.1.1.14 
mysql1-b(备) 172.28.20.136 10.1.1.16

manager1 上

ssh-keygen -t rsa (连续按三下回车)
[root@ums-data ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.1.1.13
[root@ums-data ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.1.1.15
[root@ums-data ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.1.1.15

master上

ssh-keygen -t rsa (连续按三下回车)
[root@ums-data ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.1.1.15
[root@ums-data ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.1.1.17
[root@ums-data ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.1.1.11

slave1 上

ssh-keygen -t rsa (连续按三下回车)
[root@ums-data ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.1.1.12
[root@ums-data ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.1.1.16
[root@ums-data ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.1.1.10

slave2上

ssh-keygen -t rsa (连续按三下回车)
[root@ums-data ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.1.1.12
[root@ums-data ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.1.1.14
[root@ums-data ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.1.1.10

------------------------

4.搭建主从复制环境

[root@ums-data ~]# mysql -uroot -proot
mysql> show master status;
mysql> show slave status\G;

(2) 在node1 (Master)上备份一份完整的数据:
[root@ums-data mysql]# mysqldump -uroot -p --master-data=2 --single-transaction -R --triggers -A > all.sql
Enter password:
[root@ums-data mysql]#
其中--master-data=2代表备份时刻记录master的Binlog位置和Position。

还原数据库,用户权限要授权,刷新。

在mysql节点上,建立允许manager 访问数据库的“ manager manager ”账户,主要用于SHOW SLAVESTATUS,RESET SLAVE; 所以需要执行如下命令:

GRANT REPLICATION SLAVE,REPLICATION CLIENT,SELECT ON *.* TO 'repl'@'10.1.1.%' IDENTIFIED BY '123456';

grant SUPER,RELOAD,REPLICATION CLIENT,SELECT,replication slave on *.* to 'repl'@'192.168.66.%' identified by '123456' WITH GRANT OPTION;

grant all privileges on *.* to 'root'@'127.0.0.1' identified by 'root' WITH GRANT OPTION;
grant all privileges on *.* to 'root'@'localhost' identified by 'root' WITH GRANT OPTION;
flush privileges;

select Host,User from mysql.user where User='root';

从机器测试:
[root@DB-mysql1-c ~]# mysql -urepl -p123456 -h10.1.1.12
[root@DB-mysql1-c ~]# mysql -urepl -p123456 -h10.1.1.12 -P3306

第一台作为SLAVE Server

CHANGE MASTER TO
MASTER_HOST='10.1.1.12',
MASTER_USER='repl',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql_bin.000003',
MASTER_LOG_POS=634;

方法一 注意 POSITION 120 是指主服务器的 120日志位置 该位置之后才建立了复制账号 repl和数据库world_innodb
此时开始复制 start slave 日志位置120之后建立的账号、world_innodb全过来

mysql> show master status\G
mysql> start slave;
mysql> show slave status\G
mysql> stop slave;
mysql> start slave io_thread;
mysql> start slave sql_thread;

发现已经将虚拟ip 192.168.66.150 只绑定了 master 机器145网卡eth1上。
(4)查看绑定情况

/sbin/ifconfig eth0:1 192.168.66.150 netmask 255.255.255.0 up

/sbin/ifconfig eth0:1 10.1.1.19 netmask 255.255.255.0 up

4.比如要想删除刚添加的虚拟ip就用如下命令:

[root@ums-data-slave network-scripts]# /sbin/ip addr del 192.168.66.149/24 dev eth0
[root@ums-data-slave network-scripts]# /sbin/ifconfig eth0:1 192.168.66.149 netmask 255.255.255.0 down
[root@ums-data-slave network-scripts]# ip add

[root@ums-data etc]# ip addr | grep eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
inet 192.168.66.141/24 brd 192.168.66.255 scope global eth0
inet 192.168.66.149/24 brd 192.168.66.255 scope global secondary eth0:1

-----------------------------------------------------------------------------

(7)两台slave服务器设置read_only(从库对外提供读服务,只所以没有写进配置文件,是因为随时slave会提升为master)

mysql> show variables like '%read_only%';

[root@192.168.0.60 ~]# mysql -e 'set global read_only=1'
[root@192.168.0.60 ~]#
[root@192.168.0.70 ~]# mysql -e 'set global read_only=1'
[root@192.168.0.70 ~]#

(8)创建监控用户(在master上执行,也就是10.1.1.13):

复制代码
mysql> grant all privileges on *.* to 'root'@'10.1.1.%' identified by 'root';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

====================================================================================================
5.配置MHA

(1)创建MHA的工作目录,并且创建相关配置文件(在软件包解压后的目录里面有样例配置文件)。

[root@DB-manger1 ~]# mkdir -p /etc/masterha
[root@DB-manger1 ~]#cd /home/mha4mysql-manager-0.56/samples/conf/
[root@DB-manger1 conf]# ls
app1.cnf masterha_default.cnf
[root@DB-manger1 conf]# cp app1.cnf /etc/masterha/
[root@DB-manger1 conf]#

修改app1.cnf配置文件,修改后的文件内容如下(注意,配置文件中的注释需要去掉,我这里是为了解释清楚):

[root@192.168.66.148 ~]# cat /etc/masterha/app1.cnf
[server default]
manager_workdir=/var/log/masterha/app1 //设置manager的工作目录
manager_log=/var/log/masterha/app1/manager.log //设置manager的日志
master_binlog_dir=/data/mysql //设置master 保存binlog的位置,以便MHA可以找到master的日志,我这里的也就是mysql的数据目录
master_ip_failover_script= /usr/local/bin/master_ip_failover //设置自动failover时候的切换脚本
master_ip_online_change_script= /usr/local/bin/master_ip_online_change //设置手动切换时候的切换脚本
password=123456 //设置mysql中root用户的密码,这个密码是前文中创建监控用户的那个密码
user=root 设置监控用户root
ping_interval=1 //设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行railover
remote_workdir=/tmp //设置远端mysql在发生切换时binlog的保存位置
repl_password=123456 //设置复制用户的密码
repl_user=repl //设置复制环境中的复制用户名
report_script=/usr/local/send_report //设置发生切换后发送的报警的脚本
secondary_check_script= /usr/local/bin/masterha_secondary_check -s server03 -s server02
shutdown_script="" //设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机放在发生脑裂,这里没有使用)
ssh_user=root //设置ssh的登录用户名

[server1]
hostname=192.168.0.50
port=3306

[server2]
hostname=192.168.0.60
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.0.70
port=3306
[root@192.168.0.20 ~]#

---------------------------------------
在监控机10.1.1.11 上:
[root@DB-manger2 conf]# mkdir -p /var/log/masterha/app1/
[root@DB-manger2 conf]# touch /var/log/masterha/app1/manager.log
[root@DB-manger2 conf]#

[root@ums-data-manager app1.log]# vi /etc/masterha/app1.cnf

[server default]
manager_log=/var/log/masterha/app1/manager.log
manager_workdir=/var/log/masterha/app1
master_binlog_dir=/mysql/log
#master_ip_failover_script=/usr/local/bin/master_ip_failover
password=root
ping_interval=1
remote_workdir=/tmp
repl_password=123456
repl_user=repl
report_script=""
shutdown_script=""
ssh_user=root
user=root

[server1]
hostname=10.1.1.13
candidate_master=1
port=3306

[server2]
hostname=10.1.1.15
candidate_master=1
port=3306

[server3]
hostname=10.1.1.17
candidate_master=0
check_repl_delay=0
port=3306

---------------------------------------
(2)设置relay log的清除方式(在每个slave节点上):

mysql> show variables like '%relay_log%';

[root@192.168.0.60 ~]# mysql -e 'set global relay_log_purge=0'
[root@192.168.0.70 ~]# mysql -e 'set global relay_log_purge=0'

(3)设置定期清理relay脚本(两台slave服务器)

[root@DB-mysql2-c bin]# mkdir -p /mysql/purge_relay

[root@DB-mysql1-c ~]# cd /usr/local/bin/
[root@192.168.0.60 ~]# cat purge_relay_log.sh
#!/bin/bash
user=root
passwd=Woyee@117
port=3306
log_dir='/mysql/purge_relay'
work_dir='/mysql/purge_relay'
purge='/usr/local/bin/purge_relay_logs'

if [ ! -d $log_dir ]
then
mkdir $log_dir -p
fi

$purge --user=$user --password=$passwd --disable_relay_log_purge --port=$port --workdir=$work_dir >> $log_dir/purge_relay_logs.log 2>&1

[root@192.168.0.60 ~]#

添加到crontab定期执行

[root@192.168.0.60 ~]# crontab -l
0 4 * * * /usr/local/bin/purge_relay_log.sh

[root@jspospdb-slave ~]# chmod 755 purge_relay_log.sh

purge_relay_logs脚本删除中继日志不会阻塞SQL线程。下面我们手动执行看看什么情况。

mysql> grant all privileges on *.* to 'root'@'127.0.0.1' identified by 'root' WITH GRANT OPTION;
mysql> flush privileges;
mysql> select Host,User from mysql.user ;

测试下:

[root@DB-mysql1-c bin]# /usr/local/bin/purge_relay_logs --user=root --password=root --port=3306 -disable_relay_log_purge --workdir=/mysql/purge_relay/

2019-05-17 14:23:25: purge_relay_logs script started.
Opening /mysql/data/DB-mysql1-c-relay-bin.000001 ..
Opening /mysql/data/DB-mysql1-c-relay-bin.000002 ..
Executing SET GLOBAL relay_log_purge=1; FLUSH LOGS; sleeping a few seconds so that SQL thread can delete older relay log files (if it keeps up); SET GLOBAL relay_log_purge=0; .. ok.
2019-05-17 14:23:28: All relay log purging operations succeeded.

====================================================================================

mysql -uroot -proot
GRANT REPLICATION SLAVE,REPLICATION CLIENT,SELECT ON *.* TO 'repl'@'10.1.1.%' IDENTIFIED BY '123456';
flush privileges;
select host ,user from mysql.user;

6.检查SSH配置

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

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

#验证mysql复制

wget ftp://rpmfind.net/linux/dag/redhat/el6/en/x86_64/extras/RPMS/perl-Net-Telnet-3.03-2.el6.rfx.noarch.rpm

yum localinstall perl-Net-Telnet-3.03-2.el6.rfx.noarch.rpm

可以看见各个节点ssh验证都是ok的

7.检查整个复制环境状况。

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

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

每个节点都执行;

[root@ums-data-slave ~]# vi /etc/bashrc
PATH="$PATH:/usr/local/mysql/bin"
export PATH

~~~~~~~
或者:
如果发现如下错误:

Can't exec "mysqlbinlog": No such file or directory at /usr/local/share/perl5/MHA/BinlogManager.pm line 99.
mysqlbinlog version not found!
Testing mysql connection and privileges..sh: mysql: command not found
解决方法如下,添加软连接(所有节点)

ln -s /usr/local/mysql/bin/mysqlbinlog /usr/local/bin
ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql

~~~~~~~
所以先暂时注释master_ip_failover_script= /usr/local/bin/master_ip_failover这个选项。后面引入keepalived后和修改该脚本以后再开启该选项。

[root@192.168.0.20 ~]# grep master_ip_failover /etc/masterha/app1.cnf
#master_ip_failover_script= /usr/local/bin/master_ip_failover

[root@ums-data-manager etc]# masterha_check_repl --conf=/etc/masterha/app1.cnf

MySQL Replication Health is OK.
已经没有明显报错,只有两个警告而已,复制也显示正常了。

-----------------------------------------------------------------工具说明

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信息
=====================================================

8.检查MHA Manager的状态:

通过master_check_status脚本查看Manager的状态:

[root@192.168.0.20 ~]# masterha_check_status --conf=/etc/masterha/app1.cnf

app1 is stopped(2:NOT_RUNNING).
[root@192.168.0.20 ~]#
注意:如果正常,会显示"PING_OK",否则会显示"NOT_RUNNING",这代表MHA监控没有开启。

==============================================================
9.开启MHA Manager监控

[root@ums-data-manager masterha]# 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] 9882
查看MHA Manager监控是否正常:
[root@192.168.0.20 ~]# masterha_check_status --conf=/etc/masterha/app1.cnf

app1 (pid:20386) is running(0:PING_OK), master:192.168.0.50
[root@192.168.0.20 ~]#

[root@ums-data-manager masterha]# cd ~

[root@ums-data-manager ~]# tail -n20 /var/log/masterha/app1/manager.log
Checking slave recovery environment settings..
Opening /data/mysql/relay-log.info ... ok.
Relay log found at /data/mysql, up to relay-bin.000003
Temporary relay log file is /data/mysql/relay-bin.000003
Testing mysql connection and privileges..Warning: Using a password on the command line interface can be insecure.
done.
Testing mysqlbinlog output.. done.
Cleaning up test file(s).. done.
Fri Jan 12 10:27:30 2018 - [info] Slaves settings check done.
Fri Jan 12 10:27:30 2018 - [info]
192.168.66.141(192.168.66.141:3306) (current master)
+--192.168.66.143(192.168.66.143:3306)
+--192.168.66.142(192.168.66.142:3306)

Fri Jan 12 10:27:30 2018 - [warning] master_ip_failover_script is not defined.
Fri Jan 12 10:27:30 2018 - [warning] shutdown_script is not defined.
Fri Jan 12 10:27:30 2018 - [info] Set master ping interval 1 seconds.
Fri Jan 12 10:27:30 2018 - [info] Set secondary check script: /usr/local/bin/masterha_secondary_check -s server03 -s server02
Fri Jan 12 10:27:30 2018 - [info] Starting ping health check on 192.168.66.141(192.168.66.141:3306)..
Fri Jan 12 10:27:30 2018 - [info] Ping(SELECT) succeeded, waiting until MySQL doesn't respond..
[root@ums-data-manager ~]#

Fri Jan 19 02:00:42 2018 - [error][/usr/local/share/perl5/MHA/ServerManager.pm, ln492] Server 192.168.66.146(192.168.66.146:3306) is dead, but must be alive! Check server settings.

[root@jspospdb-bak mysql]# service iptables stop
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules: [ OK ]
[root@jspospdb-bak mysql]#

==============================================
11.关闭MHA Manage监控

[root@ums-data-manager ~]# masterha_stop --conf=/etc/masterha/app1.cnf
Stopped app1 successfully.
[1]+ Exit 1 nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1.log/manager.log 2>&1 (wd: /etc/masterha)
(wd now: ~)
[root@ums-data-manager ~]#

12.配置VIP
vip配置可以采用两种方式,一种通过keepalived的方式管理虚拟ip的浮动;另外一种通过脚本方式启动虚拟ip的方式(即不需要keepalived或者heartbeat类似的软件)。

[root@192.168.0.50 ~]# tail -f /var/log/messages

编辑脚本/usr/local/bin/master_ip_failover,修改后如下,我对perl不熟悉,
所以我这里完整贴出该脚本(主库上操作,192.168.0.50)。

在MHA Manager修改脚本修改后的内容如下(参考资料比较少):

[root@DB-mysql1-z ~]# /sbin/ifconfig eth0:1

bayaim:直接复制我的,原封不动。不要用系统自带的例子~!!!

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
);

my $vip = '10.1.1.19/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$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() {
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";
}

现在已经修改这个脚本了,我们现在打开在上面提到过的参数,再检查集群状态,看是否会报错。

[root@192.168.0.20 ~]# grep 'master_ip_failover_script' /etc/masterha/app1.cnf
master_ip_failover_script= /usr/local/bin/master_ip_failover
[root@192.168.0.20 ~]#
复制代码
[root@192.168.0.20 ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf

zhy2_rehat6_mysql03 - MHA_搭建.txt的更多相关文章

  1. zhy2_rehat6_mysql02 - 5.7主从搭建.txt

    1.0------------锁库: mysql>FLUSH TABLES WITH READ LOCK; 这个命令是全局读锁定,执行了命令之后所有库所有表都被锁定只读.一般都是用在数据库联机备 ...

  2. 基于HDP版本的YDB安装部署(转)

    第三章 YDB依赖环境准备 一.硬件环境 硬件如何搭配,能做到比较高的性价比,不存在短板.合理的硬件搭配,对系统的稳定性也很关键. 1.CPU不是核数越高越好,性价比才是关键. 经常遇到很多的企业级客 ...

  3. Replication-Manager

    MYSQL5.7下搭建Replication-Manager 环境说明 在主机1,主机2,主机3上安装MySQL服务端和客户端. 主机1 主机2 主机3 操作系统 CentOS7.4 CentOS7. ...

  4. Orchestrator

    MYSQL5.7下搭建Orchestrator 环境说明 在主机1,主机2,主机3上安装MySQL服务端和客户端. 主机1 主机2 主机3 操作系统 CentOS7.4 CentOS7.4 CentO ...

  5. Hadoop安装部署

    Hadoop伪分布式搭建 1.准备Linux环境 ①开启网络,ifconfig指令查看ip ②修改主机名为自己名字(hadoop) vim /etc/sysconfig/network NETWORK ...

  6. Linux内核配置选项

    http://blog.csdn.net/wdsfup/article/details/52302142 http://www.manew.com/blog-166674-12962.html Gen ...

  7. zhy2_rehat6_mysql04 - MHA_故障演示与切换.txt

    export LANG=en_US 环境:------------------------------------------ 机器 VPN ip linux 账号/密码manager1 172.28 ...

  8. Linux c++ vim环境搭建系列(6)——CMakeLists.txt多文档多目录组织方法和编写示例

    CMakeLists.txt学习 1. 概要 主要是关于cmakelists.txt的编写模板,和多文档多目录的组织方法详解, 涉及第三方库的添加使用方法. 这里主要介绍cmakelists.txt的 ...

  9. 搭建sublime.txt环境结合使用python

    { "cmd": ["python3", "-u", "$file"] }

随机推荐

  1. 【转】Nginx + CGI/FastCGI + C/Cpp

    接着上篇<Nginx安装与使用>,本篇介绍CGI/FASTCGI的原理.及如何使用C/C++编写简单的CGI/FastCGI,最后将CGI/FASTCGI部署到nginx.内容大纲如下: ...

  2. Python3 常用模块2

    目录 time 模块 时间戳形式 格式化时间 结构化时间 time.time() time.sleep() datetime 模块 random 模块 hashlib 模块 和 hmac 模块 typ ...

  3. IP地址的配置

    1.右击 网上邻居 → 属性 2.右击 本地连接 → 属性 3.选择Internet协议(TCP/IP) → 属性 配置如下, 默认网关始终是网段的第一个地址 4.打开cmd → 输入 ipconfi ...

  4. 【Feign】自定义配置

    [Feign]自定义配置 转载: 自定义配置,如果在同一个工程,注意配置不要和@SpringBootApplication或@ComponentSacan放在用一个包下,就是不要被扫描上 packag ...

  5. SSM-配置tkmybatis

    引言 Mybatis 与 Hibernate的一个很大的区别就是Mybatis所有的数据库操作语句都需要自己写,对于简单的单表操作来说是比较烦琐的.因此有人就开发了tk.mybatis插件,通过这个插 ...

  6. CodeForces - 556C Case of Matryoshkas (水题)

    Andrewid the Android is a galaxy-famous detective. He is now investigating the case of vandalism at ...

  7. WebGPU学习(六):学习“rotatingCube”示例

    大家好,本文学习Chrome->webgpu-samplers->rotatingCube示例. 上一篇博文: WebGPU学习(五): 现代图形API技术要点和WebGPU支持情况调研 ...

  8. before和after的操作

    before和after,前者是在元素之前插入东西,后者是在元素后面插入东西,但插入的东西不仅仅只是文字而已,还有图标,以及计算器的操作. 由于两者的操作基本一样,这里以before为例 插入文字 & ...

  9. .NET Core依赖注入集成Dynamic Proxy

    在<Castle DynamicProxy基本用法>中介绍了如何将DP与Autofac集成使用,而 .NET Core有自己的依赖注入容器,在不依赖第三方容器的基础上,如何实现动态代理就成 ...

  10. 常用数据结构之ArrayList

    前言 ArrayList想必是广大Java程序员开发时最常用的数据结构了,但不一定对其原理都有了解,今天我将结合ArrayList的源码对其进行讲解.本文将围绕ArrayList主要特性(包括适用场景 ...