一.參数说明

MHA提供了一系列配置參数。深入理解每一个參数的详细含义,对优化配置、合理使用MHA非常重要。非常多高可用性也都是通过合理配置一些參数而实现的。

MHA包含例如以下配置參数,分别说明例如以下:

hostname/ip/port (Local Only)

hostname为MySQL Server的IP地址或主机名;

ip为MySQL Server的IP地址。缺省从$hostname中获取;port为MySQL Server的端口号,缺省为3306

ssh_host/ssh_ip/ssh_port (Local Only) 

这三个參数是从版本号0.53才引入的,当中ssh_host同$hostname。ssh_ip同$ip。ssh_port为SSH通信使用的系统端口号,缺省为22。

ssh_connection_timeout (Local/App/Global) SSH连接超时阀值,缺省为5秒,该參数从版本号0.54開始引入。

ssh_options (Local/App/Global) 额外的SSH命令选项,该參数从版本号0.53開始引入。

candidate_master (Local Only)

该參数用于设置某个Slave能否够优先成为Master。

若设置为1,则相应的那个Slave可优先成为新的Master;若多个Slave均设置该參数为1,则成为Master的优先级依照[server_1]/[server_2]/…排序;

缺省值为0。表示不设置某个Slave优先成为Master,即全部Slave成为Master的优先级一样,此时MHA会选择一个延迟最小的Slave成为新的Master。

no_master  (Local Only)

是否禁止某个Slave成为Master,缺省值为0。表示每一个Slave都有机会成为新的Master。

若设置为1,则相应的那个Slave永远不会成为Master。

ignore_fail (Local Only)

缺省情况下,当某个Slave故障时(比方:不能通过MySQL/SSH连接,SQL线程因错误停止等)。MHA不开启故障切换;若设置为1,则相应的那个Slave出现问题时自己主动切换。

user/password (Local/App/Global)

MySQL数据库管理账户及password,由于要运行一些必要的管理命令,比方:Stop Slave、Change Master、Reset Slave,所以该账户应该为root,这也是缺省值。

repl_user /repl_password (Local/App/Global) MySQL复制账户及密码

disable_log_bin (Local/App/Global)

若设置该參数。则在Slave应用差异日志时。自身不生成二进制日志;MHA内部是通过在调用mysqlbinlog工具命令时加參数—disable-log-bin实现的,缺省值为0。

master_pid_file (Local/App/Global) 设置Master实例的pid文件,该參数适用于一台server安装多个MySQL实例的情况。

ssh_user (Local/App/Global)

MHA Manager和Node訪问MySQL Server所使用的OS用户,在多种情况下,都会用到该账户。比方:远程运行命令、在Slave间拷贝差异的Relay logs等。

该用户至少要拥有读取MySQL binary/relay log文件和relay_log.info文件的权限,以及日志文件夹的写权限(remote_workdir參数指定的路径)。

该用户不须要交互就可以连接到其他server上,所以建议使用SSH公共密钥认证,即配置SSH等效性;缺省情况下。ssh_user为系统管理账户。即root账户。

remote_workdir (Local/App/Global)

每一个MHA Node节点(执行MySQL实例的server)的工作文件夹全路径,当中会生成日志文件,缺省为/var/tmp。若路径不存在,MHA Node会自己主动创建,当然这须要拥有足够的权限。

注意:无论是Manager还是Node。都会检查文件夹的可用磁盘空间。

master_binlog_dir (Local/App/Global)

MySQL主库的binlog日志文件的全路径,缺省为/var/lib/mysql。依据实际情况设置为真实的路径。

该參数适用于这么一种情况:Master实例故障。但OS系统执行正常,此时MHA可通过SSH登录。然后读取并拷贝必须的二进制日志事件(即差异的日志)。

可见该參数是必要而实用的,由于Master死掉后,MHA无法自己主动获取binlog日志文件的路径。

另外。可用逗号隔开设置多个路径。

log_level  (App/Global) MHA Manager的日志等级,可设置为debug/info/warning/error,缺省为info

manager_workdir (App) MHA Manger节点生的工作文件夹全路径,当中生成各种相关的状态文件,若未设置。则缺省为/var/tmp。

manager_log (App)

MHA Manager日志的全路径名称。若未设置。则输出到STDOUT/STDERR;

须要注意的是:在运行手动故障切换时,MHA则忽略參数设置,而直接输出到STDOUT/STDERR。

check_repl_delay (App/Global)

缺省情况下,假设某个Slave延迟超过100MB的relay logs,MHA则不会选择该Slave成为新的Master,由于这须要太长的时间来恢复。

