标签:
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密钥
cd /root/.ssh;
ssh-keygen -t dsa -P ‘‘ -f id_dsa;
cat id_dsa.pub >> authorized_keys;
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
分别在136,137,138,139上运行“ssh 192.168.2.xxx”的命令看是否能连通。以下截图以136为例子
五、 安装数据节点
在136,137,138,139上安装数据节点的MHA,每台机都需要安装,下面以136举例:
安装时报以下错误
10.执行安装命令 make && make install
六、 安装管理节点
在136上安装管理节点的MHA (本机的安装文件在 /home/MHA/ 目录下)
安装过程中提示缺少以下模块
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
七、 配置管理节点信息
[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
十四、 模拟主机异常,自动切换
当前的主为137
master
slave
说明138已经切换为主机
主机已切为138
进入mysql ,设置复制
要重新启动,必须执行以下命令删掉上一次成功执行后留下的日志脚本
rm /var/log/masterha/app1/app1.failover.complete
十五、 安装和配置KeepAlived,用虚拟IP对外部用户发布数据库(经测试当两个节点启动KeepAlived并配置了虚拟IP,对虚拟IP的访问会根据一定规则分发到两个节点中的一个,暂时没找到固定分发到一个节点的方法,这样就不满足应用要求,所以此点作废)
yum install -y 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 #健康检查端口
}
}
}
pkill keepalived
chmod +x /usr/local/MySQL/bin/MySQL.sh
service keepalived start
十六、 通过脚本配置对外的虚拟IP
#!/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
master_ip_failover_script=/usr/local/bin/master_ip_failover
masterha_check_repl --conf=/etc/masterha/app1.cnf
出现以下信息则标识脚本检查成功并得知137是MHA的主机
/usr/local/bin/master_ip_failover -command=start -new_master_host=192.168.2.137 -ssh_user=root
虚拟IP启动成功
连接成功
插入前
插入后
137数据库
138数据库
139数据库
删除id = 399 的数据
137数据库
138数据库
139数据库
结论:正常
结论:正常
启动MHA
146执行插入
插入过程中停掉137
查看136切换日志
切换成功
查看138复制状态,看是否已切为主机
已为主机
查看139复制状态,看复制是否已指向138
复制主机已切到138切复制正常
146再执行查询,插入和删除操作,看138,139上数据是否正常
先做查询
查询正常
再做插入
插入正常
再删除id=497的数据
删除正常
再看138的更改是否同步到139
复制正常。
结论:MHA异常处理正常,此部分对用户(通过146访问的客户端)透明,只是在异常处理过程中会短暂连不上(切换主机的几秒内),之前正在连接的客户端重连即可。
标签:
原文地址:http://www.cnblogs.com/JerryBaxia/p/4785313.html