MMM簡介
MMM(Master-Master Replication Manager for MySQL)MySQL主主複製管理器,實現了對MySQL雙主複製架構的監控,故障轉移和管理。mysql-mmm在實現過程中提供了多個虛擬IP,包括用於寫操作的虛擬IP和用於讀操作的虛擬IP。在雙主複製架構中僅有其中的一臺主節點可用於寫操作,所有節點包括從節點對外提供讀操作。當其中的一個從節點故障時,它持有的虛擬IP會自動轉移至其他節點上。若故障的是主節點,它持有的寫操作的虛擬IP和讀操作的虛擬IP都會自動轉移至另外一個主節點,向它同步數據的從節點也會將主服務器指向另一個主節點。
另外用於監控的monitor需要單獨部署,可以對monitor節點部署高可用以解決其單點故障。mysql-mmm僅能對mysql數據庫實現高可用,若要實現讀寫分離,負載均衡可以使用Ameoba或mysql-proxy。
實現過程
服務器架構
實驗環境:
服務器 | 主機名 | IP地址 | server-id |
master1 | node1 | 192.168.1.106 | 1 |
master2 | node2 | 192.168.1.126 | 2 |
slave1 | node3 | 192.168.1.127 | 3 |
slave2 | node4 | 192.168.1.131 | 4 |
monitor | node5 | 192.168.1.132 |
虛擬IP:
write:192.168.1.200
read:192.168.1.201,192.168.1.202,192.168.1.203
配置過程
1)首先在master和slave節點上安裝mariadb-10數據庫,5個節點實現時間同步。
2)node1和node2實現雙主複製架構
node1上配置文件(以實現半同步複製):
[root@node1 ~]# vim /etc/mysql/my.cnf server-id = 1 binlog_format = row datadir = /data/mydata sync_binlog = 1 autocommit = off relay-log = /data/relaylog/relay-log innodb_support_xa = 1 sync_master_info = 1 sync_relay_log = 1 sync_relay_log_info = 1 auto-increment-increment = 2 auto-increment-offset = 1 slave_parallel_threads = 3 rpl_semi_sync_master_enabled = 1 rpl_semi_sync_master_timeout = 1000 rpl_semi_sync_slave_enabled = 1 log_slave_updates = 1
node2上配置文件(已實現半同步複製,其餘配參數與node1上相同):
server-id = 2 ........... auto-increment-increment = 2 auto-increment-offset = 2
在兩個節點上創建授權賬號:
MariaDB [(none)]> grant replication slave,replication client on *.* to repuser@'192.168.1.%' identified by 'repuser'; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> flush privileges;
相互以對方爲主服務器:
node1上:
MariaDB [(none)]> change master to master_host='192.168.1.126',master_user='repuser',master_password='repuser',master_log_file='master-bin.000004',master_log_pos=657;
node2上:
MariaDB [(none)]> change master to master_host='192.168.1.106',master_user='repuser',master_password='repuser',master_log_file='master-bin.000004',master_log_pos=657;
node1,node2上啓動線程:
MariaDB [(none)]> start slave;
3)從服務器node3和node4向node1同步數據
node3配置文件:
server-id = 3 datadir = /data/mydata relay-log = /data/relaylog/relay-log read_only = 1 slave_parallel_threads = 3 sync_master_info = 1 sync_relay_log = 1 sync_relay_log_info = 1 rpl_semi_sync_slave_enabled = 1
node4配置文件(省略部分與node3一致):
server-id = 4 ....... .......
將node3和node4的主服務器指向node1:
MariaDB [(none)]> change master to master_host='192.168.1.106',master_user='repuser',master_password='repuser',master_log_file='master-bin.000004',master_log_pos=657;
node3,node4上啓動線程:
MariaDB [(none)]> start slave;
4)部署MMM
mysql-mmm工作時,有如下幾個服務進程:
mmm_agentd:運行在各mysql服務器上,代理進程。
mmm_control:運行在監控節點上,通過命令行管理mmm_mond進程
mmm_mond:運行在監控節點上,監控守護進程,執行節點的移除等
首先在各個mysql服務器上安裝mysql-mmm-agent,在監控節點上安裝mysql-mmm-monitor。
在node1-4上:
yum install mysql-mmm-agent
在node5上:
yum install mysql-mmm-monitor
添加代理、監控賬號,在其中一個主節點上完成即可。
MariaDB [(none)]> GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'192.168.1.%' IDENTIFIED BY 'mmm_monitor'; MariaDB [(none)]> GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'192.168.1.%' IDENTIFIED BY 'mmm_agent'; MariaDB [(none)]> flush privileges;
所有主機上配置/etc/mysql-mmm/mmm_common.conf(node1-5上),簡單起見通過ansible完成。
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 repuser #複製用戶 replication_password repuser #複製用戶密碼 agent_user mmm_agent #代理用戶 agent_password mmm_agent #代理用戶密碼 </host> <host db1> ip 192.168.1.106 mode master peer db2 </host> <host db2> ip 192.168.1.126 mode master peer db1 </host> <host db3> ip 192.168.1.127 mode slave </host> <host db4> ip 192.168.1.131 mode slave </host> <role writer> hosts db1, db2 #用於寫操作的節點 ips 192.168.1.200 #用於寫操作的虛擬IP mode exclusive #db1,db2僅有一個被用於寫操作 </role> <role reader> hosts db1, db2, db3, db4 #用於讀操作的節點 ips 192.168.1.201, 192.168.1.202, 192.168.1.203 #用於讀操作的虛擬IP mode balanced #虛擬IP會被均勻分配給以上節點 </role>
在monitor節點上(node5)配置/etc/mysql-mmm/mmm_mon.conf:
[root@node5 ~]# vim /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.1.106,192.168.1.126,192.168.1.127,192.168.1.131 #被監控的服務器IP地址 auto_set_online 60 </monitor> <host default> monitor_user mmm_monitor #監控用戶 monitor_password mmm_monitor #監控用戶密碼 </host> debug 0
在各個被監控節點上配置mmm_agent.conf(如果是db2則最後行爲this db2,對應於mmm_common.conf文件中的配置)
[root@node1 mysql-mmm]# 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 db1
在各個mysql服務器節點上啓動服務:
[root@node1 mysql-mmm]# service mysql-mmm-agent start Starting MMM Agent Daemon: [ OK ]
在monitor上啓動服務:
[root@node5 ~]# service mysql-mmm-monitor start Starting MMM Monitor Daemon: [ OK ]
在monitor節點上查看mysql服務器狀態:
對應節點上的虛擬IP也已經啓用:
指向master1(node1)的從服務器有3臺,現在停止master1上的mysql服務。
[root@node1 ~]# service mysqld stop Shutting down MySQL.. [ OK ]
由圖可見master1已顯示爲offline,且用於寫操作的虛擬IP(192.168.1.200)已轉移至master2上。在master2上查看有多少個從服務器向本機同步數據。
可以看到兩臺從服務器已經指向master2(Master_id爲2),完成部署.................^_^