前言
MMM(Master-Master replication managerfor Mysql,Mysql主主復制管理器)是一套靈活的腳本程序,基于perl實現,用來對mysql replication進行監控和故障遷移,并能管理mysql Master-Master復制的配置(同一時間只有一個節點是可寫的)。
MMM
優缺點
優點:高可用性,擴展性好,出現故障自動切換,對于主主同步,在同一時間只提供一臺數據庫寫操作,保證的數據的一致性。
缺點:Monitor節點是單點,可以結合Keepalived實現高可用。
工作原理
mysql-mmm的監管端會提供多個虛擬IP(VIP),包括一個可寫VIP,多個可讀VIP,通過監管的管理,這些IP會綁定在可用服務器之上,當某一臺服務器宕機時,監管會將VIP遷移至其他服務器。
實現過程
實驗拓撲
#注:系統環境CentOS6.6 #VIP172.16.10.30為可寫VIP,其他三組為可讀VIP #可寫VIP只能在Master之間切換,可讀VIP可在Master和Slave之間切換 #前端應用可連接任意可讀VIP進行數據讀取,連接可寫VIP進行數據寫入
雙主一從配置
DB1配置
[root@node1 ~]# vim /etc/mysql/my.cnf datadir = /mydata/data log-bin=/mydata/binlogs/master-bin #二進制文件位置 relay-log=/mydata/relaylogs/relay-bin #中繼日志位置 binlog_format=mixed server-id = 1 auto_increment_offset=1 #雙主復制中自增長字段的起始值 auto_increment_increment=2 #雙主復制中自增長字段的步長 log_slave_updates = 1 #開啟從庫更新操作寫入二進制日志功能 sync_binlog = 1 #可保證事務日志及時寫入磁盤文件 skip-name-resolve #禁用DNS反向解析,如不寫此項,則需要在各節點基于主機名通信 read_only = 1 [root@node1 ~]# service mysqld start
授權可用復制用戶記錄二進制日志位置
DB2配置
[root@node2 ~]# vim /etc/mysql/my.cnf datadir = /mydata/data log-bin=/mydata/binlogs/master-bin relay-log=/mydata/relaylogs/relay-bin binlog_format=mixed server-id = 11 auto_increment_offset=2 auto_increment_increment=2 log_slave_updates = 1 sync_binlog = 1 skip-name-resolve read_only = 1 [root@node2 ~]# service mysqld start
授權可用復制用戶記錄二進制日志位置
#因為實驗之前都做了完整初始化,這里二進制文件位置一致
DB3配置
[root@scholar ~]# vim /etc/mysql/my.cnf datadir = /mydata/data relay-log=/mydata/relaylogs/relay-bin server-id = 111 read_only = 1 skip-name-resolve [root@scholar ~]# service mysqld start
連接各服務器
DB1連接DB2
DB2連接DB1
DB3連接DB1
主從測試
#DB1創建數據庫 MariaDB [(none)]> create database testdb; Query OK, 1 row affected (0.14 sec) #DB2創建表 MariaDB [(none)]> create table testdb.tb1(name char(20) not null); Query OK, 0 rows affected (0.19 sec) #DB3查看數據 MariaDB [(none)]> show tables in testdb; +------------------+ | Tables_in_testdb | +------------------+ | tb1 | +------------------+ 1 row in set (0.13 sec)
數據一致,主從復制部分完成
MMM配置
安裝所需程序包
[root@node1 ~]# yum install mysql-mmm* -y #在所有節點安裝mysql-mmm包組
授權監控及代理用戶
#DB節點全部需要授權,在一個節點授權即可
Monitor配置
[root@scholar ~]# vim /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 repluser #復制用戶 replication_password replpass #復制用戶密碼 agent_user mmm_agent #代理用戶 agent_password agent_passw #代理用戶密碼 </host> <host db1> ip 172.16.10.123 mode master peer db2 </host> <host db2> ip 172.16.10.124 mode master peer db1 </host> <host db3> ip 172.16.10.125 mode slave </host> <role writer> #可寫節點 hosts db1, db2 ips 172.16.10.30 mode exclusive #互斥角色只有一個ip,同一時間只能分配給一個主機 </role> <role reader> #可讀節點 hosts db1, db2, db3 ips 172.16.10.31,172.16.10.32,172.16.10.33 mode balanced #負載均衡角色可以有多個IP,這些IP被均衡的分配給多個主機 </role>
#將以上文件同步到DB1-DB3節點 [root@scholar ~]# scp /etc/mysql-mmm/mmm_common.conf 172.16.10.123:/etc/mysql-mmm/ mmm_common.conf 100% 776 0.8KB/s 00:00 [root@scholar ~]# scp /etc/mysql-mmm/mmm_common.conf 172.16.10.124:/etc/mysql-mmm/ mmm_common.conf 100% 776 0.8KB/s 00:00 [root@scholar ~]# scp /etc/mysql-mmm/mmm_common.conf 172.16.10.125:/etc/mysql-mmm/ mmm_common.conf 100% 776 0.8KB/s 00:00
[root@scholar ~]# 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 172.16.10.123,172.16.10.124,172.16.10.125 #監控主機 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 monitor_pass #監控密碼 </host> debug 0
DB1-DB3配置
[root@node1 ~]# 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 #DB1-DB3根據自身實際角色修改此配置文件(db1,db2,db3)
啟動服務
#在各監控節點啟動mmm-agent服務 [root@node1 ~]# service mysql-mmm-agent start Starting MMM Agent Daemon: [ OK ] #在Monitor上啟動mmm-monitor服務 [root@scholar ~]# service mysql-mmm-monitor start Starting MMM Monitor Daemon: [ OK ]
查看當前狀態
查看各節點VIP狀態
#以db1為例
高可用測試
模擬db1故障,查看節點狀態
再看db1的VIP狀態
VIP已被轉移到其他節點,其他方面有興趣請自行測試,這里就不一一展示了
The end
MySQL/MariaDB基于MMM實現讀寫分離及高可用實驗就先說到這里了,有興趣的朋友可以繼續探究基于Keepalived實現Monitor的高可用,這里就不做深究了,實驗過程中遇到問題可留言交流。以上僅為個人學習整理,如有錯漏,大神勿噴~~~
原創文章,作者:書生,如若轉載,請注明出處:http://www.www58058.com/5598
寫的很詳細,我說一下我在配置的過程中遇到的一個很低級的問題吧:
配置文件中:
mode exclusive
mode balanced
monitor_user mmm_monitor
monitor_password monitor_pass
這些參數后邊不能加“#”做注釋的,否則會有問題,可以用 mmm_control checks 檢查一下。