一:背景介绍

      MHA(Master HA)是一款开源的MySQL的高可用工具,能在MySQL主从复制的基础上,实现自动化主服务器故障转移。虽然MHA试图从宕机的主服务器上保存二进制日志,但并不是总是可行的。例如,如果主服务器硬件故障或无法通过ssh访问,MHA没法保存二进制日志,只进行故障转移而丢失最新数据。

      MHA监控复制架构的主服务器,一旦检测到主服务器故障,就会自动进行故障转移。即使有些从服务器没有收到最新的relay log,MHA自动从最新的从服务器上识别差异的relay log并把这些日志应用到其他从服务器上,因此所有的从服务器保持一致性了。还可以设置优先级指定其中的一台slave作为master的候选,由于MHA在slaves之间修复一致性,因此可以将slave变成新的master,其他的slave都以其作为新master。

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

优点:
1 找出同步最成功的一台从服务器(也就是与主服务器数据最接近的那台从服务器)自动切换成主服务器。
2 如果主机还能够访问,从主服务器上找回最新从机与主机间的数据差异。
3 在每一台从服务器上操作,确定他们缺少哪些events,并分别进行补充。
4 将最新的一台从服务器提升为主服务器后,将其它从服务器重新指向新的主服务器。
缺点:
1 当群集内的数据库进行故障转移时,对外提供服务的虚拟IP也进行转移。 2 MHA管理进程需要以后台守护进程的方式运行,并有监控机制保证MHA管理进程的正常运行。 3 有监控机制保证当主机出现故障时,MHA能确定进行成功的Failover。 4 当故障主机恢复后,能重新回到群集中,并成为新的Slave,自动实现重新同步。 5 由于主机和从机上备份策略不同,进行故障转移后,自动调整cron中的调度(例如全备份)。

二:下载:https://github.com/yoshinorim/mha4mysql-manager

https://code.google.com/p/mysql-master-ha/downloads/list?q=label:Featured
https://code.google.com/p/mysql-master-ha/wiki/Downloads?tm=2 #(5.6)
wget https://mysql-master-ha.googlecode.com/files/mha4mysql-manager-0.55.tar.gz
wget https://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.54.tar.gz

版本说明:https://code.google.com/p/mysql-master-ha/wiki/ReleaseNotes

三:安装

https://code.google.com/p/mysql-master-ha/wiki/Installation#Installing_MHA_Manager

安装完成之后会产生一些相关工具:

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

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

【本文是通过源码安装】

1,MHA Manager 安装

  ## Install dependent Perl modules
  # Config::Tiny
  ## perl -MCPAN -e "install Config::Tiny"
  # Log::Dispatch
  ## perl -MCPAN -e "install Log::Dispatch"
  # Parallel::ForkManager 
  ## perl -MCPAN -e "install Parallel::ForkManager"
  ## Installing MHA Manager
  $ tar -zxf mha4mysql-manager-X.Y.tar.gz
  $ perl Makefile.PL
*** Module::AutoInstall version 1.03
*** Checking for Perl dependencies...
[Core Features]
- DBI                   ...loaded. (1.616)
- DBD::mysql            ...loaded. (4.020)
- Time::HiRes           ...loaded. (1.972101)
- Config::Tiny          ...loaded. (2.20)
- Log::Dispatch         ...loaded. (2.41)
- Parallel::ForkManager ...loaded. (1.06)
- MHA::NodeConst        ...loaded. (0.54)  先装Node,这里才能通过。
*** Module::AutoInstall configuration finished.
Checking if your kit is complete...
Looks good
Generating a Unix-style Makefile
Writing Makefile for mha4mysql::manager
Writing MYMETA.yml and MYMETA.json
  $ make
  $ sudo make install

2,MHA Node 安装

## Install DBD::mysql if not installed
  $ tar -zxf mha4mysql-node-X.Y.tar.gz
  $ perl Makefile.PL
*** Module::AutoInstall version 1.03
*** Checking for Perl dependencies...
[Core Features]
- DBI        ...loaded. (1.616)
- DBD::mysql ...loaded. (4.020)
*** Module::AutoInstall configuration finished.
Checking if your kit is complete...
Looks good
Generating a Unix-style Makefile
Writing Makefile for mha4mysql::node
Writing MYMETA.yml and MYMETA.json
  $ make
  $ sudo make install

上面红色标明的不能出现miss,否则后面运行就会有问题。要是miss则需要执行(ubuntu):

sudo apt-get install libdbd-mysql-perl

其他的系统可以看这里

在安装时候要设置好locale,否则安装也会有问题,可以先运行:

export LC_ALL="zh_CN.UTF-8"

在安装之前需要安装一些依赖的包,如:gcc、iputils-arping等到此,MHA安装结束了。

三:测试

必要条件:

1)三台主机:201(M/node)、202(S/node)、204(S/manager)。

2)MHA按照上面的方法在三台上已经安装完毕,MySQL的Replication已经搭建完成,复制帐号三台都已经创建。

MySQL上需要设置:set global relay_log_purge=0,或则配置文件里修改。

--relay-log-purge={0|1}

禁用或启用不再需要中继日志时是否自动清空它们。默认值为1(启用)。这是一个全局变量,可以用SET GLOBAL Relay_log_purge动态更改。

3)MHA环境需要三台主机需要相互信任:实现三台主机之间相互免密钥登录。

[204]
用ssh-keygen创建公钥,一直默认回车,最后会在.ssh/下面生成id_rsa.pub
ssh-keygen -t rsa  

把id_rsa.pub 文件复制到另外2台机子并导入公钥: 
cat id_rsa.pub >> /root/.ssh/authorized_keys 

当然也可以直接复制里面的内容再粘帖到authorized_keys中。 这样204可以直接访问到其他2台机子了 
ssh 192.168.200.201 
ssh 192.168.200.202 

同理在另外2台机子上面操作,让他们之间实现无密码登入。

要是root登陆的话,需要修改ssh的配置文件:

  vi /etc/ssh/sshd_config  中的 PermitRootLogin ,设置为YES,再重启SSH。

注意:Manager 要是装到某一台MySQL上,则需要自己和自己无密码登入:ssh 192.168.200.204,单独到一台服务器则不需要。

4)MHA的配置

Manager上的配置

mkdir -p /usr/local/masterha/app1        #创建数据文件目录
mkdir /etc/masterha                      #创建配置文件目录

安装时解压出来的samples中有2个文件:
conf 是存放配置文件的模块
scripts是存放运行时的一些命令,可以把这几个名字移到/user/bin 中。用户下面灰色背景的几个参数中。

添加MHA的配置文件(Manager)

样本:(51-M,52-S,53-S,VIP:50)

[server default]
user=zjy
password=123#
ssh_user=root
repl_user=rep
repl_password=rep123456
ping_interval=1

manager_workdir=/usr/local/masterha/mha_data
manager_log=/usr/local/masterha/manager.log
remote_workdir=/usr/local/masterha/mha_data

master_ip_failover_script=/usr/bin/master_ip_failover
#master_ip_online_change_script=/usr/bin/master_ip_online_change
#shutdown_script=/usr/bin/power_manager
report_script =/usr/bin/send_report.py
#secondary_check_script= masterha_secondary_check -s remote_host1 -s remote_host2

[server1]
hostname=192.168.200.51
master_binlog_dir=/var/log/mysql
candidate_master=1
check_repl_delay=0

[server2]
hostname=192.168.200.52
master_binlog_dir=/var/log/mysql
#candidate_master=1

[server3]
hostname=192.168.200.53
master_binlog_dir=/var/log/mysql
#candidate_master=1
View Code

相关文章: