MySQL-MMM實現MySQL高可用


一、MMM簡介

MMM(Master-Master replication manager for MySQL)是一套支持雙主故障切換和雙主日常管理的腳本程序。MMM使用Perl語言開發,主要用來監控和管理MySQL Master-Master(雙主)復制,雖然叫做雙主復制,但是業務上同一時刻只允許對一個主進行寫入,另一台備選主上提供部分讀服務,以加速在主主切換時刻備選主的預熱,可以說MMM這套腳本程序一方面實現了故障切換的功能,另一方面其內部附加的工具腳本也可以實現多個slave的read負載均衡。

MMM提供了自動和手動兩種方式移除一組服務器中復制延遲較高的服務器的虛擬ip,同時它還可以備份數據,實現兩節點之間的數據同步等。由於MMM無法完全的保證數據一致性,所以MMM適用於對數據的一致性要求不是很高,但是又想最大程度的保證業務可用性的場景。對於那些對數據的一致性要求很高的業務,非常不建議采用MMM這種高可用架構。

優點:

1 穩定和成熟的開源產品,經過了時間的考驗 核心技術是mysql自己的技術,只是使用腳本程序來控制,所以在原理上比較容易理解,而且管理能夠更智能化。 2 安裝簡單,配置簡單,使用簡單 3 功能強大 (HA,failover,tools套件,cluster模式可以一個monitor管理多個mmm組)

缺點:

1 由於架構里只有一個寫入點,所以擴展性是有限的,但是對一般中型企業夠用了。    解決方案:對於大應用可以采取垂直拆分到多個mmm架構的方式,使用mmm cluster來管理。 2 對於讀寫分離和讀負載均衡還是要程序來開發或者使用其他工具完成。

二、架構及配置環境

MySQL-MMM架構圖:

mysql-mmm運行機制:

 mysql-mmm安裝需求

Server n+1: N台安裝mysql的機器和1台安裝mmm monitor的機器。 2*(n+1)Ips: 每個主機一個固定ip、一個虛擬IP(reader role),全局一個writer role IP 
Monitor User: 一個可以在mmm monitor機器上使用的並且擁有REPLICATION,CLIENT權限的mysql用戶 Agent User: 一個可以在mmm agent機器上使用的並且擁有super,replication,client,process權限的mysql用戶 Replication user: 一個slaves主機上可以使用的並且有用replication slave權限的用戶 Tools user: 一個mmm tools主機可以使用的,並且有用super,replication client,reload權限的mysql用戶

安裝環境:

1.角色:

2.虛擬ip規划:

3.hosts文件配置(全部機器):

192.168.1.11 master-db1 192.168.1.12 master-db2 192.168.1.13 slave-db1 192.168.1.14 slave-db2 192.168.1.15 mmm-monitor

4.其他:

1 關閉iptables 2 同步時間 3 配置yum和epel源

三、安裝MySQL並配置

1.mysql安裝

 由於篇幅有限,安裝步驟見小弟另一篇文章http://www.cnblogs.com/panwenbin-logs/p/8260931.html

2.編輯配置文件/etc/my.cnf:

master-db1

[mysqld]
server-id = 1 datadir = /Data/apps/mysql-5.6.36/data log-bin = /Data/apps/mysql-5.6.36/data/mysql-bin binlog_format = ROW relay_log = /Data/apps/mysql-5.6.36/data/relay-log auto-increment-increment = 2 auto-increment-offset = 1 sync_binlog = 1 sync_master_info = 1 sync_relay_log = 1 sync_relay_log_info = 1 max_binlog_size = 100M log_slave_updates = 1 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

master-db2

[mysqld] server-id = 2 datadir = /Data/apps/mysql-5.6.36/data log-bin = /Data/apps/mysql-5.6.36/data/mysql-bin binlog_format = ROW relay_log = /Data/apps/mysql-5.6.36/data/relay-log auto-increment-increment = 2 auto-increment-offset = 2 sync_binlog = 1 sync_master_info = 1 sync_relay_log = 1 sync_relay_log_info = 1 max_binlog_size = 100M log_slave_updates = 1 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

slave-db1

[mysqld] server-id = 3 datadir = /Data/apps/mysql-5.6.36/data log-bin = /Data/apps/mysql-5.6.36/data/mysql-bin binlog_format = ROW relay_log = /Data/apps/mysql-5.6.36/data/relay-log sync_binlog = 1 sync_master_info = 1 sync_relay_log = 1 sync_relay_log_info = 1 max_binlog_size = 100M log_slave_updates = 1 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

slave-db2

[mysqld] server-id = 4 datadir = /Data/apps/mysql-5.6.36/data log-bin = /Data/apps/mysql-5.6.36/data/mysql-bin binlog_format = ROW relay_log = /Data/apps/mysql-5.6.36/data/relay-log sync_binlog = 1 sync_master_info = 1 sync_relay_log = 1 sync_relay_log_info = 1 max_binlog_size = 100M log_slave_updates = 1 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

3.重啟以上四台mysql服務

service mysqld restart

4.在master-db1上創建mmm架構中需要的用戶和權限

[root@master-db1 ~]# mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.6.36-log MySQL Community Server (GPL) ....... Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'192.168.1.%' IDENTIFIED BY '123456'; Query OK, 0 rows affected (0.19 sec) mysql> GRANT SUPER,REPLICATION CLIENT,PROCESS ON *.* TO 'mmm_agent'@'192.168.1.%' IDENTIFIED BY '123456'; Query OK, 0 rows affected (0.00 sec) mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.1.%' IDENTIFIED BY '123456'; Query OK, 0 rows affected (0.01 sec)

5.查看二進制日志位置

mysql> FLUSH TABLES WITH READ LOCK; Query OK, 0 rows affected (0.07 sec) mysql> SHOW MASTER STATUS; +------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      796 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.05 sec)

6.不要關閉這個mysql進程連接,避免鎖失效,我們另起一個ssh連接db1服務器,進行數據庫備份:

[root@master-db1 ~]# mysqldump --all-databases > /tmp/database-backup.sql

7.回到剛才mysql進程,進行解鎖:

mysql> UNLOCK TABLES; Query OK, 0 rows affected (0.05 sec)

8.將database-backup.sql文件復制到其他db節點:

[root@master-db1 ~]# scp /tmp/database-backup.sql master-db2:/tmp [root@master-db1 ~]# scp /tmp/database-backup.sql slave-db1:/tmp [root@master-db1 ~]# scp /tmp/database-backup.sql slave-db2:/tmp

9.master-db,slave-db1,slave-db2三台主機導入sql文件,並刷新權限:

[root@master-db2 ~]# mysql < /tmp/database-backup.sql [root@master-db2 ~]# mysql -e "FLUSH PRIVILEGES;"

四、設置MySQL主-從和主-主配置

1.在其他三台mysql上將master-db1設為主服務器

[root@master-db2 ~]# mysql mysql> CHANGE MASTER TO MASTER_HOST='192.168.1.11',MASTER_USER='replication',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=796; Query OK, 0 rows affected, 2 warnings (0.11 sec) mysql> start slave; Query OK, 0 rows affected (0.11 sec)
mysql
> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.11 Master_User: replication Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 796 Relay_Log_File: relay-log.000002 Relay_Log_Pos: 283 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes

2.查看master-db2的master日志位置:

mysql> SHOW MASTER STATUS; +------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |   636231 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

3.在master-db1上操作,將master-db2設置為主:

mysql> CHANGE MASTER TO MASTER_HOST='192.168.1.12',MASTER_USER='replication',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=636231; Query OK, 0 rows affected, 2 warnings (0.03 sec) mysql> start slave; Query OK, 0 rows affected (0.01 sec) mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.12 Master_User: replication Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 636231 Relay_Log_File: relay-log.000002 Relay_Log_Pos: 283 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes

五、安裝MMM

1.創建Tools user

useradd -s /sbin/nologin mmmd #所有機器

2.查看mmm版本:

yum list all|grep ^mysql-mmm mysql-mmm.noarch                            2.2.1-2.el6 @epel mysql-mmm-agent.noarch                      2.2.1-2.el6 @epel mysql-mmm-monitor.noarch                    2.2.1-2.el6 epel mysql-mmm-tools.noarch                      2.2.1-2.el6                  epel  

3.在mmm-monitor上安裝:

[root@mmm-monitor ~]# yum -y install mysql-mmm-monitor

4.在四台mysql服務器上安裝:

yum -y install mysql-mmm-agent

5.編寫配置文件,五台主機必須一致:

[root@mmm-monitor ~]# vim /etc/mysql-mmm/mmm_common.conf active_master_role writer  #積極的master角色的標示,所有的db服務器要開啟read_only參數,對於writer服務器監控代理會自動將read_only屬性關閉。 <host default> cluster_interface eth0 #群集的網絡接口 pid_path /var/run/mysql-mmm/mmm_agentd.pid  #pid路徑 bin_path /usr/libexec/mysql-mmm/  #可執行文件路徑 replication_user replication    #復制用戶 replication_password 123456      #復制用戶密碼 agent_user mmm_agent    #代理用戶 agent_password 123456      #代理用戶密碼 </host>

<host master-db1>   #master-db1的host名稱 ip 192.168.1.11   #master-db1的ip mode master   #角色屬性,master代表是主 peer master-db2   #與master-db1對等的服務器的host名,也就是master-db2的服務器host名 </host>

<host master-db2>   #和master-db1的概念一樣 ip 192.168.1.12 mode master peer master-db1 </host>

<host slave-db1>     #從庫的host名,如果存在多個從庫可以重復一樣的配置 ip 192.168.1.13    #從的ip mode slave     #slave的角色屬性代表當前host是從 </host>

<host slave-db2>      #和slave-db1的概念一樣 ip 192.168.1.14 mode slave </host>
<role writer>      #writer角色配置 hosts master-db1, master-db2   #能進行寫操作的服務器的host名,如果不想切換寫操作這里可以只配置master,這樣也可以避免因為網絡延時而進行write的切換,但是一旦master出現故障那么當前的MMM就沒有writer了只有對外的read操作。 ips 192.168.1.250    #對外提供的寫操作的虛擬IP mode exclusive    #exclusive代表只允許存在一個主,也就是只能提供一個寫的IP </role>

<role reader>   #read角色配置 hosts master-db1, master-db2, slave-db1, slave-db2    #對外提供讀操作的服務器的host名,當然這里也可以把master加進來 ips 192.168.1.251, 192.168.1.252, 192.168.1.253, 192.168.1.254    #對外提供讀操作的虛擬ip,這三個ip和host不是一一對應的,並且ips也hosts的數目也可以不相同,如果這樣配置的話其中一個hosts會分配兩個ip mode balanced  #balanced代表負載均衡 </role>

 6.復制到其他服務器上

scp /etc/mysql-mmm/mmm_common.conf 192.168.1.11:/etc/mysql-mmm/mmm_common.conf scp /etc/mysql-mmm/mmm_common.conf 192.168.1.12:/etc/mysql-mmm/mmm_common.conf scp /etc/mysql-mmm/mmm_common.conf 192.168.1.13:/etc/mysql-mmm/mmm_common.conf scp /etc/mysql-mmm/mmm_common.conf 192.168.1.14:/etc/mysql-mmm/mmm_common.conf 

 7.在所有的MySQL上修改mmm_agent.conf,只需要修改master-db1這里,是哪台就改成哪台,這里只給出master-db1的:

vim /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 master-db1

8.配置mmm-monitor上的mmm_mon.conf:

[root@mmm-monitor ~]# vim /etc/mysql-mmm/mmm_mon.conf include mmm_common.conf <monitor> ip 192.168.1.15 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.1.11, 192.168.1.12, 192.168.1.13, 192.168.1.14 auto_set_online 60 # 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

9.啟動服務:

在mmm-monitor啟動:

[root@mmm-monitor ~]# chkconfig mysql-mmm-monitor on [root@mmm-monitor ~]# service mysql-mmm-monitor start

在所有mysql服務器上啟動

chkconfig mysql-mmm-agent on service mysql-mmm-agent start

 

六、高可用性測試:

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

mysql-mmm故障處理機制:

 

1.首先查看整個集群的狀態,可以看到整個集群狀態正常

[root@mmm-monitor ~]# mmm_control show master-db1(192.168.1.11) master/ONLINE. Roles: reader(192.168.1.251), writer(192.168.1.250) master-db2(192.168.1.12) master/ONLINE. Roles: reader(192.168.1.254) slave-db1(192.168.1.13) slave/ONLINE. Roles: reader(192.168.1.252) slave-db2(192.168.1.14) slave/ONLINE. Roles: reader(192.168.1.253)

2.關閉master-db1上的mysql服務,模擬mysql宕機

[root@master-db1 ~]# service mysqld stop Shutting down MySQL... [確定]

3.mmm-monitor上查看集群狀態

[root@mmm-monitor ~]# mmm_control show master-db1(192.168.1.11) master/HARD_OFFLINE. Roles: master-db2(192.168.1.12) master/ONLINE. Roles: reader(192.168.1.254), writer(192.168.1.250) slave-db1(192.168.1.13) slave/ONLINE. Roles: reader(192.168.1.251), reader(192.168.1.252) slave-db2(192.168.1.14) slave/ONLINE. Roles: reader(192.168.1.253)

從顯示結果可以看出master-db1的狀態有ONLINE轉換為HARD_OFFLINE,寫VIP轉移到了master-db2主機上。

4.查看slave-db1和slave-db2主從狀態

mysql> show slave status\G #slave-db1 *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.12 Master_User: replication Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 636231 Relay_Log_File: relay-log.000002 Relay_Log_Pos: 283 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes
mysql> show slave status\G   #slave-db2 *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.12 Master_User: replication Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 636231 Relay_Log_File: relay-log.000002 Relay_Log_Pos: 283 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes

可以看到寫請求的VIP已經轉移到master-db2上了,且從節點的主都指向了master-db2

5.啟動master-db1的mysql服務

[root@master-db1 ~]# service mysqld start Starting MySQL...... [確定]

6.再次查看集群狀態(大概等待一分鍾左右)

[root@mmm-monitor ~]# mmm_control show master-db1(192.168.1.11) master/ONLINE. Roles: reader(192.168.1.252) master-db2(192.168.1.12) master/ONLINE. Roles: reader(192.168.1.254), writer(192.168.1.250) slave-db1(192.168.1.13) slave/ONLINE. Roles: reader(192.168.1.251) slave-db2(192.168.1.14) slave/ONLINE. Roles: reader(192.168.1.253)

7.再次slave-db1和slave-db2主從狀態

mysql> show slave status\G #slave-db1 *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.12 Master_User: replication Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 636231 Relay_Log_File: relay-log.000002 Relay_Log_Pos: 283 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes
mysql> show slave status\G   #slave-db2 *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.12 Master_User: replication Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 636231 Relay_Log_File: relay-log.000002 Relay_Log_Pos: 283 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes

可以看到主庫啟動不會接管主,直到現有的主再次宕機。

mysql-mmm故障處理機制中總結:

 1.對外提供讀寫的虛擬IP是由monitor程序控制。如果monitor沒有啟動那么db服務器不會被分配虛擬ip,但是如果已經分配好了虛擬ip,當monitor程序關閉了原先分配的虛擬ip不會立即關閉外部程序還可以連接訪問(只要不重啟網絡),這樣的好處就是對於monitor的可靠性要求就會低一些,但是如果這個時候其中的某一個db服務器故障了就無法處理切換,也就是原先的虛擬ip還是維持不變,掛掉的那台DB的虛擬ip會變的不可訪問。  2.agent程序受monitor程序的控制處理write切換,從庫切換等操作。如果monitor進程關閉了那么agent進程就起不到什么作用,它本身不能處理故障。  3.monitor程序負責監控db服務器的狀態,包括Mysql數據庫、服務器是否運行、復制線程是否正常、主從延時等;它還用於控制agent程序處理故障。  4.monitor會每隔幾秒鍾監控db服務器的狀態,如果db服務器已經從故障變成了正常,那么monitor會自動在60s之后將其設置為online狀態(默認是60s可以設為其它的值),有監控端的配置文件參數“auto_set_online”決定,群集服務器的狀態有三種分別是:HARD_OFFLINE→AWAITING_RECOVERY→online  5.默認monitor會控制mmm_agent會將writer db服務器read_only修改為OFF,其它的db服務器read_only修改為ON,所以為了嚴謹可以在所有的服務器的my.cnf文件中加入read_only=1由monitor控制來控制writer和read,root用戶和復制用戶不受read_only參數的影響。

mysql-mmm架構總結:

(1)master-db2備選主節點宕機不影響集群的狀態,就是移除了master-db2備選節點的讀狀態。 (2)master-db1主節點宕機,由master-db2備選主節點接管寫角色,slave-db1,slave-db2指向新master2主庫進行復制,slave-db1,slave-db2會自動change master到master2. (3)如果master-db1主庫宕機,master-db2復制應用又落后於master-db1時就變成了主可寫狀態,這時的數據主無法保證一致性。 如果master-db2,slave-db1,slave-db2延遲於master-db1主,這個時master-db1宕機,slave-db1,slave-db2將會等待數據追上master-db1后,再重新指向新的主master-db2進行復制操作,這時的數據也無法保證同步的一致性。 (4)如果采用MMM高可用架構,主,主備選節點機器配置一樣,而且開啟半同步進一步提高安全性或采用MariaDB/mysql5.7進行多線程從復制,提高復制的性能。

 參考文檔:http://mysql-mmm.org/mmm2:guide

         http://mysql-mmm.org/mysql-mmm.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM