Linux下的MySQL主主复制和Mysql-MMM实现(Mysql双主多从高可用)

时间:2022-09-15 08:44:41

mysql主从架构中其实就一个主在工作,而从就相当于一个备份机器,从通过日志监测的方式来备份主库上的数据而保证主库的数据安全。在这种架构中如果从上的数据做了改变,主数据是不会用任何变化的。因为mysql主从架构主要是mysql从监控mysql主的日志变化来实现同步,相反的在这个架构中主并没有监控从的日志变化。所以,mysql从数据反生变化,主也就没有什么变化了。
通过上述描述,可以看到如果想实现主主复制,无非就是在mysql主从架构上让mysql主实现监测从的日志变化,从而实现两台机器相互同步。(主从的架构前面有博文 http://www.linuxidc.com/Linux/2013-10/91682.htm )
实验环境:两台服务器:
主机名:HA1,HA2(呵呵,这个主机名是英文缩写High availability,高可用的意思)
ip:

192.168.1.231


192.168.1.232


主机系统:CentOS6.4
mysql版本5.5.22
首先,看下HA1(192.168.1.231)的mysql配置文件
vim /etc/my.cnf 
# Example MySQL config file for very large systems. 

# This is for a large system with memory of 1G-2G where the system runs mainly 
# MySQL. 

# MySQL programs look for option files in a set of 
# locations which depend on the deployment platform. 
# You can copy this option file to one of those 
# locations. For information about these locations, see: 
# http://dev.mysql.com/doc/mysql/en/option-files.html 

# In this file, you can use all long options that a program supports. 
# If you want to know which options a program supports, run the program 
# with the "--help" option. 
# The following options will be passed to all MySQL clients 
[client] 
#password      = your_password 
port            = 3306
socket          = /usr/local/mysql/tmp/mysql.sock 

# Here follows entries for some specific programs 
# The MySQL server 
[mysqld] 
port            = 3306
socket          = /usr/local/mysql/tmp/mysql.sock 
skip-external-locking 

key_buffer_size = 384M
max_allowed_packet = 1M
table_open_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 32M
# Try number of CPU's*2 for thread_concurrency 
thread_concurrency = 8
# Don't listen on a TCP/IP port at all. This can be a security enhancement, 
# if all processes that need to connect to mysqld run on the same host. 
# All interaction with mysqld must be made via Unix sockets or named pipes. 
# Note that using this option without enabling named pipes on Windows 
# (via the "enable-named-pipe" option) will render mysqld useless! 

#skip-networking 
# Replication Master Server (default) 
# binary logging is required for replication 
log-bin=mysql-bin
log-slave-updates 

# required unique id between 1 and 2^32 - 1 
# defaults to 1 if master-host is not set 
# but will not function as a master if omitted 
server-id      = 1

在这个配置文件中,需要特别注意的三处地方:
log-bin=mysql-bin:这个选项基本默认都是开着的,如果没有打开,可以手动打开。
log-slave-updates:这个选项特别的重要它是为了让slave也能充当master,同时也为了更好的服务于 m-m + s 的环境,保证slave挂在任何一台master上都会接收到另一个master的写入信息。当然不局限于这个架构,级联复制的架构同样也需要log-slave-updates的支持。
server-id = 1:这个ID为服务器ID如果配置一样会出现冲突,而不能复制
接着再看下HA2(192.168.1.232)的mysql配置文件
vim /etc/my.cnf 
# Example MySQL config file for very large systems. 

# This is for a large system with memory of 1G-2G where the system runs mainly 
# MySQL. 

# MySQL programs look for option files in a set of 
# locations which depend on the deployment platform. 
# You can copy this option file to one of those 
# locations. For information about these locations, see: 
# http://dev.mysql.com/doc/mysql/en/option-files.html 

# In this file, you can use all long options that a program supports. 
# If you want to know which options a program supports, run the program 
# with the "--help" option. 
# The following options will be passed to all MySQL clients 
[client] 
#password      = your_password 
port            = 3306
socket          = /usr/local/mysql/tmp/mysql.sock 
# Here follows entries for some specific programs 
# The MySQL server 
[mysqld] 
port            = 3306
socket          = /usr/local/mysql/tmp/mysql.sock 
skip-external-locking 

key_buffer_size = 384M
max_allowed_packet = 1M
table_open_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 32M
# Try number of CPU's*2 for thread_concurrency 
thread_concurrency = 8
# Don't listen on a TCP/IP port at all. This can be a security enhancement, 
# if all processes that need to connect to mysqld run on the same host. 
# All interaction with mysqld must be made via Unix sockets or named pipes. 
# Note that using this option without enabling named pipes on Windows 
# (via the "enable-named-pipe" option) will render mysqld useless! 

#skip-networking 
# Replication Master Server (default) 
# binary logging is required for replication 
log-bin=mysql-bin
log-slave-updates 

# required unique id between 1 and 2^32 - 1 
# defaults to 1 if master-host is not set 
# but will not function as a master if omitted 
server-id      = 10
# Replication Slave (comment out master section to use this)

在HA2的mysql配置文件中,除了server-id不一样,其他几乎一模一样。配置文件写好后,我们把两台服务器上的mysql服务器启动起来。




首先,登录HA2(192.168.1.232)的mysql中,查看master状态
mysql> show master status; 
+------------------+----------+--------------+------------------+
| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB | 
+------------------+----------+--------------+------------------+
| mysql-bin.000016 |      615 |              |                  | 
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec) 
mysql>

然后,登录HA1(192.168.1.231)的msyql中,把HA2配置成自己的主


在做这个之前先在两台机器的mysql中建立一个可以复制用的帐号:
mysql>grant all on *.* to duyunlong@'192.168.1.%' identified by '123456'; 
Query OK, 0 rows affected (0.01 sec) 
mysql>change master to master_host='192.168.1.232',master_user='duyunlong',master_password='123456',master_log_file='mysql-bin.000016',master_log_pos=615;

同上,查看HA1(192.168.1.231)master,然后登录HA2(192.168.1.232),把HA1(192.168.1.231),配置成自己的主,然后分别在两台机器的mysql中,启动slave
启动后HA1状态
mysql> show slave status \G; 
*************************** 1. row ***************************
              Slave_IO_State: Waiting for master to send event 
                  Master_Host: 192.168.1.232
                  Master_User: duyunlong 
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000016
          Read_Master_Log_Pos: 615
              Relay_Log_File: HA1-relay-bin.000002
                Relay_Log_Pos: 346
        Relay_Master_Log_File: mysql-bin.000016
            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: 615
              Relay_Log_Space: 500
              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: 10
1 row in set (0.00 sec) 
ERROR: 
No query specified

可以看到 Slave_IO_Running: Yes
Slave_SQL_Running: Yes
然后在看HA2的状态:
mysql> show slave status \G; 
*************************** 1. row ***************************
              Slave_IO_State: Waiting for master to send event 
                  Master_Host: 192.168.1.231
                  Master_User: duyunlong 
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000018
          Read_Master_Log_Pos: 552
              Relay_Log_File: HA2-relay-bin.000002
                Relay_Log_Pos: 441
        Relay_Master_Log_File: mysql-bin.000018
            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: 552
              Relay_Log_Space: 595
              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: 1
1 row in set (0.00 sec) 
ERROR: 
No query specified

可以看到Slave_IO_Running: Yes
Slave_SQL_Running: Yes
接下来,我们要测试,是不是已经可以主主复制了呢,首先登录HA1(192.168.1.231)的mysql中,建立一数据库,当然在测试前我们先看下,两台服务器中的mysql中有哪些数据
首先看下HA1(192.168.1.231)
[root@HA1 ~]# mysql mysql -uduyunlong -p123456 -h192.168.1.231 -e 'show databases;' 
+--------------------+
| Database          | 
+--------------------+
| information_schema | 
| mysql              | 
| performance_schema | 
| test              | 
| wanghaipeng        | 
+--------------------+
[root@HA1 ~]#

再看下HA2(192.168.1.232)
[root@HA2 ~]# mysql mysql -uduyunlong -p123456 -h192.168.1.232 -e 'show databases;' 
+--------------------+
| Database          | 
+--------------------+
| information_schema | 
| mysql              | 
| performance_schema | 
| test              | 
| wanghaipeng        | 
+--------------------+
[root@HA2 ~]#

可以看到,现在两台服务器上的mysql中数据是一样的,接下来在HA中建立一数据库“a”,再看结果
[root@HA1 ~]# mysql mysql -uduyunlong -p123456 -h192.168.1.231 -e 'create database a;' 
[root@HA1 ~]# mysql mysql -uduyunlong -p123456 -h192.168.1.231 -e 'show databases;' 
+--------------------+
| Database          | 
+--------------------+
| information_schema | 
| a                  | 
| mysql              | 
| performance_schema | 
| test              | 
| wanghaipeng        | 
+--------------------+
[root@HA1 ~]#

然后看下HA2(192.168.1.232)是不是会把刚建立的数据库“a”复制过来
[root@HA2 ~]# mysql mysql -uduyunlong -p123456 -h192.168.1.232 -e 'show databases;' 
+--------------------+
| Database          | 
+--------------------+
| information_schema | 
| a                  | 
| mysql              | 
| performance_schema | 
| test              | 
| wanghaipeng        | 
+--------------------+

可以看到,数据库“a”已经成功复制过来了,反过来我们在HA2(192.168.1.232)上建立一数据库“b”看是否HA1也可以复制过去
[root@HA2 ~]# mysql mysql -uduyunlong -p123456 -h192.168.1.232 -e 'create database b;' 
[root@HA2 ~]# mysql mysql -uduyunlong -p123456 -h192.168.1.232 -e 'show databases;' 
+--------------------+
| Database          | 
+--------------------+
| information_schema | 
| a                  | 
| b                  | 
| mysql              | 
| performance_schema | 
| test              | 
| wanghaipeng        | 
+--------------------+
[root@HA2 ~]#

然后登录HA1(192.168.1.231),查看是否复制成功
[root@HA1 ~]# mysql mysql -uduyunlong -p123456 -h192.168.1.231 -e 'show databases;' 
+--------------------+
| Database          | 
+--------------------+
| information_schema | 
| a                  | 
| b                  | 
| mysql              | 
| performance_schema | 
| test              | 
| wanghaipeng        | 
+--------------------+
[root@HA1 ~]#

在HA1(192.168.1.231)可以看到数据库“b”已经复制过来了。
那么到此,主主复制架构已经陈功!



                                       Mysql-MMM实现(Mysql双主多从高可用)


一.mysql-mmm实现mysql 高可用架构 

     MMM 即Master-Master Replication Manager for MySQL(mysql 主主复制管理器)关于 mysql主主复制配置的监控、故障转移和管理的一套可伸缩的脚本套件(在任何时候只有一个节点可以被写入),这个套件也能对居于标准的主从配置的任意数量的从服务器进行读负载均衡,所以你可以用它来在一组居于复制的服务器启动虚拟 ip,除此之外,它还有实现数据备份、节点之间重新同步功能的脚本。
 
     MySQL 本身没有提供 replication failover 的解决方案,通过 MMM 方案能实现服务器的故障转移,从而实现 mysql 的高可用。MMM 项目来自 Google:http://code.google.com/p/mysql-master-master官方网站为:http://mysql-mmm.org 


mysql-mmm     主要功能由下面三个脚本提供
 
mmm_mond     负责所有的监控工作的监控守护进程,决定节点的移除等等 

mmm_agentd   运行在 mysql 服务器上的代理守护进程,通过简单远程服务集提供给监控节点
 
mmm_control   通过命令行管理 mmm_mond 进程 

mysql-mmm 的监管端会提供多个虚拟 IP(VIP),包括一个可写 VIP,多个可读 VIP通过监管的管理,这些 IP 会绑定在可用 mysql 之上,当某一台 mysql 宕机时,监管会将 VIP迁移至其他 mysql。 


在整个监管过程中,需要在 mysql 中添加相关授权用户,以便让 mysql 可以支持监理机的维护。授权的用户包括一个 mmm_monitor 用户和一个 mmm_agent 用户,如果想使用 mmm的备份工具则还要添加一个 mmm_tools 用户。

部署开始,由于机器资源有限,这里的实验,slave 就用一台了。 

二.部署的前期工作 
1.环境描述 
vmvare 虚拟机:4 台 

系统版本:CentOS release 6.6 (Final)  2.6.32-504.el6.x86_64 

mysql版本:5.5.32 

mysql-mmm版本: 

4台虚拟机信息:

MMM管理机:192.168.0.149  Monitor      test-A

master1:192.168.0.150    server-id=1  test-B

master2:192.168.0.160    server-id=3  test-D

slave:192.168.0.151      server-id=2  test-C


虚拟IP:
10.0.0.13   write
10.0.0.14   read
10.0.0.15   read
10.0.0.16   read


Mysql-MMM 架构配置简介: 

1.master1, master2 两台安装 mysql,并做主主的配置 

2.slave1 上安装 mysql,并配置作为 master1 的从服务器。
 
3.master1/2, slave1,Monitor 这四台都要安装 mysql-mmm,并配置:mmm_common.conf、mmm_agent.conf 以及 mmm_mon.conf 文件 


三、配置 mysql-master-1/2(主主同步),mysql-master-1 与 mysql-slave(主从同步) 

注:所有的mysql都是新安装的,所以没有任何数据,环境相同。 

1.1、 改my.cnf然后重启服务 
mysql-master-1: 

[mysqld]
server-id       = 1
log-bin=mysql-bin
log-slave-updates  
auto_increment_offset=1  
auto_increment_increment=2


mysql-master-2: 

[mysqld]
server-id       = 3
log-bin=mysql-bin
log-slave-updates  
auto_increment_offset=2  
auto_increment_increment=2


1.2、 配置master1和master2 做主主同步 

master1 和 master2 都需要创建链接用户 
mysql> grant replication slave on *.* to 'rep'@'192.168.0.%' identified by 
'test123'; 
Query OK, 0 rows affected (0.02 sec) 


master1操作:
mysql> show master status;
+------------------+----------+--------------+---------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB                            |
+------------------+----------+--------------+---------------------------------------------+
| mysql-bin.000006 |      107 |              | mysql,performance_schema,information_schema |
+------------------+----------+--------------+---------------------------------------------+
1 row in set (0.00 sec)
 
master2操作:
mysql>  change master to master_host='192.168.0.150', master_port=3306, master_user='rep', master_password='test123', master_log_file='mysql-bin.000006',master_log_pos=107;
mysql> start slave;
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.0.150
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000006
          Read_Master_Log_Pos: 107
               Relay_Log_File: test-D-relay-bin.000006
                Relay_Log_Pos: 253
        Relay_Master_Log_File: mysql-bin.000006
             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: 410
              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: 1
1 row in set (0.00 sec)


ERROR: 
No query specified

mysql> grant replication slave on *.* to 'rep'@'192.168.0.%' identified by 'test123';
mysql> show master status;                                  +------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |      107 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)


master1操作:
mysql>  change master to master_host='192.168.0.160', master_port=3306,  master_user='rep', master_password='test123',  master_log_file='mysql-bin.000003', master_log_pos=107;
mysql> start slave;
mysql> show slave status\G;

2.1、 slave修改my.cnf并重启服务 

vi /data/3307/my.cnf 

[mysqld] 
server-id = 2 
[root@test-C ~]# mysqladmin -uroot -p456 shutdown -S /data/3307/mysql.sock

[root@test-C ~]# /application/mysql/bin/mysqld_safe --defaults-file=/data/3307/my.cnf &

注:从上我用的是多实例


2.2、  配置同步参数 

查看 master1 主库的记录点信息 

flush tables with read lock;     #锁表 

mysql> show master status; 

+------------------+----------+--------------+---------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB                            |
+------------------+----------+--------------+---------------------------------------------+
| mysql-bin.000006 |      107 |              | mysql,performance_schema,information_schema |
+------------------+----------+--------------+---------------------------------------------+
1 row in set (0.00 sec)

mysqldump -uroot --event -A -B >/tmp/master1.sql   # 备份主库 

unlock tables;   #解锁 


slave 从库进行操作:

mysql -uroot <master1.sql -s="" data="" 3307="" mysql.sock<="" strong="" style="word-wrap: break-word;">

mysql> CHANGE MASTER TO MASTER_HOST='192.168.0.150',  MASTER_PORT=3306, MASTER_USER='rep', MASTER_PASSWORD='test123', MASTER_LOG_FILE='mysql-bin.000006',  MASTER_LOG_POS=107; 

Query OK, 0 rows affected (0.04 sec) 
 
mysql> start slave; 
Query OK, 0 rows affected (0.02 sec) 
 
mysql> show slave status\G; 
 
四、配置mysql-mmm 

4.1、 安装mysql-mmm 

注:需要在这四台 server 上都安装 mysql-mmm 

CentOS 软件仓库默认是不含这些软件的,必须要有epel这个包的支持。所以我们必须先安装epel。 

四台同时操作:
cd tools 
wget http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm 

rpm -Uvh epel-release-6-8.noarch.rpm  

yum install -y mysql-mmm* 


 
4.2、 配置mmm代理和监控账号的权限 

现在环境已经配置好,我没有配置忽略 mysql库和 user表,所以只要在任意一台主库上执行下面的操作,其他的库就都有这俩账号了。 

mysql> GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'192.168.0.%' IDENTIFIED  BY 'test123';

mysql> GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'192.168.0.%' IDENTIFIED BY 'test123';  
    
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges; 

Query OK, 0 rows affected (0.06 sec)

注:master1、master2、slave 是一样的 

mysql> select user,host from mysql.user; 
+-------------+-------------+
| user        | host        |
+-------------+-------------+
| root        | 127.0.0.1   |
| mmm_agent   | 192.168.0.% |
| mmm_monitor | 192.168.0.% |
| rep         | 192.168.0.% |
| root        | ::1         |
|             | localhost   |
| root        | localhost   |
|             | test-B      |
| root        | test-B      |
+-------------+-------------+
8 rows in set (0.00 sec)
      
 
4.3、 所有服务器均需配置/etc/mysql-mmm/mmm_common.conf 

vi /etc/mysql-mmm/mmm_common.conf     

active_master_role      writer


    cluster_interface            eth0
    pid_path                      /var/run/mysql-mmm/mmm_agentd.pid
    bin_path                      /usr/libexec/mysql-mmm/
    replication_user            rep
    replication_password     test123
    agent_user                   mmm_agent
    agent_password            test123



    ip      192.168.0.150
    mode    master
    peer    db2



    ip      192.168.0.160
    mode    master
    peer    db1




    ip      192.168.0.151
    mode    slave



    hosts   db1, db2
    ips     10.0.0.13
    mode    exclusive




    hosts   db1, db2, db3
    ips     10.0.0.14, 10.0.0.15, 10.0.0.16
    mode    balanced



 
4.4、数据库主机配置

vim /etc/mysql-mmm/mmm_agent.conf 


hostname      ip  my.cnf -serverid  dbname 
master1  192.168.0.150      1         db1 
master2  192.168.0.160      3         db2 
slave1   192.168.0.151      2         db3 

根据上表对三台 mysql服务器的/etc/mysql-mmm/mmm_agent.conf 配置文件进行修改 
例: 
[root@mysql-mmm-master1 tools]#

vi /etc/mysql-mmm/mmm_agent.conf 

include mmm_common.conf 

# The 'this' variable refers to this server.  Proper operation requires 
# that 'this' server (db1 by default), as well as all other servers, have the 
# proper IP addresses set in mmm_common.conf. 
this db1 
 
4.5、 monitor主机配置

vim /etc/mysql-mmm/mmm_mon.conf 

include mmm_common.conf


    ip                  127.0.0.1
    pid_path            /var/run/mysql-mmm/mmm_mond.pid
    bin_path            /usr/libexec/mysql-mmm
    status_path         /var/lib/mysql-mmm/mmm_mond.status
    ping_ips            192.168.0.150, 192.168.0.151, 192.16
8.0.160
    auto_set_online     30


    # The kill_host_bin does not exist by default, though th
e monitor will
    # throw a warning about it missing.  See the section 5.1
0 "Kill Host 
    # Functionality" in the PDF documentation.
    #
    # kill_host_bin     /usr/libexec/mysql-mmm/monitor/kill_
host
    #



    monitor_user        mmm_monitor
    monitor_password    test123


debug 0


4.6、 启动mysql-mmm 
master-1,master-2,slave 启动代理: 

编辑/etc/default/mysql-mmm-agent 来开启 

[root@mysql-mmm-master2 tools]# vi /etc/default/mysql-mmm-agent 

