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;

7ff003fb25815a9c9d9cfcc08b0f7447.png

在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

1317e48e771e3ea5bf674abca9978c06.png

运行以下命令将刚刚拷贝过来的id_dsa.pub.137,id_dsa.pub.138,id_dsa.pub.139加入到authorized_keys中

73a643fab98c72175871ebe37b3f1417.png

运行以下命令检查authorized_keys,如有四条对应机器的信息,则表示操作成功。

088b894c81aaf815d00d83bf95b6ccaf.png

将authorized_keys 分别拷贝到137,138,139的 /root/.ssh路径下。期间需要输入root用户的密码。

1d10817e78c0096d2c58dcf5d010dccf.png

验证ssh

分别在136,137,138,139上运行“ssh 192.168.2.xxx”的命令看是否能连通。以下截图以136为例子

be01deb12b5460e71a519da23f997224.png

五、         安装数据节点

在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

安装时报以下错误

0c84a060895fc4f1110b7e37b35f56e2.png

安装错误提示中所缺的模块  yum install perl-CPAN

在重新执行安装命令 perl Makefile.PL

出现以下信息则表示可以安装

c8a9c9a551906e995b16db19ed97715d.png

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

安装过程中提示缺少以下模块

3da30ebf70ee8a5a00b8edb23fb484a7.png

安装缺少的模块

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

出现以下信息则表示可以安装

9de2af210fc9da62614d2c9aaf6183f5.png

执行安装命令 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

出现以下提示则表示检测成功

0dc755837a2c4224c43d66561184f8b6.png

九、         用MHA检测复制

输入以下命令检测 masterha_check_repl --conf=/etc/masterha/app1.cnf

得到以下提示则表示复制测试成功

923178fc607dcb1e52b7baf4b539ef8c.png

十、         启动MHA

执行以下命令启动MHA

nohup masterha_manager --conf=/etc/masterha/app1.cnf/var/log/masterha/app1/manager.log 2>&1 &

363eca11d2a285bb7ca04088b404b948.png

十一、              查看MHA状态

运行以下命令可以查看 MHA状态

masterha_check_status --conf=/etc/masterha/app1.cnf

c3ab072b1dc44e6cb8e18a0ad8aa1745.png

十二、              停止MHA

运行以下命令可以停止MHA

masterha_stop --conf=/etc/masterha/app1.cnf

4d8875a6b6f70ca0c249b9d86f71eff2.png

十三、              查看MHA日志

运行以下命令可以查看MHA日志

tail -f /var/log/masterha/app1/manager.log

43aef915bcb36d2cc97c77aa3e659d79.png

十四、              模拟主机异常,自动切换

136上启动MHA,并查看MHA状态

91b6d107ada3684c28b97a59a5e2ce5a.png

当前的主为137

136查看 MHA日志

01d2acf4ae9b5ae296af504cd2ef6069.png

138 执行lave status\G 检查复制状态

06fa2b62db95b1db4cfa332390f1c487.png

139执行slave status\G 检查复制状态

8f8c0025d9e081d70e7aeae2d3b0e770.png

模拟主机故障,停掉137的MySQL服务

6dff813f4b8b32e519097ce98b2d5243.png

136 MHA日志显示切换成功,主机从137切换到138

1510c6d7578f890417894a4363eec285.png

查看138复制状态

master

aa1610707cbd134e3f1384c1671e17f0.png

slave

cc3e7b2455238b1332392ba7d50b59cd.png

说明138已经切换为主机

查看139复制状态

f0591960bf933db3edee8765944fd6da.png

主机已切为138

重启137 MySql服务,将其设置成从机

0e025decbf8c9727b6f433aa2a1d58ff.png

进入mysql ,设置复制

a2161a538561f580b4b946b7e0672b2d.png

15ee9a27a673007deeb4b605d96deef6.png

成功切换后 MHA会自动停止

cdddb32b55f832c5eeff33e29f64884b.png

要重新启动,必须执行以下命令删掉上一次成功执行后留下的日志脚本

rm /var/log/masterha/app1/app1.failover.complete

36d7b2ca8fe966d48546c0a3f7d72099.png

十五、              安装和配置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 {

print

"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";

}

以下几个地方是需要根据自己的实际情况修改的

c8527346f6b67acaf90f290b3f2645a4.png

运行以下命令给脚本赋权限

chmod +x /usr/local/bin/master_ip_failover

修改管理节点配置文件 /etc/masterha/app1.cnf,增加以下配置

master_ip_failover_script=/usr/local/bin/master_ip_failover

bf0db59a93c0eb1f06ebe222f55f2fc9.png

运行以下命令查看主机信息和检查脚本

masterha_check_repl --conf=/etc/masterha/app1.cnf

出现以下信息则标识脚本检查成功并得知137是MHA的主机

5a746461a6fda35d064faaa4f4f7eab7.png

执行以下命令执行脚本,启动虚拟IP

/usr/local/bin/master_ip_failover -command=start -new_master_host=192.168.2.137 -ssh_user=root

e4ffa56d4611766c2f4d352f14423662.png

虚拟IP启动成功

003ca8975c3bad56bc3a61b04013ed4d.png

外部客户端通过虚拟IP连接数据库

5a7b2667cd0daf5e4c7f0dad59eb43e8.png

连接成功

检查插入,删除和查询功能是否正常。

插入前

4799e08cede1859d30621caf89f51e07.png

插入后

a8025250fe51e644c630e6aff84410e8.png

137数据库

a5b5cc63d4e6fb90fd2c5add2e273582.png

138数据库

c4c3d9531c3a56e714acf6973b2f18a6.png

139数据库

2764333ccfc38cbde2b365fb0c2e4906.png

删除id = 399 的数据

006e5bc11f85d5dff6ffd3bce08ebc45.png

137数据库

0fbb6023860afbad264c8fbf04bed9d9.png

138数据库

cc0bf44e5c532f2955b46d67c4792349.png

139数据库

ae7f3f289e605e116d7c637c23fcf735.png

结论:正常

启动MHA,再按第七点的思路重新测试增加删除和查询功能是否正常。

结论:正常

模拟137挂机,检查插入,删除和查询功能。

启动MHA

146执行插入

9babadf7a9e28dc7ce92c31cb24aecbf.png

插入过程中停掉137

8e6c2a9e5f3bce86859801086ab2d70e.png

查看136切换日志

355d9264d4845fd7bbfed1f14f51d2da.png

切换成功

查看138复制状态,看是否已切为主机

50860a9f32c33cd821c04f9819eecb2c.png

已为主机

查看139复制状态,看复制是否已指向138

08f87ff1589800b168750a09b05d0a2e.png

复制主机已切到138切复制正常

146再执行查询,插入和删除操作,看138,139上数据是否正常

先做查询

557c484129205b2e7b2a0c1f2cb8f3d7.png

579266738544b27879217d0c8195c520.png

查询正常

再做插入

18ff5bc50bf98acb5b8af7cf16cb15eb.png

20a007943def3965043c7167c0ad56cf.png

插入正常

再删除id=497的数据

60cb698b216742394264832e49e47163.png

00cc72b11f19b56f83583b99c357cae4.png

删除正常

再看138的更改是否同步到139

35680f01a54f1f03ad8959fda2419dd0.png

bbc0226de9451981e5138adb5162c085.png

复制正常。

结论:MHA异常处理正常,此部分对用户(通过146访问的客户端)透明,只是在异常处理过程中会短暂连不上(切换主机的几秒内),之前正在连接的客户端重连即可。