码迷,mamicode.com
首页 > 数据库 > 详细

Mysql MHA 配置测试使用说明

时间:2015-09-06 14:24:51      阅读:409      评论:0      收藏:0      [点我收藏+]

标签:

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密钥

  1. 分别在136,137,138,139四台机器上运行以下三条命令

cd /root/.ssh;

ssh-keygen -t dsa -P ‘‘ -f id_dsa;

cat id_dsa.pub >> authorized_keys;

 技术分享

 

  1. 在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

 技术分享

 

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

 

 技术分享

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

 技术分享

 

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

 技术分享

 

  1. 验证ssh

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

 

 技术分享

 

五、         安装数据节点

在136,137,138,139上安装数据节点的MHA,每台机都需要安装,下面以136举例:

  1. 安装插件yum -y install perl-DBD-MySQL
  2. 安装 mha4mysql-node-0.56.tar.gz  (本机的安装文件在 /home/MHA/ 目录下)
  3. 进入安装文件目录  cd /home/MHA
  4. 解压安装包  tar -zxvpf mha4mysql-node-0.56.tar.gz
  5. 进入解压后安装目录  cd mha4mysql-node-0.56
  6. 执行安装  perl Makefile.PL

    安装时报以下错误

 技术分享

  1. 安装错误提示中所缺的模块  yum install perl-CPAN
  2. 在重新执行安装命令 perl Makefile.PL
  3. 出现以下信息则表示可以安装

   技术分享

10.执行安装命令 make && make install

 

 

六、         安装管理节点

    在136上安装管理节点的MHA (本机的安装文件在 /home/MHA/ 目录下)

  1. 安装 mha4mysql-manager-0.56.tar.gz  (本机安装文件在/home/MHA/目录下)
  2. 进入安装文件目录  cd /home/MHA
  3. 解压安装包  tar -zxvpf mha4mysql-manager-0.56.tar.gz
  4. 进入解压后目录  cd mha4mysql-manager-0.56
  5. 执行安装  perl Makefile.PL

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

 技术分享

  1. 安装缺少的模块

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

  1. 重新执行安装 perl Makefile.PL
  2. 出现以下信息则表示可以安装

 技术分享

  1. 执行安装命令 make && make install

 

 

七、         配置管理节点信息

  1. 新增配置信息文件 /etc/masterha/app1.cnf
  2. 编辑配置文件,输入以下配置并保存

[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/

  1. 配置信息中各项配置的简要说明

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

 

 技术分享

 

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

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

 技术分享

当前的主为137

 

  1. 136查看 MHA日志

 技术分享

 

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

 技术分享

 

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

 技术分享

 

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

 技术分享

 

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

 技术分享

 

  1. 查看138复制状态

master

 技术分享

slave

 技术分享

说明138已经切换为主机

 

  1. 查看139复制状态

 技术分享

主机已切为138

 

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

 

进入mysql ,设置复制

 

 

 

  1. 成功切换后 MHA会自动停止

 

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

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

 

 

 

十五、              安装和配置KeepAlived,用虚拟IP对外部用户发布数据库(经测试当两个节点启动KeepAlived并配置了虚拟IP,对虚拟IP的访问会根据一定规则分发到两个节点中的一个,暂时没找到固定分发到一个节点的方法,这样就不满足应用要求,所以此点作废)

  1. 在137,138上执行以下命令安装KeepAlived,以下用138举例

yum install -y keepalived

 

  1. 配置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      #健康检查端口

        }

    }

 

}

 

  1. 在 /usr/local/MySQL/bin/ 路径下新建脚本文件 MySQL.sh (脚本文件路径和文件名可以自定义,只要和KeepAlived配置文件中notify_down 对应上就可以),输入以下脚本内容并保存。

pkill keepalived

 

  1. 执行以下命令给脚本赋权限

chmod +x /usr/local/MySQL/bin/MySQL.sh

 

  1. 启动KeepAlived服务

service keepalived start

 

  1. 在137上以上同样的操作。

 

  1. 通过外部MySql客户端连接虚拟的IP 146 检查是否正常。

 

  1. 再参照十四大点的测试步骤,检查当主机异常时,对外部MySql客户端的操作是否正常。

 

 

十六、              通过脚本配置对外的虚拟IP

  1. 在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";

}

 

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

 

 

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

chmod +x /usr/local/bin/master_ip_failover

 

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

master_ip_failover_script=/usr/local/bin/master_ip_failover

 

 

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

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

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

 

 

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

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

 

虚拟IP启动成功

 

 

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

 

连接成功

 

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

插入前

 

插入后

 

137数据库

 

138数据库

 

139数据库

 

 

删除id = 399 的数据

 

 

137数据库

 

138数据库

 

139数据库

 

 

结论:正常

 

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

结论:正常

 

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

启动MHA

146执行插入

 

 

插入过程中停掉137

 

 

查看136切换日志

 

切换成功

 

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

 

已为主机

 

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

 

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

 

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

先做查询

 

 

查询正常

 

再做插入

 

 

插入正常

 

再删除id=497的数据

 

 

删除正常

 

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

 

复制正常。

 

 

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

 

Mysql MHA 配置测试使用说明

标签:

原文地址:http://www.cnblogs.com/JerryBaxia/p/4785313.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!