# mysql-mmm-agent defaults 
ENABLED=1 

所有数据库主机启动 mmm-agent: 

/etc/init.d/mysql-mmm-agent start 

monitor 主机启动 mmm-monitor 

/etc/init.d/mysql-mmm-monitor start 
 
4.7、 mmm_control命令监控mysql 服务器状态 

[root@mysql-mmm-monitor ~]# mmm_control show 
  db1(192.168.0.150) master/ONLINE. Roles: reader(10.0.0.15), writer(10.0.0.13)
  db2(192.168.0.160) master/ONLINE. Roles: reader(10.0.0.14)
  db3(192.168.0.151) slave/ONLINE. Roles: reader(10.0.0.16)
 
4.8、 测试两个mysql服务器能否实现故障自动切换 
将db1的mysql服务停止 

[root@test-B ~]# /etc/init.d/mysqld stop
Shutting down MySQL. SUCCESS! 
等待30秒在 mysql-mmm-monitor 服务器上进行监控查看 

[root@test-A ~]# mmm_control show
  db1(192.168.0.150) master/HARD_OFFLINE. Roles: 
  db2(192.168.0.160) master/ONLINE. Roles: reader(10.0.0.14), writer(10.0.0.13)
  db3(192.168.0.151) slave/ONLINE. Roles: reader(10.0.0.15), reader(10.0.0.16)

slave检查master_host 是否切换到了另一个主库地址:
[root@test-C ~]# mysql -uroot -p -e "show slave status\G" -S /data/3307/mysql.sock                    
Enter password: 
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.0.160
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 537
               Relay_Log_File: relay-bin.000002
                Relay_Log_Pos: 253
        Relay_Master_Log_File: mysql-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: mysql
           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: 537
              Relay_Log_Space: 403
              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: 3


恢复master-1(db1) 
[root@test-B ~]# /etc/init.d/mysqld start
Starting MySQL.. SUCCESS! 
monitor端检查恢复情况 
[root@test-A ~]# mmm_control show
  db1(192.168.0.150) master/ONLINE. Roles: reader(10.0.0.16)
  db2(192.168.0.160) master/ONLINE. Roles: reader(10.0.0.14), writer(10.0.0.13)
  db3(192.168.0.151) slave/ONLINE. Roles: reader(10.0.0.15)

可以看到当 db1 恢复后就充当 slave 的角色了!只有当 db2 挂了以后db1 又会担当起主服务器的写入功能。

4.9、 mmm_control命令介绍
Valid commands are:
    help                              - show this message
    ping                              - ping monitor
    show                              - show status
    checks [|all [|all]] - show checks status
    set_online                 - set host online
    set_offline                - set host offline
    mode                              - print current mode.
    set_active                        - switch into active mode.
    set_manual                        - switch into manual mode.
    set_passive                       - switch into passive mode.
    move_role [--force] - move exclusive role to host 
                                        (Only use --force if you know what you are doing!)
    set_ip                - set role with ip to host 


五、配置过程中我遇到的一些问题和解决方法
问题:
配置过程中,到最后查看所有服务器状态,从服务器不在状态:
[root@test-A ~]# mmm_control show
[root@test-A ~]# mmm_control show
  db1(192.168.0.150) master/ONLINE. Roles: reader(10.0.0.15), writer(10.0.0.13)
  db2(192.168.0.160) master/ONLINE. Roles: reader(10.0.0.14), reader(10.0.0.16)
  db3(192.168.0.151) slave/HARD_OFFLINE. Roles: 
如上,解决方法:
    从服务器上的mysql,原来做测试时,用的多实例,mysql服务端口为3307。停掉从服务器上的主从,然后在配置文件中把端口改为3306,重启服务。重新做一下主从同步后,重新启动MMM的代理服务后,再次在MMM管理端查看所有服务器状态,已全部正常,如下:
[root@test-A ~]# mmm_control show                    
  db1(192.168.0.150) master/ONLINE. Roles: reader(10.0.0.15), writer(10.0.0.13)
  db2(192.168.0.160) master/ONLINE. Roles: reader(10.0.0.14)
  db3(192.168.0.151) slave/ONLINE. Roles: reader(10.0.0.16)