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数据库管理账户及密码,因为要执行一些必要的管理命令,比如: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文件,该参数适用于一台服务器安装多个mysql实例的情况。
ssh_user (local/app/global)
mha manager和node访问mysql server所使用的os用户,在多种情况下,都会用到该账户,比如:远程执行命令、在slave间拷贝差异的relay logs等。
该用户至少要拥有读取mysql binary/relay log文件和relay_log.info文件的权限,以及日志目录的写权限(remote_workdir参数指定的路径)。
该用户不需要交互即可连接到其它服务器上,所以建议使用ssh公共密钥认证,即配置ssh等效性;缺省情况下,ssh_user为系统管理账户,即root账户。
remote_workdir (local/app/global)
每个mha node节点(运行mysql实例的服务器)的工作目录全路径,其中会生成日志文件,缺省为/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连接到其它远程服务器,所以需要设置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所在的服务器是否还可以通过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所在的服务器已经故障,无法通过ssh连接,则传递如下参数:
--command=stop
--host=(master's hostname)
--ip=(master's ip address)
该示例脚本的工作原理大致如下:
如果成功传递了--command=stopssh,那么说明master所在的服务器系统是正常运行的,此时将通过ssh方式连接到该服务器,通过系统命令“kill -9”杀掉所有的mysqld和mysqld_safe进程;
如果--pid_file也成功传递,那么脚本将试图杀掉指定的某个进程,而不是所有的mysqld进程,这适用于一台服务器上安装多个mysql实例的情况。若mysqld进程成功杀掉,则脚本返回代码10,mha manager据此再次连接master,并保存必要的二进制日志。
如果不能通过ssh方式连接到master服务器,或者传递的命令为--command=stop,那么脚本将尝试关闭该服务器的电源。关闭电源命令依赖于h/w,不同服务器也不尽相同,对于hp(ilo)来说,使用ipmitool或ssl命令;对于dell(drac)来说,使用dracadm命令。若成功关闭了服务器电源,则脚本返回代码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: 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: 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: 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: 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高可用架构