一:背景介绍
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