mysql mha keepalived_Mysql MHA 主从配置+Keepalived测试使用说明
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/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访问的客户端)透明,只是在异常处理过程中会短暂连不上(切换主机的几秒内),之前正在连接的客户端重连即可。