MySQL的MHA架构+中间件keepalive,是互联网云架构的主流架构,实现系统高可用,但是MySQL的切换因为,Binlog的延迟问题,不建议字段切换,最好确认完全无延迟再切换,否则自动切换造成的错误数据与手动切换造成的业务中断之间的权衡,就需要仁者见仁智者见智了。

1、MHA介绍

      MHA(Master High Availability)是自动的master故障转移和Slave提升的软件包.它是基于标准的MySQL复制(异步/半同步).
      MHA有两部分组成:MHA Manager(管理节点)和MHA Node(数据节点).
      MHA Manager可以单独部署在一台独立机器上管理多个master-slave集群,也可以部署在一台slave上.MHA Manager探测集群的node节点,当发现master出现故障的时候,它可以自动将具有最新数据的slave提升为新的master,然后将所有其 它的slave导向新的master上.整个故障转移过程对应用程序是透明的。
      MHA node运行在每台MySQL服务器上(master/slave/manager),它通过监控具备解析和清理logs功能的脚本来加快故障转移的。

2、MHA工作原理

-从宕机崩溃的master保存二进制日志事件(binlog events)。
-识别含有最新更新的slave。
-应用差异的中继日志(relay log)到其它slave。
-应用从master保存的二进制日志事件(binlog events)。
-提升一个slave为新master。
-使其它的slave连接新的master进行复制。

3、MHA工具包:

(1)、 Manager工具:
- masterha_check_ssh : 检查MHA的SSH配置。
- masterha_check_repl : 检查MySQL复制。
- masterha_manager : 启动MHA。
- masterha_check_status : 检测当前MHA运行状态。
- masterha_master_monitor : 监测master是否宕机。
- masterha_master_switch : 控制故障转移(自动或手动)。
- masterha_conf_host : 添加或删除配置的server信息。

(2)、 Node工具(这些工具通常由MHA Manager的脚本触发,无需人手操作)。
- save_binary_logs : 保存和复制master的二进制日志。
- apply_diff_relay_logs : 识别差异的中继日志事件并应用于其它slave。
- filter_mysqlbinlog : 去除不必要的ROLLBACK事件(MHA已不再使用这个工具)。
- purge_relay_logs : 清除中继日志(不会阻塞SQL线程)。

 

下面是MySQL MHA安装与配置

MySQL MHA配置
     MySQL环境:
     master:192.168.202.129:3306
     slave:192.168.202.129:3307,192.168.202.129:3307,192.168.202.130:3306,192.168.202.130:3307,192.168.202.130:3308
     MariaDB-10.0.13
     MHA环境:
     manager:192.168.202.129
     node:192.168.202.130(3306端口监听的实例作为备用主库),192.168.202.129
     下载地址:http://code.google.com/p/mysql-master-ha/ (这个需要FQ)

环境准备

一主两从MySQL环境

MHA配置

1 依赖安装:

在node节点上,执行下面的命令:



# yum install perl-DBD-MySQL



在manager节点上:



# yum install perl-DBD-MySQL
# yum install perl-Config-Tiny
# yum install perl-Log-Dispatch
# yum install perl-Parallel-ForkManager
# yum install -y rrdtool perl-rrdtool rrdtool-devel perl-Params-Validate



2 rpm包安装:
manager节点:



# rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm
# rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm



node节点:



# rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm



3 配置



mkdir -p /etc/masterha/
mkdir -p /var/log/masterha/app1/



将下面的内容写进/etc/masterha/app1.cnf:



cat <<EOF>> /etc/masterha/app1.cnf
[server default]
manager_workdir=/var/log/masterha/app1
manager_log=/var/log/masterha/app1/manager.log
user=admin
password=admin
ssh_user=root
repl_user=repl
repl_password=repl
ping_interval=1
shutdown_script=""
master_ip_online_change_script=""
report_script=""
[server1]
hostname=192.168.126.129
port=3306
candidate_master=1
master_binlog_dir="/home/mysql/mydata/data1/binlog"
[server2]
hostname=192.168.126.130
port=3306
candidate_master=1
master_binlog_dir="/home/mysql/mydata/data1/binlog"
[server3]
hostname=192.168.126.130
port=3307
[server4]
hostname=192.168.126.130
port=3308
[server5]
hostname=192.168.126.129
port=3307
[server6]
hostname=192.168.126.129
port=3308
EOF

cat /etc/masterha/app1.cnf



4 配置ssh免秘钥:



# ssh-keygen -t rsa
# cd ~/.ssh
# cat id_rsa.pub >> authorized_keys
# chmod 600 authorized_keys



将id_rsa.pub的内容粘贴到另一台服务器的~/.ssh/authorized_keys里(保证两个机器互相信任)。
5 测试一下ssh: 



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


6 测试一下复制:



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


7 开启masterha_manager



# nohup masterha_manager --conf=/etc/masterha/app1.cnf > /tmp/mha_manager.log 2>&1 &



看一下状态:



# masterha_check_status --conf=/etc/masterha/app1.cnf