MHA目前是MYSQL高可用方面相对成熟的解决方案,是一套优秀的作为mysql高可用环境下故障切换和主从提升的高可用软件。在mysql故障切换过程中,MHA能做到在0-30m之内自动完成数据库的故障切换操作,并且在 进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。

该软件由两分布组成:管理结点和数据结点。管理结点可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHA Node运行在每台mysql服务器上,管理结点会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。

在MHA自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失,但这并不总是可行的。

目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库。

MHA工作原理:

1.从宕机崩溃的master保存二进制日志事件(binlog events)

2.识别含有最新更新的slave

3.应用差异的中继日志(relay log)到其他的slave;

4.应用从master保存的二进制日志事件(binlog events)

5.提升一个slave为新的master

6.使其他的slave连接新的master进行复制

MHA软件由两部分组成,Manager工具包和Node工具包

Manager工具包主要包括以下几个工具:

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

Node工具包

save_binary_logs            保存和复制master的二进制日志
apply_diff_relay_logs       识别和差异的中继日志事件并将其差异的事件应用于其他的slave
filter_mysqlbinlog            去除不必要的ROLLBACK事件(MHA已不再使用这个工具)
purge_relay_logs             清除中继日志(不会阻塞sql线程)

操作:

环境,准备三台服务器  三台虚拟机都要做

1.时间同步  

echo "*/5 * * * * /usr/sbin/ntpdate ntpl.aliyun.com >/dev/null 2>&1"  >>/var/spool/cron/root

2.hosts解析  在做hosts解析前可以修改一下主机名   三台虚拟机都要修改

vim /etc/hostname
cen701

修改好了之后需要关机重启

cat >>/etc/hosts<<EOF
cen701 10.0.0.41  三台服务器的ip
cen702 10.0.0.43
cen703 10.0.0.44
<<EOF

互相配置ssh免密登录

yum -y install sshpass

vim test.sh
#!/bin/bash
UserName=root
IPlist=(10.0.0.41 10.0.0.43 10.0.0.44)
ssh-keygen -t dsa -f ~/.ssh/id_dsa -P "" &>/dev/nu11
for i in ${IPlist[*]}
      do
      sshpass -p "123456" ssh-copy-id -i ~/.ssh/id_dsa.pub -p 22 -o StrictHostKeyChecking=no $UserName@$i &>/dev/nu11
done

保存退出之后执行
sh test.sh
我们可以验证一下
ssh root@10.0.0.44  看看是否还要输入密码不输入就证明正确

mapu架构弊端 mha架构_mapu架构弊端

 2.安装mysql   三台服务器都需要安装

wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
rpm -ivh mysql-community-release-el7-5.noarch.rpm
yum install mysql-server -y

启动
systemctl restart mysql

修改密码
mysql
>update mysql.user set password=password('123456') where user='root' and host='localhost';
>flush privileges;

3.编辑配置文件  第一台master的配置

第一台  master主机
vim /etc/my.cnf

[mysqld]
server-id=1
log-bin=mysql-bin
#禁止mysql自动删除relaylog工能
relay_log_purge = 0
#mysql5.6已上的特性,开启gtid,必须主从全开
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates = 1
skip-name-resolve
重启mysql
systemctl restart mysql

4.创建同步的用户

mysql -uroot -p123456
mysql> grant replication slave on *.* to 'rep'@'10.0.0.%' identified by '123456';
mysql> flush privileges;

查看mysql主库的master状态

mysql> show master status\G;

mapu架构弊端 mha架构_vim_02

 查看gid的状态

 

mysql> show global variables like '%gtid%';

 

mapu架构弊端 mha架构_服务器_03

 

 

 

5.编辑配置文件  第二台服务器从的操作

vim /etc/my.cnf

[mysqld]
server-id=2
log-bin=mysql-bin
#禁止mysql自动删除relaylog工能
relay_log_purge = 0
#mysql5.6已上的特性,开启gtid,必须主从全开
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates = 1
skip-name-resolve
重启mysql
systemctl restart mysql

创建同步用户

mysql -uroot -p123456
mysql> grant replication slave on *.* to 'rep'@'10.0.0.%' identified by '123456';
mysql> flush privileges;

关闭从服务器的复制功能

mysql -uroot -p123456
mysql> stop slave;

配置从服务器指向master

change master to 
master_host='10.0.0.41',
master_user='rep',
master_password='123456',
master_log_file='mysql-bin.0000001',
master_log_pos=530;

开启从服务器的复制功能

mysql>start slave;

检查从服务器的复制功能

mysql>show slave status \G;

mapu架构弊端 mha架构_mysql_04

 

 

 

6.编辑第三台的配置文件 

vim /etc/my.cnf

[mysqld]
server-id=3
log-bin=mysql-bin
#禁止mysql自动删除relaylog工能
relay_log_purge = 0
#mysql5.6已上的特性,开启gtid,必须主从全开
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates = 1
skip-name-resolve
重启mysql
systemctl restart mysql

创建同步的用户

mysql -uroot -p123456
mysql> grant replication slave on *.* to 'rep'@'10.0.0.%' identified by '123456';
mysql> flush privileges;

关闭从服务器的复制功能

mysql -uroot -p123456
mysql> stop slave;

配置从服务器指向master

change master to 
master_host='10.0.0.41',
master_user='rep',
master_password='123456',
master_log_file='mysql-bin.0000001',
master_log_pos=530;

开启从服务器的复制功能

mysql>start slave;
检查从服务器的复制功能状态
mysql> show slave status \G;

7.安装MHA   所有节点都需要操作

  安装依赖

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

 授权MHA管理用户

mysql>grant all privileges on *.* to mha@'10.0.0.%' identified by 'mha';
mysql>flush privileges;

 安装MHA node节点

上传mha4mysql-node-0.58-0.el7.centos.noarch
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm

 安装MHA管理节点  这里选择第三台服务器

上传mha4mysql-manager-0.58-0.el7.centos.noarch
rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

 配置MHA

mkdir -p /etc/mha
mkdir -p /var/log/mha/app1
vim /etc/mha/app1.cnf
[server default]
manager_log=/var/log/mha/app1/manager.log
manager_workdir=/var/log/mha/app1
master_binlog_dir=/var/lib/mysql #binlog的目录,如果说miysql的环境不一样,binlog位置不同,每台服务器的binlog的位置写在server标签里面即可
user=mha
password=mha
ping_interval=2
repl_password=123456
repl_user=rep
ssh_user=root

[server1]
hostname=10.0.0.41
port=3306

[server2]
hostname=10.0.0.43
port=3306

[server3]
hostname=10.0.0.44
port=3306
ignore_fail=1  #如果这个节点挂了,mha将不可用,加上这个参数,slave挂了一样可以用
no_master=1  #从不将这台主机转换为master

启动测试

ssh检查测试

masterha_check_ssh --conf=/etc/mha/app1.cnf

mapu架构弊端 mha架构_mapu架构弊端_05

 

 

masterha_check_repl --conf=/etc/mha/app1.cnf

mapu架构弊端 mha架构_mapu架构弊端_06

 可以之后 需要启动

nohup masterha_manager --conf=/etc/mha/app1.cnf  --remove_dead_master_conf --ignore_last_failover < /dev/null >  /var/log/mha/app1/manager.log  2>&1 &

查看进程

ps -ef|grep mha

mapu架构弊端 mha架构_vim_07

 

 

 

查看状态

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

mapu架构弊端 mha架构_mysql_08

 

 

 接下来可以测试MHA故障转移

     停掉cen701的主库10.0.0.41

systemctl stop mysql

  查看cen703的状态,看看Master_Host是否变成了第二台服务器的ip

mysql -uroot -p123456 -e 'show slave status\G;'

  

mapu架构弊端 mha架构_服务器_09

 

 

      查看cen702的master状态

mysql -uroot -p123456 -e 'show master status;'

mapu架构弊端 mha架构_服务器_10

 

 

 回到第三台服务器我们查看一下我们添加的内容

cat /etc/mha/app1.cnf

mapu架构弊端 mha架构_mapu架构弊端_11

 

 

 我们发现这时候 我们server1的标签已经没有了,这是因为我们mha帮我们完成了这个效果

8.故障还原

在第三台服务器上我们查看一下故障

grep "CHANGE MASTER TO MASTER"  /var/log/mha/app1/manager.log | tail -1

 

mapu架构弊端 mha架构_mysql_12

 

 回到第一台服务器

重启mysql
systemctl restart mysql
这里是第三台服务器报的提示

mysql -uroot -p123456 -e "CHANGE MASTER TO MASTER_HOST='10.0.0.43', MASTER_PORT=3306, 
MASTER_AUTO_POSITION=1, MASTER_USER='rep', MASTER_PASSWORD='123456';"

mysql -uroot -p123456 -e 'start slave;'
mysql -uroot -p123456 -e 'show slave status\G;'

 

mapu架构弊端 mha架构_mapu架构弊端_13

 

配置vip飘逸

   首先我们需要MHA的脚本

       重命名为master_ip_failover.sh

将脚本放到 /usr/bin下并且给上权限  chmod +x /usr/bin/master_ip_failover.sh

修改配置文件  

vim /etc/mha/app1.cnf

添加上一行
master_ip_failover_script=/usr/bin/master_ip_failover

模拟主库宕机vip飘逸

现在我们的cen702是master 所以现在需要在第二台服务器上操作

手动添加vip
ifconfig ens33:1 10.0.0.100/24    和MHAvip飘逸的脚本里面的vip保持一致
ip a show ens33
这时候就可以发现已经多了一个vip100了
此时关闭mysql
systemctl stop mysql
vip飘逸会有延迟几秒,此时可以再查看一下ens33
ip a show ens33
此时的vip已经去了cen701上面了