MySQL-MMM高可用配置過程

MMM配置官方文檔: http://mysql-mmm.org/mmm2:guide

本文環境:    
主庫:CentOS6.7 x64 192.168.0.201 mysql-5.6.29    
主庫:CentOS6.7 x64 192.168.0.202 mysql-5.6.29    
備庫:CentOS6.7 x64 192.168.0.203 mysql-5.6.29    
備庫:CentOS6.7 x64 192.168.0.204 mysql-5.6.29    
管理:CentOS6.7 x64 192.168.0.205

MMM服務器角色對應關係:    
node1(主1)     192.168.0.201   db1    1    
node2(主2)     192.168.0.202   db2    2    
node3(從1)     192.168.0.203   db3    11    
node4(從1)     192.168.0.204   db4    12    
node5(監控)    192.168.0.205   mon    -

配置完成後,使用下面的VIP訪問MySQL Cluster。    
192.168.0.211  writer 
192.168.0.212  reader 
192.168.0.213  reader    
192.168.0.214  reader    
192.168.0.215  reader

 

一、雙主環境,以及從服務器環境準備

1,node1(主1) /etc/my.cnf

[mysqld]    
server-id              = 1    
binlog-format          = ROW    
log-bin                = master-bin    
log-bin-index          = master-bin.index    
log-slave-updates      = true    
auto_increment_offset  = 1    
auto_increment_increment = 2


mysql> show master status;    
+-------------------+----------+--------------+------------------+-------------------+    
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |    
+-------------------+----------+--------------+------------------+-------------------+    
| master-bin.000001 |      120 |              |                  |                   |    
+-------------------+----------+--------------+------------------+-------------------+    
1 row in set (0.00 sec)

mysql>

 

2. node1(主2) /etc/my.cnf

[mysqld]    
server-id              = 2    
binlog-format          = ROW    
log-bin                = master-bin    
log-bin-index          = master-bin.index    
log-slave-updates      = true    
auto_increment_offset  = 2    
auto_increment_increment = 2


mysql> show master status;    
+-------------------+----------+--------------+------------------+-------------------+    
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |    
+-------------------+----------+--------------+------------------+-------------------+    
| master-bin.000001 |      120 |              |                  |                   |    
+-------------------+----------+--------------+------------------+-------------------+    
1 row in set (0.00 sec)

mysql>

 

3. node1,node2 雙主服務器配置同步複製帳號

grant replication slave on *.* to 'repl'@'%' identified by '123456';    
flush privileges;

 

4, node3(從)/etc/my.cnf

[mysqld]    
binlog-format                = ROW    
log-bin                      = mysql-bin    
relay-log                    = slave-relay-bin    
relay-log-index              = slave-relay-bin.index    
log-slave-updates            = true    
server-id                    = 11    
skip-name-resolve

 

5, node4(從)/etc/my.cnf

[mysqld]    
binlog-format                = ROW    
log-bin                      = mysql-bin    
relay-log                    = slave-relay-bin    
relay-log-index              = slave-relay-bin.index    
log-slave-updates            = true    
server-id                    = 12    
skip-name-resolve

 

6. node1從庫配置同步過程

(1) 配置同步,手動執行同步參數,該配置會寫入master.info文件中。

mysql >

CHANGE MASTER TO    
MASTER_HOST='192.168.0.202',    
MASTER_PORT=3306,    
MASTER_USER='repl',    
MASTER_PASSWORD='123456',    
MASTER_LOG_FILE='master-bin.000001',    
MASTER_LOG_POS=120;

mysql> start slave;

mysql> show slave status\G;    
*************************** 1. row ***************************    
               Slave_IO_State: Waiting for master to send event    
                  Master_Host: 192.168.0.202    
                  Master_User: repl    
                  Master_Port: 3306    
                Connect_Retry: 60    
              Master_Log_File: master-bin.000001    
          Read_Master_Log_Pos: 407    
               Relay_Log_File: node1-relay-bin.000002    
                Relay_Log_Pos: 571    
        Relay_Master_Log_File: master-bin.000001    
             Slave_IO_Running: Yes    
            Slave_SQL_Running: Yes    
              Replicate_Do_DB:

 

7. node1從庫配置同步過程

(1) 配置同步,手動執行同步參數,該配置會寫入master.info文件中。

mysql >

CHANGE MASTER TO    
MASTER_HOST='192.168.0.201',    
MASTER_PORT=3306,    
MASTER_USER='repl',    
MASTER_PASSWORD='123456',    
MASTER_LOG_FILE='master-bin.000001',    
MASTER_LOG_POS=120;

mysql> start slave;    
mysql> show slave status\G;    
*************************** 1. row ***************************    
               Slave_IO_State: Waiting for master to send event    
                  Master_Host: 192.168.0.201    
                  Master_User: repl    
                  Master_Port: 3306    
                Connect_Retry: 60    
              Master_Log_File: master-bin.000001    
          Read_Master_Log_Pos: 694    
               Relay_Log_File: node2-relay-bin.000002    
                Relay_Log_Pos: 571    
        Relay_Master_Log_File: master-bin.000001    
             Slave_IO_Running: Yes    
            Slave_SQL_Running: Yes    
              Replicate_Do_DB:

 

8. 測試雙主相互複製

(1) node1上創建數據庫

mysql> create database mydb;    
Query OK, 1 row affected (0.00 sec)

mysql> use mydb;    
Database changed    
mysql> show tables;    
+----------------+    
| Tables_in_mydb |    
+----------------+    
| user           |    
+----------------+    
1 row in set (0.01 sec)

mysql> select * from user;    
+----+----------+----------+    
| id | username | password |    
+----+----------+----------+    
| 1  | koumm    | 123456   |    
+----+----------+----------+    
1 row in set (0.01 sec)

mysql>


(2) node2上的操作如下:    
mysql> show databases;    
+--------------------+    
| Database           |    
+--------------------+    
| information_schema |    
| mydb               |    
| mysql              |    
| performance_schema |    
+--------------------+    
4 rows in set (0.00 sec)

mysql> use mydb;    
Database changed    
mysql> CREATE TABLE `user` (    
    ->   `id` varchar(20) NOT NULL,    
    ->   `username` varchar(20) NOT NULL,    
    ->   `password` char(32) NOT NULL,    
    ->   PRIMARY KEY (`id`)    
    -> ) ;    
Query OK, 0 rows affected (0.14 sec)

mysql> INSERT INTO user  VALUES ('1', 'koumm', '123456');    
Query OK, 1 row affected (0.00 sec)

mysql>

 

二、配置node3, node4同步node1(主)

1,node1主庫鎖表,導數據庫

(1) 主庫鎖表

mysql> flush tables with read lock;    
Query OK, 0 rows affected (0.00 sec)


mysql> show master status;    
+-------------------+----------+--------------+------------------+-------------------+    
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |    
+-------------------+----------+--------------+------------------+-------------------+    
| master-bin.000001 |     1226 |              |                  |                   |    
+-------------------+----------+--------------+------------------+-------------------+    
1 row in set (0.00 sec)


(2) 主庫備份

[root@master ~]# mysqldump -uroot -p -B mydb > mydb.sql    
說明:-B參數有建庫語句。


(3) 主庫解開鎖表功能

mysql> unlock tables;    
Query OK, 0 rows affected (0.00 sec)    
mysql>

 

2. node3,node4從庫導入數據庫

# mysql -uroot -padmin < mydb.sql

 

3. node3,node4 從庫配置同步過程

(1) 配置同步,手動執行同步參數,該配置會寫入master.info文件中。

mysql >

CHANGE MASTER TO    
MASTER_HOST='192.168.0.201',    
MASTER_PORT=3306,    
MASTER_USER='repl',    
MASTER_PASSWORD='123456',    
MASTER_LOG_FILE='master-bin.000001',    
MASTER_LOG_POS=1226;


mysql> start slave;    
Query OK, 0 rows affected (0.04 sec)

mysql> show slave status\G;    
*************************** 1. row ***************************    
               Slave_IO_State: Waiting for master to send event    
                  Master_Host: 192.168.1.121    
                  Master_User: repl    
                  Master_Port: 3306    
                Connect_Retry: 60    
              Master_Log_File: master-bin.000005    
          Read_Master_Log_Pos: 730    
               Relay_Log_File: slave-relay-bin.000002    
                Relay_Log_Pos: 284    
        Relay_Master_Log_File: master-bin.000005    
             Slave_IO_Running: Yes    
            Slave_SQL_Running: Yes    
              Replicate_Do_DB:    
          Replicate_Ignore_DB:


可以簡單測試一下同步數據情況。

 

三、配置MMM過程

1, 安裝mmm軟件包

(1) node1,node2,node3,node4,node5節點    
# wget http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm    
# rpm -ivh epel-release-6-8.noarch.rpm

(2) node5(監控節點)    
# yum install mysql-mmm mysql-mmm-agent mysql-mmm-tools mysql-mmm-monitor

(3) node1,node2,node3,node4 (mysql節點)    
# yum install mysql-mmm-agent

 

2,所有的MySQL節點添加以下兩個用戶,這裏可以在主庫做該操作,會自動同步到其它節點。

mysql> grant replication client on *.* to 'mmm_monitor'@'192.168.0.%' identified by '123456';    
mysql> grant super, replication client, process on *.* to 'mmm_agent'@'192.168.0.%' identified by '123456';    
mysql> flush privileges;

 

3,所有主機node1,node2,node3,node4,node5上創建如下文件

[root@node1 ~]# vi /etc/mysql-mmm/mmm_common.conf    
active_master_role      writer

<host default>    
    cluster_interface       eth0    
    pid_path                /var/run/mysql-mmm/mmm_agentd.pid    
    bin_path                /usr/libexec/mysql-mmm/    
    replication_user        repl    
    replication_password    123456    
    agent_user              mmm_agent    
    agent_password          123456    
</host>

<host db1>    
    ip      192.168.0.201    
    mode    master    
    peer    db2    
</host>

<host db2>    
    ip      192.168.0.202    
    mode    master    
    peer    db1    
</host>

<host db3>    
    ip      192.168.0.203    
    mode    slave    
</host>

<host db4>    
    ip      192.168.0.204    
    mode    slave    
</host>

<role writer>    
    hosts   db1, db2    
    ips     192.168.0.211    
    mode    exclusive    
</role>

<role reader>    
    hosts   db1, db2, db3, db4    
    ips     192.168.0.212,192.168.0.213,192.168.0.214,192.168.0.215    
    mode    balanced    
</role>

複製該配置文件到所有節點上:    
[root@node1 ~]# scp /etc/mysql-mmm/mmm_common.conf node2:/etc/mysql-mmm/    
[root@node1 ~]# scp /etc/mysql-mmm/mmm_common.conf node3:/etc/mysql-mmm/    
[root@node1 ~]# scp /etc/mysql-mmm/mmm_common.conf node4:/etc/mysql-mmm/    
[root@node1 ~]# scp /etc/mysql-mmm/mmm_common.conf node5:/etc/mysql-mmm/

 

4. 配置agent代理節點,所有mysql主從服務器均爲代理節點

(1) node1,node2,node3,node4 的MySQL節點配置mmm_agent.conf

# vi /etc/mysql-mmm/mmm_agent.conf    
include mmm_common.conf    
this db1   #在四臺mysql節點上設置對應的db,分別爲db1、db2、db3、db4


(2) 默認爲啓用,可以不用修改    
# cat /etc/default/mysql-mmm-agent    
# mysql-mmm-agent defaults    
ENABLED=1

(3) mysql節點啓動服務

# chkconfig mysql-mmm-agent on    
# /etc/init.d/mysql-mmm-agent start

 

5,配置MMM管理監控節點node5

(1) 配置監控    
[root@node5 ~]# vi /etc/mysql-mmm/mmm_mon.conf    
include mmm_common.conf

<monitor>    
    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.201,192.168.0.202,192.168.0.203,192.168.0.204    
    auto_set_online     30

    # The kill_host_bin does not exist by default, though the monitor will    
    # throw a warning about it missing.  See the section 5.10 "Kill Host    
    # Functionality" in the PDF documentation.    
    #    
    # kill_host_bin     /usr/libexec/mysql-mmm/monitor/kill_host    
    #    
</monitor>

<host default>    
    monitor_user        mmm_monitor    
    monitor_password    123456    
</host>

debug 0


(2) mysql節點啓動服務

# chkconfig mysql-mmm-monitor on    
# /etc/init.d/mysql-mmm-monitor start

 

6, 查看狀態

(1) 管理服務器上查看狀態

[root@node1 ~]# mmm_control show    
  db1(192.168.0.201) master/ONLINE. Roles: reader(192.168.0.215), writer(192.168.0.211)    
  db2(192.168.0.202) master/ONLINE. Roles: reader(192.168.0.213)    
  db3(192.168.0.203) slave/ONLINE. Roles: reader(192.168.0.212)    
  db4(192.168.0.204) slave/ONLINE. Roles: reader(192.168.0.214)

[root@node1 ~]# mmm_control checks all    
db4  ping         [last change: 2016/04/27 16:45:49]  OK    
db4  mysql        [last change: 2016/04/27 16:45:49]  OK    
db4  rep_threads  [last change: 2016/04/27 16:45:49]  OK    
db4  rep_backlog  [last change: 2016/04/27 16:45:49]  OK: Backlog is null    
db2  ping         [last change: 2016/04/27 16:45:49]  OK    
db2  mysql        [last change: 2016/04/27 16:45:49]  OK    
db2  rep_threads  [last change: 2016/04/27 16:45:49]  OK    
db2  rep_backlog  [last change: 2016/04/27 16:45:49]  OK: Backlog is null    
db3  ping         [last change: 2016/04/27 16:45:49]  OK    
db3  mysql        [last change: 2016/04/27 16:45:49]  OK    
db3  rep_threads  [last change: 2016/04/27 16:45:49]  OK    
db3  rep_backlog  [last change: 2016/04/27 16:45:49]  OK: Backlog is null    
db1  ping         [last change: 2016/04/27 16:45:49]  OK    
db1  mysql        [last change: 2016/04/27 16:45:49]  OK    
db1  rep_threads  [last change: 2016/04/27 16:45:49]  OK    
db1  rep_backlog  [last change: 2016/04/27 16:45:49]  OK: Backlog is null    
[root@node1 ~]#


(2) 服務器的啓動VIP地址

[root@node1 ~]# ip a    
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN    
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00    
    inet 127.0.0.1/8 scope host lo    
    inet6 ::1/128 scope host    
       valid_lft forever preferred_lft forever    
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000    
    link/ether 00:0c:29:ff:33:6a brd ff:ff:ff:ff:ff:ff    
    inet 192.168.0.201/24 brd 192.168.0.255 scope global eth0    
    inet 192.168.0.215/32 scope global eth0    
    inet 192.168.0.211/32 scope global eth0    
    inet6 fe80::20c:29ff:feff:336a/64 scope link    
       valid_lft forever preferred_lft forever    
[root@node1 ~]#

[root@node2 ~]# ip a    
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN    
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00    
    inet 127.0.0.1/8 scope host lo    
    inet6 ::1/128 scope host    
       valid_lft forever preferred_lft forever    
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000    
    link/ether 00:0c:29:8c:60:58 brd ff:ff:ff:ff:ff:ff    
    inet 192.168.0.202/24 brd 192.168.0.255 scope global eth0    
    inet 192.168.0.213/32 scope global eth0    
    inet6 fe80::20c:29ff:fe8c:6058/64 scope link    
       valid_lft forever preferred_lft forever    
[root@node2 ~]#

服務器讀寫採有VIP地址進行讀寫,出現故障時VIP會漂移到其它節點,由其它節點提供服務。


四、MMM高可用測試

首先查看整個集羣的狀態,可以看到整個集羣狀態正常。
[root@node5 ~]# mmm_control show     
  db1(192.168.0.201) master/ONLINE. Roles: reader(192.168.0.212), writer(192.168.0.211)
  db2(192.168.0.202) master/ONLINE. Roles: reader(192.168.0.213)
  db3(192.168.0.203) slave/ONLINE. Roles: reader(192.168.0.215)
  db4(192.168.0.204) slave/ONLINE. Roles: reader(192.168.0.214)
[[email protected] ~]#

1. 模擬node2宕機,手動停止mysql服務,觀察monitor日誌node2由關閉到啓動的日誌如下:

[[email protected] ~]# tail -f /var/log/mysql-mmm/mmm_mond.log
2016/04/29 09:58:33 FATAL State of host 'db2' changed from ONLINE to HARD_OFFLINE (ping: OK, mysql: not OK)
2016/04/29 10:00:54 FATAL State of host 'db2' changed from HARD_OFFLINE to AWAITING_RECOVERY
2016/04/29 10:01:24 FATAL State of host 'db2' changed from AWAITING_RECOVERY to ONLINE because of auto_set_online(30 seconds). It was in state AWAITING_RECOVERY for 30

seconds

重新查看集羣的最新狀態:

[root@node5 ~]# mmm_control show
  db1(192.168.0.201) master/ONLINE. Roles: reader(192.168.0.212), writer(192.168.0.211)
  db2(192.168.0.202) master/HARD_OFFLINE. Roles:   #從日誌發現db2的狀態有ONLINE轉換爲HARD_OFFLINE
  db3(192.168.0.203) slave/ONLINE. Roles: reader(192.168.0.213), reader(192.168.0.215)
  db4(192.168.0.204) slave/ONLINE. Roles: reader(192.168.0.214)

[root@node5 ~]# mmm_control checks all
db4  ping         [last change: 2016/04/29 09:01:08]  OK
db4  mysql        [last change: 2016/04/29 09:01:08]  OK
db4  rep_threads  [last change: 2016/04/29 09:01:08]  OK
db4  rep_backlog  [last change: 2016/04/29 09:01:08]  OK: Backlog is null
db2  ping         [last change: 2016/04/29 09:01:08]  OK
db2  mysql        [last change: 2016/04/29 09:58:33]  ERROR: Connect error (host = 192.168.0.202:3306, user = mmm_monitor)! Lost connection to MySQL server at 'reading

initial communication packet', system error: 111   能ping通,說明只是服務死掉了。
db2  rep_threads  [last change: 2016/04/29 09:01:08]  OK
db2  rep_backlog  [last change: 2016/04/29 09:01:08]  OK: Backlog is null
db3  ping         [last change: 2016/04/29 09:01:08]  OK
db3  mysql        [last change: 2016/04/29 09:01:08]  OK
db3  rep_threads  [last change: 2016/04/29 09:01:08]  OK
db3  rep_backlog  [last change: 2016/04/29 09:01:08]  OK: Backlog is null
db1  ping         [last change: 2016/04/29 09:01:08]  OK
db1  mysql        [last change: 2016/04/29 09:56:33]  OK
db1  rep_threads  [last change: 2016/04/29 09:01:08]  OK
db1  rep_backlog  [last change: 2016/04/29 09:01:08]  OK: Backlog is null

[root@node5 ~]#

啓動node2,node2由HARD_OFFLINE轉到AWAITING_RECOVERY狀態。這裏db2再次接管讀請求。

[root@node5 ~]# mmm_control show     
  db1(192.168.0.201) master/ONLINE. Roles: reader(192.168.0.212), writer(192.168.0.211)
  db2(192.168.0.202) master/ONLINE. Roles: reader(192.168.0.213)
  db3(192.168.0.203) slave/ONLINE. Roles: reader(192.168.0.215)
  db4(192.168.0.204) slave/ONLINE. Roles: reader(192.168.0.214)
[root@node5 ~]#


2. 模擬node1主庫宕機,查看集羣狀態。

[root@node5 ~]# mmm_control show
  db1(192.168.0.201) master/HARD_OFFLINE. Roles:
  db2(192.168.0.202) master/ONLINE. Roles: reader(192.168.0.213), writer(192.168.0.211)
  db3(192.168.0.203) slave/ONLINE. Roles: reader(192.168.0.212), reader(192.168.0.215)
  db4(192.168.0.204) slave/ONLINE. Roles: reader(192.168.0.214)

node1主庫再啓動:

[root@node5 ~]# mmm_control show
  db1(192.168.0.201) master/ONLINE. Roles: reader(192.168.0.212)
  db2(192.168.0.202) master/ONLINE. Roles: reader(192.168.0.213), writer(192.168.0.211)
  db3(192.168.0.203) slave/ONLINE. Roles: reader(192.168.0.215)
  db4(192.168.0.204) slave/ONLINE. Roles: reader(192.168.0.214)

可以看到主庫啓動用會自動轉到讀的角色,不會接管主,只到現有的主再次宕機。

[[email protected] ~]# tail -f /var/log/mysql-mmm/mmm_mond.log
2016/04/29 10:03:25 FATAL State of host 'db1' changed from ONLINE to HARD_OFFLINE (ping: OK, mysql: not OK)
2016/04/29 10:06:20 FATAL State of host 'db1' changed from HARD_OFFLINE to AWAITING_RECOVERY
2016/04/29 10:06:51 FATAL State of host 'db1' changed from AWAITING_RECOVERY to ONLINE because of auto_set_online(30 seconds). It was in state AWAITING_RECOVERY for 31

seconds

3. 測試小結:
(1)node2備選主節點宕機不影響集羣的狀態,就是移除了node2備選節點的讀狀態。
(2)node1主節點宕機,由node2備選主節點接管寫角色,node3,node4指向新node2主庫進行復制,node3,node4會自動change master到node2.
(3)問題來了:
如果node1主庫宕機,node2複製應用又落後於node1時就變成了主可寫狀態,這進的數據主無法保證一致性。
如果node2,node3,node4延遲於node1主,這個時node1宕機,node3,node4將會等待數據追上db1後,再重新指向新的主node2進行復制操作,這時的數據也無法保證同步的一致性。
(4)如查採用MMM高可用架構,主,主備選節點機器配置一樣,而且開啓半同步進一步提高安全性或採用MariaDB進行多線程從複製,提高複製的性能。

   
說明:MMM(Master-Master Replication Manager for MySQL)主主複製管理器, MMM集羣套件具有良好的穩定性、高可用性和可擴展性。當活動的Master節點出現故障時,備用Master節點可以立即接管,而其他的Slave節點也能自動切換到備用Master節點繼續進行同步複製,而無需人爲干涉;MMM架構需要多個節點、多個IP,對服務器數量有要求,在讀寫非常繁忙的業務系統下表現不是很穩定,可能會出現複製延時、切換失效等問題。MMM方案並不太適應於對數據安全性要求很高,並且讀、寫繁忙的環境中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章