Mysql MHA 使用说明
一、 MHA 简介
MHA,即Master High Availability Manager and Tools for MySQL,是日本的一位MySQL专家采用Perl语言编写的一个脚本管理工具,该工具仅适用于MySQL Replication(二层)环境,目的在于维持Master主库的高可用性。
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功能的脚本来加快故障转移的。
二、 本次试验环境
192.168.2.136(MHA Manager ) CentOS6.6+MySql5.6.24
192.168.2.137 (Master) CentOS6.6+MySql5.6.24
192.168.2.138(Slave1) CentOS6.6+MySql5.6.24
192.168.2.139(Slave2) CentOS6.6+MySql5.6.24
说明:本次试验是在一主二从的拓扑下测试,136为管理节点和配置虚拟IP,137为主机,138为主备,139为从机,当137发生异常,若自动将138设为主机,139复制正常,此部分操作对通过136虚拟IP访问的外部用户透明并且不会影响增删改操作,则测试成功,也是此次测试的目的。
三、 本次试验前提
本次试验前提环境是137,138,139均安装好Mysql数据库复制正常,三个数据库都允许外部IP访问。
(测试环境中的三个数据库用户名和密码均为root,137和138的复制用户和密码分别为repl和123456)。
ps:设置复制命令
change master to master_host='192.168.2.xxx',master_user='repl',master_password='123456',master_port=3306,master_log_file='mysql-bin.000003',master_log_pos=120,master_connect_retry=10;
四、 生成ssh密钥
- 分别在136,137,138,139四台机器上运行以下三条命令
cd /root/.ssh;
ssh-keygen -t dsa -P '' -f id_dsa;
cat id_dsa.pub >> authorized_keys;
- 在136上运行以下命令将137,138,139上的id_dsa.pub文件拷贝到当前机器的当前路径下并在名称后加上ip加以区分。拷贝期间要输入137,138,139的root用户密码。
scp 192.168.2.137:/root/.ssh/id_dsa.pub ./id_dsa.pub.137
scp 192.168.2.138:/root/.ssh/id_dsa.pub ./id_dsa.pub.138
scp 192.168.2.139:/root/.ssh/id_dsa.pub ./id_dsa.pub.139
- 运行以下命令将刚刚拷贝过来的id_dsa.pub.137,id_dsa.pub.138,id_dsa.pub.139加入到authorized_keys中
- 运行以下命令检查authorized_keys,如有四条对应机器的信息,则表示操作成功。
- 将authorized_keys 分别拷贝到137,138,139的 /root/.ssh路径下。期间需要输入root用户的密码。
- 验证ssh
分别在136,137,138,139上运行“ssh 192.168.2.xxx”的命令看是否能连通。以下截图以136为例子
五、 安装数据节点
在136,137,138,139上安装数据节点的MHA,每台机都需要安装,下面以136举例:
- 安装插件yum -y install perl-DBD-MySQL
- 安装 mha4mysql-node-0.56.tar.gz (本机的安装文件在 /home/MHA/ 目录下)
- 进入安装文件目录 cd /home/MHA
- 解压安装包 tar -zxvpf mha4mysql-node-0.56.tar.gz
- 进入解压后安装目录 cd mha4mysql-node-0.56
- 执行安装 perl Makefile.PL
安装时报以下错误
- 安装错误提示中所缺的模块 yum install perl-CPAN
- 在重新执行安装命令 perl Makefile.PL
- 出现以下信息则表示可以安装
10.执行安装命令 make && make install
六、 安装管理节点
在136上安装管理节点的MHA (本机的安装文件在 /home/MHA/ 目录下)
- 安装 mha4mysql-manager-0.56.tar.gz (本机安装文件在/home/MHA/目录下)
- 进入安装文件目录 cd /home/MHA
- 解压安装包 tar -zxvpf mha4mysql-manager-0.56.tar.gz
- 进入解压后目录 cd mha4mysql-manager-0.56
- 执行安装 perl Makefile.PL
安装过程中提示缺少以下模块
- 安装缺少的模块
cd -
yum install perl-Time-HiRes
yum install perl-Config-Tiny
yum install perl-MIME-Lite
rpm -ivh perl-Mail-Sender-0.8.16-1.el6.rf.noarch.rpm
rpm -ivh perl-Mail-Sendmail-0.79-1.2.el6.rf.noarch.rpm
yum install perl-Params-Validate
rpm -ivh perl-Log-Dispatch-2.27-1.el6.noarch.rpm
yum install -y perl-libwww-perl
rpm -ivh perl-Parallel-ForkManager-0.7.5-2.2.el6.rf.noarch.rpm
cd mha4mysql-manager-0.56
- 重新执行安装 perl Makefile.PL
- 出现以下信息则表示可以安装
- 执行安装命令 make && make install
七、 配置管理节点信息
- 新增配置信息文件 /etc/masterha/app1.cnf
- 编辑配置文件,输入以下配置并保存
[server default]
manager_workdir=/var/log/masterha/app1
manager_log=/var/log/masterha/app1/manager.log
ssh_user=root
repl_user=repl
repl_password=123456
ping_interval=1
user=root
password=root
[server1]
hostname=192.168.2.137
candidate_master=1
master_binlog_dir=/var/lib/mysql/
[server2]
hostname=192.168.2.138
#candidate_master=1
master_binlog_dir=/var/lib/mysql/
[server3]
hostname=192.168.2.139
#candidate_master=1
master_binlog_dir=/var/lib/mysql/
- 配置信息中各项配置的简要说明
manager_workdir MHA的工作目录
manager_log MHA日志目录
ssh_user ssh连接用户
repl_user 数据库复制用户
repl_password 数据库复制用户密码
ping_interval ping时间间隔
user 数据库用户名
password 数据库密码
hostname 主机
candidate_master 切换主机优先级
master_binlog_dir 主机复制的二进制日志路径
八、 用MHA检测ssh
输入以下命令检测 masterha_check_ssh --conf=/etc/masterha/app1.cnf
出现以下提示则表示检测成功
九、 用MHA检测复制
输入以下命令检测 masterha_check_repl --conf=/etc/masterha/app1.cnf
得到以下提示则表示复制测试成功
十、 启动MHA
执行以下命令启动MHA
nohup masterha_manager --conf=/etc/masterha/app1.cnf</dev/null>/var/log/masterha/app1/manager.log 2>&1 &
十一、 查看MHA状态
运行以下命令可以查看 MHA状态
masterha_check_status --conf=/etc/masterha/app1.cnf
十二、 停止MHA
运行以下命令可以停止MHA
masterha_stop --conf=/etc/masterha/app1.cnf
十三、 查看MHA日志
运行以下命令可以查看MHA日志
tail -f /var/log/masterha/app1/manager.log
十四、 模拟主机异常,自动切换
- 136上启动MHA,并查看MHA状态
当前的主为137
- 136查看 MHA日志
- 138 执行lave status\G 检查复制状态
- 139执行slave status\G 检查复制状态
- 模拟主机故障,停掉137的MySQL服务
- 136 MHA日志显示切换成功,主机从137切换到138
- 查看138复制状态
master
slave
说明138已经切换为主机
- 查看139复制状态
主机已切为138
- 重启137 MySql服务,将其设置成从机
进入mysql ,设置复制
- 成功切换后 MHA会自动停止
要重新启动,必须执行以下命令删掉上一次成功执行后留下的日志脚本
rm /var/log/masterha/app1/app1.failover.complete
十五、 安装和配置KeepAlived,用虚拟IP对外部用户发布数据库(经测试当两个节点启动KeepAlived并配置了虚拟IP,对虚拟IP的访问会根据一定规则分发到两个节点中的一个,暂时没找到固定分发到一个节点的方法,这样就不满足应用要求,所以此点作废)
- 在137,138上执行以下命令安装KeepAlived,以下用138举例
yum install -y keepalived
- 配置KeepAlived配置文件keepalived.conf (文件默认在 /etc/keepalived/ ),以下为参考配置
global_defs {
notification_email {
qinjinzhi@ava.com.cn # 设置报警邮件地址,可设置多个
}
notification_email_from qinjinzhi@ava.com.cn # 设置 邮件的发送地址
smtp_server smtp.ava.com.cn # 设置 smtp server 地址
smtp_connect_timeout 30 # 设置 连接 smtp server的超时时间
router_id MySQL-ha # 设置 keepalived 服务器的一个标识。发邮件时显示在邮件主题中的信息
}
# vrrp 实例部分定义
vrrp_instance VI_1 {
state BACKUP # 指定Keepalived的角色,MASTER为主,BACKUP为从 ,当两台服务器都运行时,MASTER工作,BACKUP待机,当MASTER出现错误工作不了时,BACKUP接替工作。当MASTER修复后MASTER接替工作,BACKUP待机
interface eth0 # 绑定真实的物理网卡
virtual_router_id 60 # 虚拟路由表示,是一个数字,同一个vrrp 实例使用唯一的标识, 默认值是51,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致
priority 100 # 定义优先级,数字越大,优先级越高。同一个 vrrp_instance 下,MASTER 优先级必须大于 BACKUP
advert_int 1 # 设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,默认为1秒
nopreempt #不主动抢占资源,只在优先级高的机器上设置即可,优先级低的机器不设置
authentication { # 设置验证类型和密码
auth_type PASS # 设定验证类型,主要有: PASS 和 AH 两种
auth_pass 1111 # 设置验证密码,在一个 vrrp_instance 下, MASTER 和 BACKUP必须使用相同的密码才能通信
}
virtual_ipaddress { # 设置虚拟IP地址
192.168.2.146 # 可以设置多个虚拟IP地址,每行一个
}
}
# 虚拟服务器定义部分
virtual_server 192.168.2.146 3306 { # 设置虚拟服务器需要指定虚拟IP地址和服务端口,IP和端口之间用空格隔开
delay_loop 2 # 设置运行情况检查,默认为6秒
lb_algo rr # 设置负载均衡调度算法,这里设置为rr, 即轮询算法
lb_kind NAT # 设置LVS实现负载均衡的机制,有 NAT,TUN和DR三个模式可选
# LVS-NAT:地址转换
# LVS-DR: 直接路由
# LVS-TUN:隧道
nat_mask 255.255.255.0
persistence_timeout 50 # 会话保持时间,单位是秒。这个选项对动态网页比较有用,为集群系统中的session共享提供了很好的解决方案
# 用户请求会一直发布到某个服务节点,知道超过这个会话的保持时间。
# 需要注意,这个会话保持时间是最大无响应超时时间,即,用户在操作动态页面是,指定描述内无任何操作
# 则接下来的操作会被分发到其他节点,若一直操作则不受该设置限制
protocol TCP # 指定转发协议类型,有TCP和UDP
real_server 192.168.2.138 3306 { # 配置服务节点1,需要指定 real_server 的真实IP地址和端口,IP与端口之间用空格隔开
weight 100 # 配置服务节点的权值,权值大小用数字表示,数字越大,权值越高
# 设置权值的大小可以为不同性能的服务器分配不同的负载,可以为性能搞的服务器设置较高的权值,
# 性能低的设置相对低的权值
notify_down /usr/local/MySQL/bin/MySQL.sh #检测到服务down后执行的脚本
TCP_CHECK { # realserver的状态检测设置部分,单位是秒
connect_timeout 3 # 表示3秒无响应超时
nb_get_retry 3 # 表示重试次数
delay_before_retry 3 # 表示重试间隔
connect_port 3306 #健康检查端口
}
}
}
- 在 /usr/local/MySQL/bin/ 路径下新建脚本文件 MySQL.sh (脚本文件路径和文件名可以自定义,只要和KeepAlived配置文件中notify_down 对应上就可以),输入以下脚本内容并保存。
pkill keepalived
- 执行以下命令给脚本赋权限
chmod +x /usr/local/MySQL/bin/MySQL.sh
- 启动KeepAlived服务
service keepalived start
- 在137上以上同样的操作。
- 通过外部MySql客户端连接虚拟的IP 146 检查是否正常。
- 再参照十四大点的测试步骤,检查当主机异常时,对外部MySql客户端的操作是否正常。
十六、 通过脚本配置对外的虚拟IP
- 在136上新建脚本文件master_ip_failover (本例是放在路径 /usr/local/bin/ 下,虚拟IP为146 ),以下为脚本内容
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use Getopt::Long;
my (
$command, $ssh_user, $orig_master_host, $orig_master_ip,
$orig_master_port, $new_master_host, $new_master_ip, $new_master_port
);
# my $vip = '172.16.21.119/24'; # Virtual IP
my $vip = '192.168.2.146'; # Virtual IP
my $gateway = '192.168.2.1';#Gateway IP
# my $interface = 'eth0'
my $key = "1";
my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
GetOptions(
'command=s' => \$command,
'ssh_user=s' => \$ssh_user,
'orig_master_host=s' => \$orig_master_host,
'orig_master_ip=s' => \$orig_master_ip,
'orig_master_port=i' => \$orig_master_port,
'new_master_host=s' => \$new_master_host,
'new_master_ip=s' => \$new_master_ip,
'new_master_port=i' => \$new_master_port,
);
exit &main();
sub main {
print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";
if ( $command eq "stop" || $command eq "stopssh" ) {
# $orig_master_host, $orig_master_ip, $orig_master_port are passed.
# If you manage master ip address at global catalog database,
# invalidate orig_master_ip here.
my $exit_code = 1;
eval {
print "Disabling the VIP on old master: $orig_master_host \n";
&stop_vip();
$exit_code = 0;
};
if ($@) {
warn "Got Error: $@\n";
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "start" ) {
# all arguments are passed.
# If you manage master ip address at global catalog database,
# activate new_master_ip here.
# You can also grant write access (create user, set read_only=0, etc) here.
my $exit_code = 10;
eval {
print "Enabling the VIP - $vip on the new master - $new_master_host \n";
&start_vip();
$exit_code = 0;
};
if ($@) {
warn $@;
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "status" ) {
print "Checking the Status of the script.. OK \n";
`ssh $ssh_user\@cluster1 \" $ssh_start_vip \"`;
exit 0;
}
else {
&usage();
exit 1;
}
}
# A simple system call that enable the VIP on the new master
sub start_vip() {
`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
# A simple system call that disable the VIP on the old_master
sub stop_vip() {
`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}
sub usage {
"Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
}
以下几个地方是需要根据自己的实际情况修改的
- 运行以下命令给脚本赋权限
chmod +x /usr/local/bin/master_ip_failover
- 修改管理节点配置文件 /etc/masterha/app1.cnf,增加以下配置
master_ip_failover_script=/usr/local/bin/master_ip_failover
- 运行以下命令查看主机信息和检查脚本
masterha_check_repl --conf=/etc/masterha/app1.cnf
出现以下信息则标识脚本检查成功并得知137是MHA的主机
- 执行以下命令执行脚本,启动虚拟IP
/usr/local/bin/master_ip_failover -command=start -new_master_host=192.168.2.137 -ssh_user=root
虚拟IP启动成功
- 外部客户端通过虚拟IP连接数据库
连接成功
- 检查插入,删除和查询功能是否正常。
插入前
插入后
137数据库
138数据库
139数据库
删除id = 399 的数据
137数据库
138数据库
139数据库
结论:正常
- 启动MHA,再按第七点的思路重新测试增加删除和查询功能是否正常。
结论:正常
- 模拟137挂机,检查插入,删除和查询功能。
启动MHA
146执行插入
插入过程中停掉137
查看136切换日志
切换成功
查看138复制状态,看是否已切为主机
已为主机
查看139复制状态,看复制是否已指向138
复制主机已切到138切复制正常
146再执行查询,插入和删除操作,看138,139上数据是否正常
先做查询
查询正常
再做插入
插入正常
再删除id=497的数据
删除正常
再看138的更改是否同步到139
复制正常。
结论:MHA异常处理正常,此部分对用户(通过146访问的客户端)透明,只是在异常处理过程中会短暂连不上(切换主机的几秒内),之前正在连接的客户端重连即可。