并正常运行;
/usr/bin/masterha_master_monitor ??手动开启监控,启动MHA时会自动启动监控
/usr/bin/masterha_stop ??关闭MHA
? Node工具
/usr/bin/save_binary_logs ??保存和复制master的二进制日志;
/usr/bin/apply_diff_relay_logs ??识别差异的中继日志事件并应用于其它Slave;
/usr/bin/filter_mysqlbinlog ??去除不必要的Rollback事件(MHA已不再使用该工具);
/usr/bin/purge_relay_logs ??清除中继日志(不会阻塞SQL线程);
备注:Node端工具通常由MHA Manager的脚本触发调用,无需DBA操作。
2.开启MHA
在开启MHA之前,可以先通过masterha_check_repl检查一下MySQL Replication是否正常,通过masterha_check_ssh检查一下各个node之间SSH登录是否正常,这在前面均已试用该命令。
开启MHA的命令为masterha_manager,其用法如下:
[root@mmm scripts]# /usr/bin/masterha_manager --help
Usage:
masterha_manager --global_conf=/etc/masterha_default.cnf
--conf=/usr/local/masterha/conf/app1.cnf
See online reference
(http://code.google.com/p/mysql-master-ha/wiki/masterha_manager) for
details.
可见其只有两个参数,--global_conf缺省为/etc/masterha_default.cnf,本例中符合缺省要求,所以可以不指定,为了方便,通过如下命令使其后台运行。如下:
[root@mmm appl]# /usr/bin/masterha_manager --conf=/etc/appl.cnf &
[1] 5674
[root@mmm appl]# Mon Jul 21 10:56:32 2014 - [info] Reading default configuratoins from /etc/masterha_default.cnf..
Mon Jul 21 10:56:32 2014 - [info] Reading application default configurations from /etc/appl.cnf..
Mon Jul 21 10:56:32 2014 - [info] Reading server configurations from /etc/appl.cnf..
为了使MHA持续运行在服务器端,可通过如下命令使其不挂起运行在后台:
[root@mmm appl]# nohup /usr/bin/masterha_manager --conf=/etc/appl.cnf &
[1] 5905
[root@mmm appl]# nohup: appending output to `nohup.out'
MHA开启之后,会在其工作目录下生成如下两个文件:
[root@mmm appl]# ls
appl.master_status.health manager.log
其中appl.master_status.health为Master实例的健康监控文件,MHA开启时生成,关闭后消失,里面内容如下:
[root@mmm appl]# more appl.master_status.health
5674 0:PING_OK master:192.168.3.27
而manager.log为MHA的日志文件,其内容较多,执行masterha_check_repl命令时的输入内容类似。
可通过masterha_check_status命令检查MHA是否在运行,比如:
[root@mmm appl]# /usr/bin/masterha_check_status --conf=/etc/appl.cnf
appl (pid:5905) is running(0:PING_OK), master:192.168.3.27
若MHA正常运行,则提示如上,否则提示:appl is stopped(2:NOT_RUNNING).
对于一个正在运行的MHA,可通过masterha_stop命令关闭,如下:
[root@mmm appl]# /usr/bin/masterha_check_status --conf=/etc/appl.cnf
appl is stopped(2:NOT_RUNNING).
3.Master自动故障转移及差异日志恢复
》模拟复制不同步,造成数据差异
??关闭node3的复制线程,然后在Master主库(node1)上创建一张表,以此造成node3数据不同步
mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)
mysql> use test;
Database changed
mysql> CREATE TABLE student(s_id INT,s_name VARCHAR(10),PRIMARY KEY(s_id));
Query OK, 0 rows affected (0.01 sec)
??关闭node2的复制进线程,
mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)
mysql> insert into student(s_id,s_name) values(1,'aaa');
Query OK, 1 row affected (0.01 sec)
通过这个模拟,现在node1(Master)上有一张student表,并有一条数据;node2(slave1)上有student这张表,但里面没有数据;node3(slave2)上还没有student这张表,所以这套复制环境的3个节点目前是不同步的。
》关闭node1(Master)的mysqld进程,模拟MySQL实例故障
[root@node1 data]# service mysql stop;
Shutting down MySQL... [ OK ]
此时检查node2,发现已恢复了差异数据(一条记录),停掉了原来的复制线程,被选择为新的Master,并赋予写操作权限。
mysql> select * from student;
+------+--------+
| s_id | s_name |
+------+--------+
| 1 | aaa |
+------+--------+
1 row in set (0.00 sec)
mysql> show slave status \G;
Empty set (0.00 sec)
mysql> show variables like 'read_only%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| read_only | OFF |
+---------------+-------+
1 row in set (0.00 sec)
检查node3,发现差异数据也被恢复(student表和一条记录),并将master_