若设置该參数为0,MHA在选择新的Master时,会忽略复制延迟。

当为某个Slave设置candidate_master=1,使其优先成为新的Master时,该參数很实用。

check_repl_filter (App/Global)

缺省情况下,假设Master、Slaves拥有不同的binlog/replication过滤规则。MHA会报错而且不开启监控或故障切换,这是为了避免一些意想不到的恢复错误,比方:Table not exists等。

假设你百分百确信这些不同的过滤设置不会导致恢复问题。则设置该參数为0。

须要注意的是:当应用差异日志时。MHA并不检查过滤规则。若设置该參数为0,可能会遇到“Table not exists”之类的错误,所以设置该參数时一定要小心,缺省设置为1。

latest_priority (App/Global)

缺省情况下,MHA选择最新的Slave(即延迟最少的Slave)优先成为新的Master。假设你想全然控制每一个Slave成为Master的顺序,则可设置该參数为0,此时优先级由candidate_master參数

和每一个Slave的[server_xxx]顺序决定。

multi_tier_slave (App/Global)

缺省情况下,MHA是不同意配置多层(3层及以上)复制结构的,比如:host1->host2->host3。此时MHA会报错而停止。

从版本号0.52開始,MHA引入了新的參数――multi_tier_slave,以此来支持多层复制配置。

若设置了该參数,MHA不会由于3层复制结构而终止,而是忽略第三层复制;此时,若host1(master)崩溃。则host2被选择成为新的Master,host3继续从host2复制。好像第三层复制不存在一样。

ping_interval (App/Global)

该參数用于设置MHA Manager多长时间ping(运行ping SQL语句)一次Master,即ping Master实例的时间间隔,缺省为3秒。

当连续丢失3次连接间隔,即连续ping了3次都失败后。MHA Manager则觉得Master已经死掉。所以通过这样的ping机制发现故障的最长时间为ping_interval的4倍。即12秒。

注意:因为身份认证错误或MySQL实例连接数过多而导致的连接失败次数不计入Master死亡统计数。

ping_type  (App/Global)

缺省情况下,MHA创建一个到Master的持久连接,然后定期(由ping_interval參数决定)运行“SELECT 1”(ping_type=SELECT),以此来检查Master的可用性。

但在有些情况下。通过定期地“创建/断开连接”方式效果会更好。由于这样的方式相对来说更严格。而且能够更快地监測到TCP连接级故障;若採用这样的方式。需设置ping_type=CONNECT。

该參数是从版本号0.53開始引入的,可设置为CONNECT或SELECT。缺省为SELECT。

secondary_check_script (App/Global)

默认情况下。MHA通过单个路由(即从Manager到Master)来检查Master的可用性。这显然是不够完好的,强烈建议採用两个或多个网络路由来检查Master的可用性。

MHA正是通过调用secondary_check_script參数定义的外部脚本来实现多路由监測的,比方:

secondary_check_script=masterha_secondary_check -s remote_host1 -s remote_host2

masterha_secondary_check包括于MHA Manager包中,其内置的脚本在多数情况下还是比較好用的;当然,若须要很多其它的功能,也可自己定义一个网络检查脚本,然后通过该參数调用。

在上面的样例中,MHA通过例如以下两条路径来监測MySQL Master Server的活动:

Manager(A)->remote_host1(B)->master_host

Manager(A)->remote_host2(B)->master_host

通过这两条路径,若连接A成功,连接B失败。masterha_secondary_check退出并返回代码0,MHA Manager推断Master已经真正死掉。并開始故障切换;假设A不成功,

masterha_secondary_check退出并返回代码2。MHA Manager猜猜可能发生了网络问题,并不開始故障切换;若B成功,则退出并返回代码3。此时MHA Manager觉得Master实际上是活着的,

也不開始故障切换。

一般来说,remote_host1和remote_host2这两条从MHA Manager到MySQL Server的通道应该位于为不同的网段。

MHA调用该參数定义的脚本时,会自己主动传递user/master_host/master_ip/master_port这几个參数,所以无需反复定义。

使用masterha_secondary_check。有下面几点须要说明:

――内置脚本依赖于IO::Socket::INET Perl包,该包从Perl v5.6.0缺省已包括;

――内置脚本须要通过SSH连接到其他远程server,所以须要设置SSH公共密钥认证;

――另外。内置脚本尝试从remote server建立到MySQL Master的TCP连接,这意味着MySQL配置文件里的max_connections设置不受影响,假设TCP连接成功。

则MySQL的aborted_connects状态值递增1。

master_ip_failover_script (App/Global)

经常使用的HA环境,一般是通过VIP来实现的,在Master上绑定一个VIP,Master崩溃后,由HA将VIP切换到Standby上。

还有一种常见方法是创建一个全局文件夹数据库,里面存放全部的应用和Writer/Reader IP地址映射列表,以此来取代VIP,这样的情况下。若Master故障。则需更新映射列表。

这两种方法各有利弊,MHA不限制使用哪一种,同意用户使用不论什么基于IP地址的故障切换方案。该參数就是用于此目的,换句话说,就是须要自行编写一个脚本来保证应用能够透明地

连接到新的Master上,并通过该參数调用,比方:master_ip_failover_script=/usr/local/sample/bin/master_ip_failover

演示样例脚本为(MHA Manager package)/samples/scripts/master_ip_failover。

整个执行期间。MHA Manager须要调用该脚本3次,第一次是在開始监控之前。目的是检查脚本的可用性,第二次是在调用shutdown_script脚本之前。第三次是在新的Master应用全然部的

relay logs之后。

调用期间,MHA Manager会传递例如以下參数:

 Checking phase

--command=status

--ssh_user=(current master's ssh username)

--orig_master_host=(current master's hostname)

--orig_master_ip=(current master's ip address)

--orig_master_port=(current master's port number)

 Current master shutdown phase

--command=stop or stopssh

--ssh_user=(dead master's ssh username,if reachable via ssh)

--orig_master_host=(current(dead) master's hostname)

--orig_master_ip=(current(dead) master's ip address)

--orig_master_port=(current(dead) master's port number)

 New master activation phase

--command=start

--ssh_user=(new master's ssh username)

--orig_master_host=(dead master's hostname)

--orig_master_ip=(dead master's ip address)

--orig_master_port=(dead master's port number)

--new_master_host=(new master's hostname)

--new_master_ip=(new master's ip address)

--new_master_port=(new master's port number)

--new_master_user=(new master's user)

--new_master_password=(new master's password)

假设採用的是在Master上绑定共享VIP方式,那么在Master关闭阶段,仅仅需shutdown_script之后关闭主机电源就可以。不须要做其他的事情。在新的Master启动阶段。将这个VIP分配到新的Master上。

假设採用的是文件夹数据库方式,那么在Master关闭阶段。须要删除或改动dead master这条记录;在新的Master启动阶段,须要插入或改动new master这条记录。

此外,可能还须要做一些其他的事情,比方:SET GLOBAL read_only=0。创建拥有写权限的用户等,以便应用能够在新的Master上运行写操作。

MHA Manager检查脚本返回的代码。并据此运行不同的操作,若脚本退出时返回代码0或10,MHA Manager继续操作;若脚本退出时返回0或10之外的代码,

MHA Manager将终止而不会继续故障切换。该參数默认值为空,所以MHA Manager缺省也不会调用不论什么东西。

master_ip_online_change_script (App/Global)

这个參数与master_ip_failover_script类似,但不是用于Master故障切换的,而是一个Master在线改动命令(masterha_master_switch –master_state=alive),不同阶段传递的參数也不一样。例如以下:

 Current master write freezing phase(当前Master写冻结阶段)

--command=stop or stopssh

--orig_master_host=(current master's hostname)

--orig_master_ip=(current master's ip address)

--orig_master_port=(current master's port number)

--orig_master_user=(current master's user)

--orig_master_password=(current master's password)

 New master granting write phase(新Master授权写阶段)

--command=start

--orig_master_host=(orig master's hostname)

--orig_master_ip=(orig master's ip address)

--orig_master_port=(orig master's port number)

--new_master_host=(new master's hostname)

--new_master_ip=(new master's ip address)

--new_master_port=(new master's port number)

--new_master_user=(new master's user)

--new_master_password=(new master's password)

在写操作禁用阶段后,MHA在当前的Master上运行“FLUSH TABLES WITH READ LOCK”命令,此时可通过一些逻辑操作来运行Master切换。在给新的Master赋予写操作权限阶段,能够运行一些类似master_ip_failover_script功能的操作,比方:创建一个特权用户,运行“SET GLOBAL read_only=0”命令,改动文件夹数据库等。

假设脚本返回的代码不是0或10,MHA将终止操作。不会进行Master切换。

该參数默认值为空,所以MHA Manager缺省不会调用不论什么东西。

有些情况下。为了避免脑裂问题。可能须要强制关闭Master以隔离该节点,防止其重新启动服务。

该參数就是为了实现这个目的的,它调用一个强制关闭master的脚本。比方:

shutdown_script=/usr/local/sample/bin/power_manager

(演示样例脚本位于MHA Manager源代码包中)

在调用shutdown_script之前,MHA Manager先运行一个内部检查。看Master所在的server是否还能够通过SSH方式连接,若能够连接(比方:操作正常,而mysqld故障的情况)。MHA Manager将传递例如以下參数:

--command=stopssh

--ssh_user=(ssh username so that you can connect to the master)

--host=(master's hostname)

--ip=(master's ip address)

--port=(master's port number)

--pid_file=(master's pid file)

假设Master所在的server已经故障,无法通过SSH连接。则传递例如以下參数:

--command=stop

--host=(master's hostname)

--ip=(master's ip address)

该演示样例脚本的工作原理大致例如以下:

        假设成功传递了--command=stopssh,那么说明Master所在的server系统是正常执行的,此时将通过SSH方式连接到该server,通过系统命令“kill -9”杀掉全部的mysqld和mysqld_safe进程;

        假设--pid_file也成功传递,那么脚本将试图杀掉指定的某个进程。而不是全部的mysqld进程。这适用于一台server上安装多个MySQL实例的情况。

若mysqld进程成功杀掉。则脚本返回代码10,MHA Manager据此再次连接Master。并保存必要的二进制日志。

        假设不能通过SSH方式连接到Masterserver,或者传递的命令为--command=stop,那么脚本将尝试关闭该server的电源。关闭电源命令依赖于H/W。不同server也不尽同样。对于HP(iLO)来说,使用ipmitool或SSL命令。对于Dell(DRAC)来说。使用dracadm命令。若成功关闭了server电源,则脚本返回代码0,否则返回代码1。

假设返回的代码为0,MHA Manager则開始故障切换过程,假设返回的是0或10之外的代码,MHA Manager将终止故障切换。

该參数缺省值为空,所以不会运行不论什么操作。

另外。在启动监控时,MHA Manager会调用shutdown_scrip脚本,并传递例如以下參数:

--command=status

--host=(master's hostname)

--ip=(master's ip address)

这里,我们能够检查脚本设置。电源控制依赖于H/W,因此强烈建议检查电源状态,若有某些错误。也可在启动监控之前注意到。

report_script  (App/Global)

当故障转移成功完毕,或者因错误而结束时。能够通过该參数来发送一个报告,此时会传递例如以下參数:

--orig_master_host=(dead master's hostname)

--new_master_host=(new master's hostname)

--new_slave_hosts=(new slaves' hostnames,delimited by commas:多个slave用逗号切割)

--subject=(mail subject:报告主题)

--body=(body:报告内容)

该參数缺省为空,演示样例脚本为(MHA Manager package)/samples/send_report。

init_conf_load_script App/Global 

若想在配置文件里使用纯文本(比方password和repl_password)。可使用该參数,脚本返回“name=value”对,能够覆盖全局配置文件里的參数,比方:

#! /usr/bin/perl

Print "password=$ROOT_PASS\n";

Print "repl_password=$REPL_PASS\n"

该參数默觉得空。

备注:

 Local Scope――作用于每一个服务器本地,在应用配置文件(app1.conf)中的[server_xxx]下配置;

 App Scope――作用于每一套MySQL Replication。在应用配置文件(app1.conf)中的[server_default]下配置;

 Global Scope――全局配置參数。适用于用一个Manager节点管理多套MySQL Replication的情况。在全局配置文件里(masterha_default.cnf)配置。

了解了原理,我们再来坐下下面实验,来真正试下MySQL高可用架构

二.MHA+Keepalived

在mastersql和backupsql中都安装keepalived软件(可參考http://blog.csdn.net/dbaxiaosa/article/details/22940483

(1)安装依赖包

(2)编译安装

# tar zxvf keepalived-1.1.19.tar.gz

# cd keepalived-1.1.19

# ./configure --sysconf=/etc/ --with-kernel-dir=/usr/src/kernels/2.6.18-308.el5-x86_64/

(3)配置mastermysql上的keepalived

[root@node1 ~]# more /etc/keepalived/keepalived.conf

#writed by test 20140722

#global define

global_defs {

   router_id mysqlmha

}

vrrp_script check_run {

    script "/etc/keepalived/check_mysql.sh"

    interval 1

}

############################################################

# internet  

############################################################

vrrp_instance VI_1 {

    state MASTER

    interface eth0

    virtual_router_id 51

    priority 100 #master>slave slave90

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

      

  track_script {

         check_run

     }

   virtual_ipaddress {

        192.168.3.33

         

    }

}

(4)配置backupmysql上的keepalived

[root@node2 keepalived]# more /etc/keepalived/keepalived.conf

#writed by test 20140722

#global define

global_defs {

   router_id mysqlmha

}

vrrp_script check_run {

    script "/etc/keepalived/check_mysql.sh"

    interval 1

}

############################################################

#  

############################################################

vrrp_instance VI_1 {

    state BACKUP

    interface eth0

    virtual_router_id 51

    priority 90 #master>slave slave90

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

      

  track_script {

         check_run

     }

   virtual_ipaddress {

        192.168.3.33

         

    }

}

(5)编辑脚本文件

大体意思是仅仅要检測到mysql服务停止keepalived服务也停止 。由于keepalived是通过组播方式告诉本网段自己还活着 当mysql服务停止后keepalived还依旧执行 这时就须要停止keepalived让还有一个主机获得虚拟IP。能够在后台执行这个脚本 也能够在keepalived配置文件增加这个脚本。

mastermysql上

[root@node1 ~]# more /etc/keepalived/check_mysql.sh

#20140722

#!/bin/bash

 

MYSQL=/usr/bin/mysql

MYSQL_HOST=192.168.3.27

MYSQL_USER=root

MYSQL_PASSWORD=mysql

CHECK_TIME=3

#mysql  is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0

MYSQL_OK=1

function check_mysql_helth (){

$MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "show status;" >/dev/null 2>&1

if [ $? = 0 ] ;then

     MYSQL_OK=1

else

     MYSQL_OK=0

fi

     return $MYSQL_OK

}

while [ $CHECK_TIME -ne 0 ]

do

     let "CHECK_TIME -= 1"

     check_mysql_helth

if [ $MYSQL_OK = 1 ] ; then

     CHECK_TIME=0

     exit 0

fi

if [ $MYSQL_OK -eq 0 ] &&  [ $CHECK_TIME -eq 0 ]

then

     pkill keepalived

exit 1

fi

sleep 1

done

该脚本须要有运行权限,通过下面命令加上运行权限

[root@node2 keepalived]# chmod +x check_mysql.sh

[root@node2 keepalived]# ll

total 8

-rwxr-xr-x 1 root root 654 Jul 24 17:15 check_mysql.sh

-rw-r--r-- 1 root root 634 Jul 29 16:16 keepalived.conf

backupmysql上(脚本须要运行权限)

[root@node2 keepalived]# more check_mysql.sh

#20140722

#!/bin/bash

 

MYSQL=/usr/bin/mysql

MYSQL_HOST=192.168.3.28

MYSQL_USER=root

MYSQL_PASSWORD=mysql

CHECK_TIME=3

#mysql  is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0

MYSQL_OK=1

function check_mysql_helth (){

$MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "show status;" >/dev/null 2>&1

if [ $? = 0 ] ;then

     MYSQL_OK=1

else

     MYSQL_OK=0

fi

     return $MYSQL_OK

}

while [ $CHECK_TIME -ne 0 ]

do

     let "CHECK_TIME -= 1"

     check_mysql_helth

if [ $MYSQL_OK = 1 ] ; then

     CHECK_TIME=0

     exit 0

fi

if [ $MYSQL_OK -eq 0 ] &&  [ $CHECK_TIME -eq 0 ]

then

     pkill keepalived

exit 1

fi

sleep 1

done

(6)启动keepalived。查看虚拟IP是否绑定成功

mastermysql

[root@node1 ~]# service keepalived start

查看keepalived状态

[root@node1 ~]# service keepalived status

keepalived (pid  15712) is running...

查看是否绑定虚拟IP

[root@node1 ~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000

    link/ether 00:0c:29:19:27:ad brd ff:ff:ff:ff:ff:ff

    inet 192.168.3.27/24 brd 192.168.3.255 scope global eth0

    inet 192.168.3.33/32 scope global eth0

backupMySQL

[root@node2 keepalived]# service keepalived status

keepalived (pid  13808) is running...

[root@node2 keepalived]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000

    link/ether 00:0c:29:de:b3:a1 brd ff:ff:ff:ff:ff:ff

    inet 192.168.3.28/24 brd 192.168.3.255 scope global eth0

从上能够看到masteMySQL上虚拟IP绑定成功,backupMySQL上keepalived服务正常执行,但无虚拟IP(这属于正常)

三.測试验证

通过VIP 192.168.3.33登陆MySQL,正常使用

1.停止master上MySQL服务

[root@node1 ~]# service mysql stop

Shutting down MySQL...                                     [  OK  ]

[root@node1 ~]# service mysql status

MySQL is not running                                       [FAILED]

MySQL服务停止后,查看keepalived服务是否执行

[root@node1 ~]# service keepalived status

keepalived dead but subsys locked

可见keepalived已经停止了

2.查看backupMySQL

[root@node2 keepalived]# service mysql status

MySQL running (13740)                                      [  OK  ]

[root@node2 keepalived]# service keepalived status

keepalived (pid  13808) is running...

mysql> show variables like 'read_only';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| read_only     | OFF   |

+---------------+-------+

1 row in set (0.00 sec)

可见MySQL服务及keepalived都正常执行,切该库处于可写状态

3.查看仅仅读库slave状态

mysql> show slave status \G;

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 192.168.3.28

                  Master_User: repl

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: mysql-bin.000011

          Read_Master_Log_Pos: 107

               Relay_Log_File: mysql-relay-bin.000002

                Relay_Log_Pos: 253

        Relay_Master_Log_File: mysql-bin.000011

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

              Replicate_Do_DB:

          Replicate_Ignore_DB:

           Replicate_Do_Table:

       Replicate_Ignore_Table:

      Replicate_Wild_Do_Table:

  Replicate_Wild_Ignore_Table:

                   Last_Errno: 0

                   Last_Error:

                 Skip_Counter: 0

          Exec_Master_Log_Pos: 107

              Relay_Log_Space: 409

              Until_Condition: None

               Until_Log_File:

                Until_Log_Pos: 0

           Master_SSL_Allowed: No

           Master_SSL_CA_File:

           Master_SSL_CA_Path:

              Master_SSL_Cert:

            Master_SSL_Cipher:

               Master_SSL_Key:

        Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

                Last_IO_Errno: 0

                Last_IO_Error:

               Last_SQL_Errno: 0

               Last_SQL_Error:

  Replicate_Ignore_Server_Ids:

             Master_Server_Id: 28

1 row in set (0.00 sec)

可见master已由192.168.3.27切换为192.168.3.28

4.通过VIP訪问MySQL数据库,我们继续測试

删除test库下的student表

 DROP TABLE student;

 查看从库,test库下的student表已不存在。数据同步成功。

5.管理节点查看MHA执行情况

[root@mmm appl]# /usr/bin/masterha_check_status --conf=/etc/appl.cnf

appl is stopped(2:NOT_RUNNING).

注意:

a、切换之后须要删除手工删除/masterha/app1/app1.failover.complete。才干进行第二次測试

b、一旦发生切换管理进程将会退出,无法进行再次測试,需将故障数据库增加到MHA环境中来

c、原主节点又一次增加到MHA时仅仅能设置为slave

手工删除appl.failover.complete,启动MHA

[root@mmm appl]# rm -f appl.failover.complete

又一次启动MHA

[root@mmm appl]# nohup /usr/bin/masterha_manager --conf=/etc/appl.cnf &

[1] 9659

[root@mmm appl]# nohup: appending output to `nohup.out'

查看MHA状态

[root@mmm appl]# /usr/bin/masterha_check_status --conf=/etc/appl.cnf

appl (pid:9659) is running(0:PING_OK), master:192.168.3.28

6.主节点启动mysql服务。keepalived服务,同一时候配置成新master(原backupMySQL)的从库

[root@node1 ~]# service mysql start

Starting MySQL.                                            [  OK  ]

[root@node1 ~]# service keepalived start

Starting keepalived:                                       [  OK  ]

[root@node1 ~]# mysql -uroot -p

Enter password:

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 25

Server version: 5.5.17-log MySQL Community Server (GPL)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

通过查询仅仅读库节点错误日志文件能够得到刚切换到新master的日志文件及位置

140729 17:03:29 [Note] 'CHANGE MASTER TO executed'. Previous state master_host='192.168.3.27', master_port='3306', master_log_file=''

, master_log_pos='4'. New state master_host='192.168.3.28', master_port='3306', master_log_file='mysql-bin.000011', master_log_pos='107'.

mysql> change master to

    -> master_host='192.168.3.28',

    -> master_user='repl',

    -> master_password='repl_pwd',

    -> master_log_file='mysql-bin.000011',

    -> master_log_pos=107;

Query OK, 0 rows affected (0.01 sec)

mysql> slave start;

Query OK, 0 rows affected (0.00 sec)

mysql> show slave status \G;

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 192.168.3.28

                  Master_User: repl

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: mysql-bin.000011

          Read_Master_Log_Pos: 216

               Relay_Log_File: pid-relay-bin.000002

                Relay_Log_Pos: 362

        Relay_Master_Log_File: mysql-bin.000011

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

              Replicate_Do_DB:

          Replicate_Ignore_DB:

           Replicate_Do_Table:

       Replicate_Ignore_Table:

      Replicate_Wild_Do_Table:

  Replicate_Wild_Ignore_Table:

                   Last_Errno: 0

                   Last_Error:

                 Skip_Counter: 0

          Exec_Master_Log_Pos: 216

              Relay_Log_Space: 516

              Until_Condition: None

               Until_Log_File:

                Until_Log_Pos: 0

           Master_SSL_Allowed: No

           Master_SSL_CA_File:

           Master_SSL_CA_Path:

              Master_SSL_Cert:

            Master_SSL_Cipher:

               Master_SSL_Key:

        Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

                Last_IO_Errno: 0

                Last_IO_Error:

               Last_SQL_Errno: 0

               Last_SQL_Error:

  Replicate_Ignore_Server_Ids:

             Master_Server_Id: 28

1 row in set (0.00 sec)

7.停止新mastermysql(原backupMySQL)mysql服务

[root@node2 keepalived]# service mysql stop

Shutting down MySQL...                                     [  OK  ]

[root@node2 keepalived]# service keepalived status

keepalived dead but subsys locked

可见mysql服务停止后。keepalived服务也停止了

--查询MasterMySQL

登陆mysql,test库下的student表不存在。数据同步成功。

mysql> use test;

Database changed

mysql> show tables;

+----------------+

| Tables_in_test |

+----------------+

| deadlocks      |

| test1          |

+----------------+

2 rows in set (0.00 sec)

mysql> show variables like 'read_only';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| read_only     | OFF   |

+---------------+-------+

1 row in set (0.00 sec)

8.查看仅仅读库slave状态

mysql> show slave status \G;

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 192.168.3.27

                  Master_User: repl

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: mysql-bin.000013

          Read_Master_Log_Pos: 107

               Relay_Log_File: mysql-relay-bin.000002

                Relay_Log_Pos: 253

        Relay_Master_Log_File: mysql-bin.000013

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

              Replicate_Do_DB:

          Replicate_Ignore_DB:

           Replicate_Do_Table:

       Replicate_Ignore_Table:

      Replicate_Wild_Do_Table:

  Replicate_Wild_Ignore_Table:

                   Last_Errno: 0

                   Last_Error:

                 Skip_Counter: 0

          Exec_Master_Log_Pos: 107

              Relay_Log_Space: 409

              Until_Condition: None

               Until_Log_File:

                Until_Log_Pos: 0

           Master_SSL_Allowed: No

           Master_SSL_CA_File:

           Master_SSL_CA_Path:

              Master_SSL_Cert:

            Master_SSL_Cipher:

               Master_SSL_Key:

        Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

                Last_IO_Errno: 0

                Last_IO_Error:

               Last_SQL_Errno: 0

               Last_SQL_Error:

  Replicate_Ignore_Server_Ids:

             Master_Server_Id: 27

1 row in set (0.00 sec)

可见master 已切换回MasterMySQL

9.启动backupMySQL mysql服务、keepalived服务。配置成仅仅读库

[root@node2 keepalived]# service mysql start

Starting MySQL..                                           [  OK  ]

[root@node2 keepalived]# service keepalived start

Starting keepalived:                                       [  OK  ]

[root@node2 keepalived]# mysql -uroot -p

Enter password:

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 9

Server version: 5.5.17-log MySQL Community Server (GPL)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> change master to

    -> master_host='192.168.3.27',

    -> master_user='repl',

    -> master_password='repl_pwd',

    -> master_log_file='mysql-bin.000013',

    -> master_log_pos=107;

Query OK, 0 rows affected (0.02 sec)

mysql> slave start;

Query OK, 0 rows affected (0.00 sec)

mysql> show slave status \G;

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 192.168.3.27

                  Master_User: repl

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: mysql-bin.000013

          Read_Master_Log_Pos: 107

               Relay_Log_File: mysql-relay-bin.000002

                Relay_Log_Pos: 253

        Relay_Master_Log_File: mysql-bin.000013

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

              Replicate_Do_DB:

          Replicate_Ignore_DB:

           Replicate_Do_Table:

       Replicate_Ignore_Table:

      Replicate_Wild_Do_Table:

  Replicate_Wild_Ignore_Table:

                   Last_Errno: 0

                   Last_Error:

                 Skip_Counter: 0

          Exec_Master_Log_Pos: 107

              Relay_Log_Space: 409

              Until_Condition: None

               Until_Log_File:

                Until_Log_Pos: 0

           Master_SSL_Allowed: No

           Master_SSL_CA_File:

           Master_SSL_CA_Path:

              Master_SSL_Cert:

            Master_SSL_Cipher:

               Master_SSL_Key:

        Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

                Last_IO_Errno: 0

                Last_IO_Error:

               Last_SQL_Errno: 0

               Last_SQL_Error:

  Replicate_Ignore_Server_Ids:

             Master_Server_Id: 27

1 row in set (0.00 sec)

10.管理节点又一次启动MHA

[root@mmm appl]# rm appl.failover.complete

rm: remove regular empty file `appl.failover.complete'? yes

[root@mmm appl]# nohup /usr/bin/masterha_manager --conf=/etc/appl.cnf &

[1] 9890

[root@mmm appl]# nohup: appending output to `nohup.out'

[root@mmm appl]# /usr/bin/masterha_check_status --conf=/etc/appl.cnf

appl (pid:9890) is running(0:PING_OK), master:192.168.3.27

至此測试完成。成功实现了MySQL高可用架构

MySQL高可用系列之MHA(二)的更多相关文章

  1. mysql高可用架构之MHA,haproxy实现读写分离详解

    MySQL高可用架构之MHA 一.运维人员需要掌握的MySQL技术: 1.基本SQL语句 2.基本的管理[库表数据的管理    权限的管理] 3.容灾       保证数据不丢失. 二.工作中MySQ ...

  2. (转)MySQL高可用架构之MHA

    MySQL高可用架构之MHA  原文:http://www.cnblogs.com/gomysql/p/3675429.html 简介: MHA(Master High Availability)目前 ...

  3. (5.8)mysql高可用系列——MySQL中的GTID复制(实践篇)

    一.基于GTID的异步复制(一主一从)无数据/少数据搭建 二.基于GTID的无损半同步复制(一主一从)(mysql5.7)基于大数据量的初始化 正文: [0]概念 [0.5]GTID 复制(mysql ...

  4. MySQL高可用集群MHA方案

    MySQL高可用集群MHA方案 爱奇艺在用的数据库高可用方案 MHA 是目前比较成熟及流行的 MySQL 高可用解决方案,很多互联网公司正是直接使用或者基于 MHA 的架构进行改造实现 MySQL 的 ...

  5. (5.15)mysql高可用系列——MHA实践

    关键词:MHA,mysql mha [1]需求 采用mysql技术,实现MHA高可用主从环境,预计未来数据量几百G MHA概念参考:MYSQL高可用技术概述 [2]环境技术架构 [2.1]MHA简介 ...

  6. MySQL高可用架构之MHA

    简介: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是 ...

  7. 转一下大师兄的"MySQL高可用架构之MHA"

    简介: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是 ...

  8. MySQL高可用架构之MHA(转)

    简介: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是 ...

  9. mysql高可用架构之-MHA学习

    此博文参考  博主:mysql高级DBA yayun  完成 简介: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司 ...

随机推荐

  1. pthread_cond 唤醒特定线程的方法

  2. 【Java基础】--再谈面向对象

    面向对象总结 V1.0     2014.9.14 面向对象总结V2.0   2015.8.14 对照之前的J2SE总结,发现现在的似乎更加的注重联系,開始能把细节的东西都编制到知识网络里面,导图的图 ...

  3. Codeforces Round #260 (Div. 1) 455 A. Boredom (DP)

    题目链接:http://codeforces.com/problemset/problem/455/A A. Boredom time limit per test 1 second memory l ...

  4. 2015.04.20,外语,读书笔记-《Word Power Made Easy》 11 “如何辱骂敌人” SESSION 30

    1.brothers and sisters, wives and husbands Frater: brothers; soror: sister; uxor: wife; maritus: hus ...

  5. 用select拼接insert into,单引号转义

    SELECT 'INSERT INTO dbo.CMS_Transformation ( TransformationName , TransformationCode , Transformatio ...

  6. nyoj--16--矩形嵌套(动态规划)

    矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a< ...

  7. 学习 shell —— 条件判断 if 的参数

    1. 文件判断表达式 -e filename:如果 filename 存在(exist),则为真: -d filename:如果 filename 为目录(directory),则为真: -f fil ...

  8. 使用Chrome插件Postman进行简单的Get/Post测试

    转自:https://blog.csdn.net/dearmorning/article/details/56854236 Postman插件: 一种网页调试与发送网页http请求的chrome插件, ...

  9. Redis学习笔记(八) 基本命令:SortedSet操作

    原文链接:http://doc.redisfans.com/sorted_set/index.html SortedSet的数据结构类似于Set,不同的是Sorted中的每个成员都分配了一个值(Sco ...

  10. POJ 3252 组合数学?

    大神们的题解我一个都没看懂........... 十分的尴尬 题意:算出闭区间内二进制中0的个数大于等于1的个数的数字有多少个 思路: 组合数学(n小于500的时候都可以出解,只不过高精比较麻烦). ...