环境:rhel6.5 firewalld selinux disabled
MHA manager:172.25.67.1
master:172.25.67.2
slave:172.25.67.3
slave:172.25.67.4

mysql三个节点:
三个节点之间ssh连接都不用密码
启动MySQL:

/etc/init.d/mysqld start

编辑配置文件

vim /etc/my.cnf

添加下面的内容

# 每一个节点只有这儿的ID不同
server-id=2 
# 打开二进制日志功能
log-bin=mysql-bin
# 指定复制的数据库
binlog-do-db=test
# 忽略的数据库
binlog-ignore-db=mysql

# 开启GTID模式
gtid-mode=ON
# GTID安全的参数
enforce-gtid-consistency=ON

# 开启半同步复制,需要提前安装相应插件 
# mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
rpl_semi_sync_master_enabled=ON
# mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
rpl_semi_sync_slave_enabled=ON

# 基于组提交的并行复制
slave-parallel-type=LOGICAL_CLOCK
# 一个schema下,16个的worker线程并发执行relay log中主库提交的事务
slave-parallel-workers=16
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON

安装软件: mha4mysql-node-0.56-0.el6.noarch.rpm

安装半同步复制所需的插件,如果用rpm包安装的,插件存放在/usr/lib64/mysql/plugin/

mysql> install plugin rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> install plugin rpl_semi_sync_slave SONAME 'semisync_slave.so';

创建主从复制帐号

mysql> grant replication slave on *.* to redhat@'172.25.67.%' identified by 'Gmoon+007';

建立MHA管理帐号

mysql> grant all on *.* to root@'172.25.67.%' identified by 'Gmoon+007';

防止在slave上被人工误写入数据

mysql> set global read_only=1;

重启mysql:

/etc/init.d/mysqld restart

在两个slave节点

mysql> change master to master_host='172.25.67.2',master_user='redhat',master_password='Gmoon+007',master_auto_position=1;
mysql> start slave;
mysql> show salve status\G
*************************** 1. row ***************************
                  Master_Host: 172.25.67.2
                  Master_User: redhat
              ......................
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes 
              ......................
*************************************************************

在MANAGER节点:
安装软件:

mha4mysql-manager-0.56-0.el6.noarch.rpm
mha4mysql-node-0.56-0.el6.noarch.rpm
perl-Config-Tiny-2.12-7.1.el6.noarch.rpm
perl-Email-Date-Format-1.002-5.el6.noarch.rpm
perl-Log-Dispatch-2.27-1.el6.noarch.rpm
perl-Mail-Sender-0.8.16-3.el6.noarch.rpm
perl-Mail-Sendmail-0.79-12.el6.noarch.rpm
perl-MIME-Lite-3.027-2.el6.noarch.rpm
perl-MIME-Types-1.28-2.el6.noarch.rpm
perl-Parallel-ForkManager-0.7.9-1.el6.noarch.rpm

在mha管理节点创建管理目录:

mkdir /etc/mha

编辑配置文件:
vim /etc/mha/app.cnf

[server default]
# 定义mha的管理目录及日志文件
manager_workdir=/usr/local/mha
manager_log=/usr/local/mha/mha.log
master_binlog_dir=/var/lib/mysql
remote_workdir=/tmp
# mha的管理帐号和密码
user=root           
password=Gmoon+007      
# 每隔一秒监测一次
ping_interval=1
# 在sql端授权的用户及密码
repl_user=redhat            
repl_password=Gmoon+007
# ssh连接的用户
ssh_user=root  

# 定义监测的主机       
[server2]
hostname=172.25.67.2
port=3306

[server3]
hostname=172.25.67.3
port=3306
candidate_master=1
check_repl_delay=0

[server4]
hostname=172.25.67.4
port=3306

创建配置文件中的目录

mkdir /usr/local/mha

配置ssh,使mha主机与mysql主机之间不用密码可以相互连接:
生成私钥和公钥

# ssh-keygen

将公钥复制到远程机器中

# ssh-copy-id 172.25.67.2
# ssh-copy-id 172.25.67.3
# ssh-copy-id 172.25.67.4
# ssh 172.25.67.2   测试连接
# ssh 172.25.67.3
# ssh 172.25.67.4

scp实现相互连接

# scp -r .ssh/ root@172.25.67.2:/root
# scp -r .ssh/ root@172.25.67.3:/root
# scp -r .ssh/ root@172.25.67.4:/root

检查ssh是否配置成功:

masterha_check_ssh --conf=/etc/mha/app.cnf  
**********
All SSH connection tests passed successfully
**********

检查数据库连接是否配置成功:

masterha_check_repl --conf=/etc/mha/app.cnf
************
MySQL Replication Health is OK.
***********

在manager节点:
开启MHA管理进程:

nohup masterha_manager --conf=/etc/mha/app.cnf --ignore_last_failover &

查看进程开启的状态:

masterha_check_status --conf=/etc/mha/app.cnf

停掉master,会切换到172.25.67.3上

service mysqld stop

查看172.25.67.3的slave的状态:

mysql> show slave status\G
Empty set (0.00 sec) 变为空

注意这里有两个问题:

  1. 虽然mha试图从宕机的主服务器上保存二进制日志,但也会有问题。例如,如果主服务器硬件故障或无法通过ssh访问,mha没法保存二进制日志,只进行故障转移而丢失最新数据。
  2. 当主库故障,切换到另外的服务器上后,即使恢复了原来的主库,也不能立即加入整套系统中,得重新部署。而且当发生一次切换后,管理节点的监控进程就会自动退出,需要用脚本来自动启动。

在master节点:
添加VIP

ip addr 172.25.67.100/24 dev eth0

在MHA管理节点:
将下面两个脚本的VIP设置为master的添加的VIP

vim master_ip_failover
vim master_ip_online_change

测试:
开启MHA的管理进程:

nohup masterha_manager --conf=/etc/mha/app.cnf --ignore_last_failover &

停掉master上的msyqld,VIP会自动转移到新的master上。

在不启动MHA管理进程的情况下,可以手动切换:

热切:

masterha_master_switch --conf=/etc/mha/app.cnf --master_state=alive --new_master_host=172.25.67.2 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000

冷切:

masterha_master_switch --conf=/etc/mha/app.cnf --master_state=dead --dead_master_host=172.25.67.2 --dead_master_port=3306 --new_master_host=172.25.67.3 --new_master_port=3306 --ignore_last_failover