一、MHA优缺点
优点:
1、 MHA自动化主服务器故障转移,快速将从服务器晋级为主服务器(通常在10-30s),而不影响复制的一致性,不会有性能损耗,容易安装,不必更改现有的部署环境,适用于任何存储引擎。
2、 MHA提供在线主服务器切换,改变先正运行的主服务器到另外一台上,这个过程只需0.5-2s的时间,这个时间内数据无法写入。MHA Manager通过ssh连接mysql slave服务器。
3、 使用半同步复制,可以大大降低数据丢失的风险。MHA可以与半同步复制结合起来。如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此他们彼此保持一致性。
缺点:
1、 虽然MHA试图从宕机的主服务器上保存二进制日志,但也会有问题。例如,如果主服务器硬件故障或无法通过ssh访问,MHA没法保存二进制日志,只进行故障转移而丢失最新数据。
2、 当主DB故障,切换到另外的服务器上后,即使恢复了原来的主DB,也不能立即加入整套MHA系统中,得重新部署。而且当发生一次切换后,管理节点的监控进程就会自动退出,需要用脚本来自动启动。另外还得删除app1.failover.complete这个文件,否则新的主DB出现问题MHA就不会切换了。
二、简单的架构图
MHA最少需要两台服务器组成,也就是M-S架构,并使用从DB作为监控机。
本次整理的方案使用了4台虚拟机,为M-M-S加监控机的组合。
Mysql请求发往VIP:10.1.1.190,当现有的主(10.1.1.191)故障,VIP会指向10.1.1.192,mysql请求也会转过去。
请看简图:
一、环境搭建
1、 部署MHA
MHA节点包含三个脚本,依赖perl模块。
save_binary_logs:保存和复制当掉的主服务器二进制日志。
apply_diff_relay_logs:识别差异的relay log事件,并应用于其他salve服务器。
purge_relay_logs:清除relay log文件。
需要在所有mysql服务器上安装MHA节点,MHA管理服务器也需要安装。MHA管理节点模块内部依赖MHA节点模块。MHA管理节点通过ssh连接管理mysql服务器和执行MHA节点脚本。MHA节点依赖perl的DBD::mysql模块。
a) 安装MHA Node,4台机器都需要安装
yum –y install perl-DBD-MySQL
wget http://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.54.tar.gz
tar zxf mha4mysql-node-0.54.tar.gz
cd mha4mysql-node-0.54
perl Makefile.PL
make && make install
b) 安装MHA manager,只需要安装在监控机(10.1.1.112)
yum –y install perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager
wget http://mysql-master-ha.googlecode.com/files/mha4mysql-manager-0.54.tar.gz
tar zxf mha4mysql-manager-0.54.tar.gz
cd mha4mysql-manager-0.54
perl Makefile.PL
make && make install
需要注意的是mha-manager和mha-node版本必须一致,另外切记管理机也要安装node包。
2、 部署keepalive
wget http://www.keepalived.org/software/keepalived-1.1.17.tar.gz
tar zxvf keepalived-1.1.17.tar.gz
cd keepalived--1.1.17.tar.gz
./configure --prefix=/usr/local/keepalived
make
make install
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
mkdir /etc/keepalived
MASTER Keepalived的配置:
cat /etc/keepalived/keepalived.conf
#Configuration File for keepalived
global_defs {
notification_email { ######定义接受邮件的邮箱
}
notification_email_from [email protected] ######定义发送邮件的邮箱
smtp_server mail.tuge.com
smtp_connect_timeout 10
}
vrrp_script check_mysql { ######定义监控mysql的脚本
script "/etc/keepalived/check_mysql.sh"
interval 2 ######监控时间间隔
weight 2 ######负载参数
}
vrrp_instance vrrptest { ######定义vrrptest实例
state MASTER ######服务器状态(主为MASTER,从为BACKUP)
interface eth0 ######使用的接口
virtual_router_id 51 ######虚拟路由的标志,一组lvs的虚拟路由标识必须相同,这样才能切换
priority 150 ######服务启动优先级,值越大,优先级越高,BACKUP 不能大于MASTER
advert_int 1 ######服务器之间的存活检查时间
notify /etc/keepalived/alert.sh ######keepalive发生切换的报警邮件
authentication {
auth_type PASS ######认证类型
auth_pass ufsoft ######认证密码,一组lvs 服务器的认证密码必须一致
}
track_script { ######执行监控mysql进程的脚本
check_mysql
}
virtual_ipaddress { ######虚拟IP地址
10.1.1.190
}
}
BACKUP Keepalived的配置
cat /etc/keepalived/keepalived.conf
#Configuration File for keepalived
global_defs {
notification_email { ######定义接受邮件的邮箱
}
notification_email_from [email protected] ######定义发送邮件的邮箱
smtp_server mail.tuge.com
smtp_connect_timeout 10
}
vrrp_script check_mysql { ######定义监控mysql进程的脚本
script "/etc/keepalived/check_mysql.sh"
interval 2 ######监控时间间隔
weight 2 ######负载参数
}
vrrp_instance vrrptest { ######定义vrrptest实例
state BACKUP ######服务器状态(主为MASTER,从为BACKUP)
interface eth0 ######使用的接口
virtual_router_id 51 ######虚拟路由的标志,一组lvs的虚拟路由标识必须相同,这样才能切换
priority 100 ######服务启动优先级,值越大,优先级越高,BACKUP 不能大于MASTER
advert_int 1 ######服务器之间的存活检查时间
notify /etc/keepalived/alert.sh ######keepalive发生切换的报警邮件
authentication {
auth_type PASS ######认证类型
auth_pass ufsoft ######认证密码,一组lvs 服务器的认证密码必须一致
}
track_script { ######执行监控NGINX进程的脚本
check_mysql
}
virtual_ipaddress { ######虚拟IP地址
10.1.1.190
}
}
2.2.1监控mysql
/etc/keepalived/check_mysql.sh
#!/bin/bash
if [ "$(ps -ef | egrep "mysqld|mysqld_safe" | grep -v egrep )" == "" ]
then
/etc/init.d/keepalived stop
fi
功能:判断当mysql进程不存在,则kill掉keepalive,将虚拟IP切换到BACKUP-Keepalive。
2.2.2 监控脚本/etc/keepalived/alert.sh
主要是在keepalive发生切换的时候发邮件报警用的。