一、MHA的简单介绍
MHA是由perl语言编写的,用外挂脚本的方式实现mysql主从复制的高可用性。
MHA可以自动检测mysql是否宕机,如果宕机,在10-30s内完成new master的选举,应用所有差异的binlog日志到所有slave,将所有的slave切换到新的master上来。
MHA除了自动检测mysql是否宕机,还能够交互式的切换master,在日常的数据库维护中,这个功能还是挺有用的。
由于MHA本身只负责数据库主从的切换,但是应用程序并不知道数据库的master变了。针对这种情况,可以使用MHA预留的几个脚本接口,通过虚拟IP或者修改全局配置文件的方法通知应用程序,master数据库已经改变。
MHA还是一个很活跃的项目,生产环境的使用者众多,不乏大公司,MHA的版本也很快,MHA作者在持续更新版本,最新版本已经支持GTID了。
二、环境部署
OS : Centos /RedHat 6.x
Mysql: Percona 5.5/5.6
主机(hostname) | 角色 | IP | 安装 |
master.mysql.com | Master | 192.168.56.110 | Mysq,mha node,keepalived |
Slave1.mysq.com |
Candidate master ( slave1 ) |
192.168.56.111 |
Mysql, MHA node, keepalived |
Slave2.mysql.com | slave2 | 192.168.56.112 | Mysql,keepalived |
mha.mysql.com | MHA manager | 192.168.56.111 | MHA manager |
Vip | 192.168.56.188 |
三、软件安装
yum源准备(修改 /etc/yum.repos.d/)
epel yum源:http://blog.csdn.net/yiyuf/article/details/40148125
Percona yum源:http://blog.csdn.net/yiyuf/article/details/40148183
关闭selinux
#cat /etc/sysconfig/selinux
SELINUX=disabled
关闭 iptables
#service iptables stop
chkconfig iptables off
修改 /etc/hosts 增加如下:
192.168.56.110 master.mysql.com
192.168.56.112 slave1.mysql.com
192.168.56.113 slave2.mysql.com
并scp /etc/hosts 到其它各个节点。
mysql 安装:
yum -y install Percona-Server-server-55.x86_64 (5.5 版本)
yum -y install Percona-Server-server-56.x86_64 (5.6版本 )
搭建mysql 一主两从配置 (略)
SSH互信配置:
在master(192.168.56.110)上执行:ssh-keygen (一路回车)
# cd ~/.ssh
#cat id_rsa.pub >authorized_keys
#chmod 600 *
scp -r .ssh 192.168.56.111:~/
scp -r .ssh 192.168.56.112:~/
scp -r .ssh 192.168.56.113:~/
至此,mysql的主从也搭建好了,并可以正常运行了。接下来开始安装MHA软件:
1. mha manager节点安装(192.168.56.111上):
yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager -----安装perl相关库文件
从https://code.google.com/p/mysql-master-ha/wiki/Downloads上面下载:
MHA Manager 0.56 tarball #####下载此tar包的目的是为了copy相关的配置文件和scripts
在192.168.56.111上安装:
#rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
#rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm
2. mha node节点安装(192.168.56.110, 192.168.56.112,192.168.56.113):
# yum -y install perl-DBD-MySQL
#rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
3. MHA配置 (只需要在mha manager端配置即可):
该配置文件默认是分为两个(appxxx.cnf ,masterha_default.cnf ),其中masterha_default.cnf 是属于全局配置文件,当管理多个集群时,就显得特别有用。避免app.conf写的太长。app1.conf作用范围为master/slave结构,
全局参数文件配置(masterha_default.cnf)
#cat /etc/masterha_default.cnf
[server default]
user=yyf
password=yyf
ssh_user=root
repl_user=replica
repl_password=zjjzjj
master_binlog_dir=/var/lib/mysql3307
#monitor
ping_interval=1
shutdown_script=""
secondary_check_script="masterha_secondary_check -s 192.168.56.112 -s 192.168.56.113" #此处 56.112和56.113在每次切换完后必须要调整。例:当前112和113是slave,110是master,如果MHA发生自动切换,master由110切换到112后,下次这部分就该修改为:-s 192.168.56.110 -s 192.168.56.113。否则下次切换时,将导致失败。
master_ip_failover_script="/root/scripts/master_ip_failover.sh" ## 点击打开链接(master_ip_failover.sh)
参数解释:
user | 用于管理MySQL的用户名。这个最后需要root用户,因为它需要执行:stop slave; change master to , reset slave. 默认: root |
password | MySQL的管理用户的密码。 默认是空的 |
ssh_user | 当前使用的系统用户,用于ssh登入检测状态 |
repl_user | MySQL用于复制的用户 |
repl_password | MySQL用于复制的用户的密码 |
ping_interva l | 设置MHA Manager多长时间去ping一下master(执行一些SQL语句). 当3次ping失败后,MHA Manager会认为MySQL Master死掉了。也就是说,最大的故障切换时间是4次ping_interval的时间,默认是3秒。 |
shutdown_script | 定义关掉主master的脚本 |
secondary_check_script | 当MHA Manager检测master失败后,不会立即判断该master已宕机,而是通过ssh到secondary_check_script定义的主机再次进行检测失败后,方可认为master无法响应。这从一定程度上也防止脑裂的现象出现。 |
master_ip_failover_script |
failvoer时,控制VIP转移的脚本。通常有两种方式实现: (1)通过命令 "/sbin/ifconfig eth1:1 192.168.56.188"; (2) 结合keepalived 来实现 |
master_binlog_dir | 用于存储binary日志的全路径。这个参数用于当master上mysql死掉后,通过ssh连到mysql服务器上,找到需要binary日志事件。这个参数可以帮助用于无法找到master进程死掉后binary日志存储位置。可以设置多个存放位置用逗号隔开如:/var/lib/mysql , /var/lib/mysql3307 |
app1.conf参数文件介绍(作用于某组master / slave结构)
#cat /etc/app1.conf
[server default]
manager_log=/var/log/masterha/app1/app1.log
manager_workdir=/var/log/masterha/app1
remote_workdir=/var/log/masterha/app1
[server1]
candidate_master=1
check_repl_delay=0
hostname=192.168.56.112
port=3306
[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.56.110
port=3306
[server3]
check_repl_delay=0
hostname=192.168.56.113
ignore_fail=1
no_master=1
port=3306
参数解释:
manager_log | 指定MHA manager的绝对路径的文件名日志文件 |
manager_workdir | 指定MHA manager产生相关状态文件全路径。 如果没设置 默认是/var/tmp |
remote_workdir | MHA node上工作目录的全路径名。如果不存在,MHA node会自动创建,如果不允许创建,MHA Node自动异常退出 |
[server1] [server2] [server3] | 在各个APP中所包含,定义每个主机的属性。 |
candidate_master | 作用是当设计candidate_master = 1时,这个服务器有较高的优先级提升为新的master(条件:开启binglog,服务无延迟)如果设置了多台机器的caddidate_master = 1 , 优先策略依赖于块名字([server_xxx]),如:[server_1] 优衔权高于[server_2] |
check_repl_delay | 在默认情况下,当一个slave同步延迟超过100M relay log(需要应用超过100M relay log), MHA在做故障切换时不会选择这个slave做为新的master,因为恢复需要经过很长时间.当设置了check_repl_delay = 0, MHA将忽略被选择的slave上的同步延迟。 这个选项在设置了candidate_master = 1特声明的期望这台机器成为master的情况下特别有用。 |
hostname | 配置MySQL服务器的机器名或是IP地址,这个配置项是必须的,而且只能配置在[server_xxx]这个块下面。 |
ignore_fail | 在默认情况下,MHA manager不会在slave存在故障的情况下进行Master的故障切换。当设置了ignore_fail = 1时,MHA会在所有的机器有问题的时间也会进行故障切换。 默认是0. |
no_master | 当设置了no_master = 1的服务器,这个服务器永远不会提升为新的master |
port | db的端口号,默认是3306 :port=3307 |
中继日志的处理:
默认情况下,从服务器上的中继日志在SQL线程执行完后会被自动删除的。但是这些中继日志在恢复其他从服务器时候可能会被用到,
因此需要禁用中继日志的自动清除和定期清除旧的中继日志。定期清除中继日志需要考虑到复制延时的问题。在ext3文件系统下,
删除大的文件需要一定的时间,会导致严重的复制延时。为了避免复制延时,暂时为中继日志创建硬链接。
MHA节点包含pure_relay_logs命令工具,它可以为中继日志创建硬链接,执行SET GLOBAL relay_log_purge=1,等待几秒中以便SQL线程切换到新的中继日志,
再执行SET GLOBAL relay_log_purge=0。
pure_relay_logs参数如下所示:
–user mysql用户名
–password mysql密码
–host mysql服务器地址
–port 端口号
–workdir 创建和删除中继日志硬链接目录。成功执行脚本后,硬链接的中继日志文件将被删除。默认目录是/var/tmp。
因此purge_relay_logs脚本删除中继日志不会阻塞SQL线程,在每台从节点上设置计划任务
定期清除中继日志
0 15 * * * /usr/bin/purge_relay_logs -user=yyf -password=yyf -disable_relay_log_purge -port=3307 -host=192.168.56.110 >> /var/log/masterha/app1/purge_relay_logs.log 2>&1
至此,MHA的配置已经完成。很简单吧。配置文件只需存在于MHA Manager端即可。相关测试:将在下篇文章介绍,请戳开:点击打开链接
接下来就可以启动 MHA 监控了:
[root@mha scripts]#nohup masterha_manager --conf=/etc/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/app1.log 2>&1 &
查看MHA状态:
[root@mha ~]# masterha_check_status --conf=/etc/app1.cnf
app1 (pid:9130) is running(0:PING_OK), master:192.168.56.110
停止MHA监控:
[root@mha ~]# masterha_stop --conf=/etc/app1.cnf
解释:
--conf 一组master/slave的配置文件,会同时读取全局配置文件
/etc/masterha_default.cnf
--remove_dead_master_conf 该参数代表当发生主从切换后,老的主库的IP将会从配置文件(app1.conf)中移除.
--ignore_last_failover 在缺省情况下,如果MHA检测到连续发生宕机,且两次宕机间隔不足8小时的话,则不会进行Failover.这样限制是为了避免ping-pong效应。该参数代表忽略上次MHA触发切换产生的文件,默认情况下,MHA发生切换后会在日志目录,也就是上面我设置的/var/log/masterha/app产生app1.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件,为了方便,这里设置为--ignore_last_failover。
监控开启后,就可以做相关测试了,把master上的mysql进程kill掉(pkill mysql )。测试下会不会自动进行failover测试,为了缩短文章篇幅,相关测试
请戳开:点击打开链接
keepalived 安装:
软件下载最新版本:http://www.keepalived.org/software/
keepalived-1.2.13.tar.gz
#yum -y install openssl-devel
#tar -zxvf keepalived-1.2.13.tar.gz
# cd keepalived-1.2.13
#./configure --prefix=/usr/local/keepalived
#make && make install
#cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
#cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
#mkdir /etc/keepalived
#cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
#cp /usr/local/sbin/keepalived /usr/sbin/
keepalived配置及配置文件(在主master 192.168.56.110上的配置)
[root@master ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state backup
interface eth1
nopreempt
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.56.188
}
notify_master "/etc/keepalived/arp.sh"
}
其中router_id MySQL HA表示设定keepalived组的名称,将192.168.56.188这个虚拟ip绑定到该主机的eth1网卡上,并且设置了状态为backup模式,将keepalived的模式设置为非抢占模式(nopreempt),priority 150表示设置的优先级为150。下面的配置略有不同,但是都是一个意思。
在候选master上配置(192.168.56.112)如下:
[root@agent ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state master
interface eth1
nopreempt
virtual_router_id 51
priority 100 #此处很重要,一定要低于当前master的优先级别。值比主master小即可
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.56.188
}
notify_master "/etc/keepalived/arp.sh" ###定义的清除arp路由的脚本。
}
至此,依次把主master和候选master上的keepalived进程开启:
service keepalived start|stop|restart
#ip add 命令查看VIP的绑定情况:
[root@master keepalived]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:70:b3:d8 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.40/24 brd 192.168.2.255 scope global eth0
inet6 fe80::a00:27ff:fe70:b3d8/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:75:5b:94 brd ff:ff:ff:ff:ff:ff
inet 192.168.56.110/24 brd 192.168.56.255 scope global eth1
inet 192.168.56.188/32 scope global eth1
inet6 fe80::a00:27ff:fe75:5b94/64 scope link
valid_lft forever preferred_lft forever