您好,登錄后才能下訂單哦!
MMM介紹
MMM(Master-Master replication manager for MySQL)是一套支持雙主故障切換和雙主日常管理的腳本程序。MMM使用Perl語言開發,主要用來監控和管理MySQL Master-Master(雙主)復制,雖然叫做雙主復制,但是業務上同一時刻只允許對一個主進行寫入,另一臺備選主上提供部分讀服務,以加速在主主切換時刻備選主的預熱,可以說MMM這套腳本程序一方面實現了故障切換的功能,另一方面其內部附加的工具腳本也可以實現多個slave的read負載均衡。
MMM提供了自動和手動兩種方式移除一組服務器中復制延遲較高的服務器的虛擬ip,同時它還可以備份數據,實現兩節點之間的數據同步等。由于MMM無法完全的保證數據一致性,所以MMM適用于對數據的一致性要求不是很高,但是又想最大程度的保證業務可用性的場景。對于那些對數據的一致性要求很高的業務,非常不建議采用MMM這種高可用架構。
MySQL-MMM優缺點
優點:高可用性,擴展性好,出現故障自動切換,對于主主同步,在同一時間只提供一臺數據庫寫操作,保證的數據的一致性。
缺點:Monitor節點是單點,可以結合Keepalived實現高可用。
MySQL-MMM工作原理
MMM(Master-Master replication managerfor Mysql,Mysql主主復制管理器)是一套靈活的腳本程序,基于perl實現,用來對mysql replication進行監控和故障遷移,
并能管理mysql Master-Master復制的配置(同一時間只有一個節點是可寫的)。
mmm_mond:監控進程,負責所有的監控工作,決定和處理所有節點角色活動。此腳本需要在監管機上運行。
mmm_agentd:運行在每個mysql服務器上(Master和Slave)的代理進程,完成監控的探針工作和執行簡單的遠端服務設置。此腳本需要在被監管機上運行。
mmm_control:一個簡單的腳本,提供管理mmm_mond進程的命令。
mysql-mmm的監管端會提供多個虛擬IP(VIP),包括一個可寫VIP,多個可讀VIP,通過監管的管理,這些IP會綁定在可用mysql之上,當某一臺mysql宕機時,監管會將VIP遷移
至其他mysql。在整個監管過程中,需要在mysql中添加相關授權用戶,以便讓mysql可以支持監理機的維護。授權的用戶包括一個mmm_monitor用戶和一個mmm_agent用戶,如果
想使用mmm的備份工具則還要添加一個mmm_tools用戶。
實驗基本環境
實驗系統:CentOS 7_x86_64
實驗前提:防火墻和selinux都關閉!
實驗說明:本實驗共有5臺主機,IP分配如表
實驗軟件:mariadb mysql-mmm mysql-mmm-monitor mysql-mmm-agent
功能,IP地址與別名分配表
功能 | IP | id |
主服務器一 | 192.168.137.10 | M1 |
主服務器二 | 192.168.137.11 | M2 |
從服務器一 | 192.168.137.12 | s1 |
從服務器二 | 192.168.137.13 | s2 |
mmm監控 | 192.168.137.14 | mo |
實驗描述拓撲圖
操作!
所有機器中!
關閉所有機器的防火墻和安全策略 systemctl stop firewalld.service setenforce 0獲取阿里云的yum基礎配置 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 安裝epel源 yum -y install epel-release 清空yum緩存,重新建立元數據 yum clean all && yum makecache 安裝mariadb,MMM的客戶端和服務端 yum install mariadb-server mariadb –y yum install mysql-mmm* -y
M1中
修改m1配置文件,配置mariadb # vim /etc/my.cnf 替換以下內容[mysqld] log_error=/var/lib/mysql/mysql.err log=/var/lib/mysql/mysql_log.log log_slow_queries=/var/lib/mysql_slow_queris.log binlog-ignore-db=mysql,information_schema character_set_server=utf8 log_bin=mysql_bin server_id=1log_slave_updates=true //允許slave更新日志 sync_binlog=1auto_increment_increment=2 auto_increment_offset=1 啟動服務 systemctl start mariadb.service
使用scp命令把my.cnf這個配置文件同步復制到其他的三臺mysql主機上,除了監控機器MO。 scp /etc/my.cnf root@192.168.137.11:/etc/ scp /etc/my.cnf root@192.168.137.12:/etc/ scp /etc/my.cnf root@192.168.137.13:/etc/ 務必單獨修改每臺機器/etc/my.cnf中 server_id=1這里M2改成了 server_id=2以此類推
逐個驗證時候成功安裝
[root@cent ~]# mysql Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 2Server version: 5.5.60-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]>
主從復制,主主復制
M1,M2中
查看日志以及位置參數 MariaDB [(none)]> show master status; 兩臺得出的結果是相同的 MariaDB [(none)]> show master status; +------------------+----------+--------------+--------------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+--------------------------+ | mysql_bin.000003 | 245 | | mysql,information_schema | +------------------+----------+--------------+--------------------------+ 1 row in set (0.00 sec) M1,M2互相授權 M1,M2: MariaDB [(none)]> grant replication slave on *.* to 'replication'@'192.168.137.%' identified by '123456'; 同步 M1: change master to master_host='192.168.137.11',master_user='replication',master_password='123456',master_log_file='mysql_bin.000003',master_log_pos=245; M2: change master to master_host='192.168.137.10',master_user='replication',master_password='123456',master_log_file='mysql_bin.000003',master_log_pos=245;
S1,S2中的同步,這里都以M1為同步對象。
change master to master_host='192.168.137.10',master_user='replication',master_password='123456',master_log_file='mysql_bin.000003',master_log_pos=245; flush privileges; //刷新
驗證salve
啟動salve MariaDB [(none)]> start slave; Query OK, 0 rows affected (0.00 sec) 查看slave狀態 MariaDB [(none)]> show slave status\G 看到這兩項為yes即成功 Slave_IO_Running: Yes Slave_SQL_Running: Yes
配置MMM
隨便一臺機器
修改如下
vim /etc/mysql-mmm/mmm_common.conf <host default> cluster_interface ens33 //修改網卡名稱 pid_path /run/mysql-mmm-agent.pid bin_path /usr/libexec/mysql-mmm/ replication_user replication replication_password 123456 //密碼 agent_user mmm_agent agent_password 123456 //密碼 <host db1> ip 192.168.137.10 //M1地址 mode master peer db2 //指向M2 </host> <host db2> ip 192.168.137.11 //M2地址 mode master peer db1 //指向M1 </host> <host db3> ip 192.168.137.12 //S1地址 mode slave </host> <host db4> ip 192.168.137.13 //S2地址 mode slave </host> <role writer> hosts db1, db2 //M1與M2 ips 192.168.137.100 //M1與M2共同虛擬一個IP mode exclusive </role> <role reader> hosts db3, db4 //S1與S2 ips 192.168.137.200, 192.168.137.150 //S1,S2的虛擬IP mode balanced</role> 復制到其他四臺主機,包括MO監控機 scp /etc/mysql-mmm/mmm_common.conf root@192.168.137.11:/etc/mysql-mmm/
MO監控機操作
vim /etc/mysql-mmm/mmm_mon.conf 修改如下<monitor> ip 127.0.0.1 pid_path /run/mysql-mmm-monitor.pid bin_path /usr/libexec/mysql-mmm status_path /var/lib/mysql-mmm/mmm_mond.status ping_ips 192.168.137.10,192.168.137.11,192.168.137.12,192.168.137.13,192.168.137.14//列出所有數據庫IP auto_set_online 10 //鏈接等待時間 # 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
再MySQL中給MMM授權,每臺機器都要。
grant super, replication client,process on *.* to 'mmm_agent'@'192.168.137.%' identified by '123456'; grant replication client on *.* to 'mmm_monitor'@'192.168.137.%' identified by '123456'; flush privileges; //刷新
更新每臺機器的server名,不能相同,我設置了12345。
vim /etc/mysql-mmm/mmm_agent.conf 修改如下 this db1
設置五臺!
啟動服務
M1,M2,S1,S2啟動agent systemctl start mysql-mmm-agent.service systemctl enable mysql-mmm-agent.service 監控機啟動監控服務 systemctl start mysql-mmm-monitor.service
監控服務的查驗,如下一切正常!
查看被監控的主機 [root@zcent4 mysql-mmm]# mmm_control show db1(192.168.137.10) master/ONLINE. Roles: writer(192.168.137.100) db2(192.168.137.11) master/ONLINE. Roles: db3(192.168.137.12) slave/ONLINE. Roles: reader(192.168.137.200) db4(192.168.137.13) slave/ONLINE. Roles: reader(192.168.137.150) 切換虛擬ip綁定的主機 [root@zcent4 mysql-mmm]# mmm_control move_role writer db2 OK: Role 'writer' has been moved from 'db1' to 'db2'. Now you can wait some time and check new roles info![root@zcent4 mysql-mmm]# mmm_control show db1(192.168.137.10) master/ONLINE. Roles: db2(192.168.137.11) master/ONLINE. Roles: writer(192.168.137.100) db3(192.168.137.12) slave/ONLINE. Roles: reader(192.168.137.200) db4(192.168.137.13) slave/ONLINE. Roles: reader(192.168.137.150) 檢測監控功能完善性 [root@zcent4 mysql-mmm]# mmm_control checks alldb4 ping [last change: 2018/09/07 23:02:12] OK db4 mysql [last change: 2018/09/07 23:03:06] OK db4 rep_threads [last change: 2018/09/07 23:11:57] OK db4 rep_backlog [last change: 2018/09/07 23:11:52] OK: Backlog is nulldb2 ping [last change: 2018/09/07 22:57:09] OK db2 mysql [last change: 2018/09/07 22:57:09] OK db2 rep_threads [last change: 2018/09/07 22:57:09] OK db2 rep_backlog [last change: 2018/09/07 22:57:09] OK: Backlog is nulldb3 ping [last change: 2018/09/07 23:02:09] OK db3 mysql [last change: 2018/09/07 23:02:50] OK db3 rep_threads [last change: 2018/09/07 23:11:42] OK db3 rep_backlog [last change: 2018/09/07 23:11:36] OK: Backlog is nulldb1 ping [last change: 2018/09/07 22:57:09] OK db1 mysql [last change: 2018/09/07 22:57:09] OK db1 rep_threads [last change: 2018/09/07 22:57:09] OK db1 rep_backlog [last change: 2018/09/07 22:57:09] OK: Backlog is null
故障測試!
首先M1,M2授權給測試機器
MariaDB [(none)]> grant all on *.* to 'testdb'@'192.168.137.14' identified by '123456'; Query OK, 0 rows affected (0.01 sec) MariaDB [(none)]> flush privileges; Query OK, 0 rows affected (0.00 sec)
用監控機當客戶機測試,成功登陸
[root@zcent4 mysql-mmm]# mysql -utestdb -p123456 -h 192.168.137.100 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 2430Server version: 5.5.60-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]>
客戶機創建數據庫,使用主服務器查看
客戶機: MariaDB [(none)]> create database teest; Query OK, 1 row affected (0.00 sec) M1: MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mood | | mysql | | performance_schema | | teest | | test | +--------------------+ 6 rows in set (0.00 sec)
模擬M2掉線,查看是否自動切換主服務器的虛擬IP
M2: [root@cent ~]# systemctl stop mariadb.service 監控機: [root@zcent4 mysql-mmm]# mmm_control show db1(192.168.137.10) master/ONLINE. Roles: writer(192.168.137.100) db2(192.168.137.11) master/HARD_OFFLINE. Roles: db3(192.168.137.12) slave/ONLINE. Roles: reader(192.168.137.200) db4(192.168.137.13) slave/ONLINE. Roles: reader(192.168.137.150)
顯然是可以的!讀寫復制正常
上線M2,但是注意!M2并不會搶占,不帶這個功能!
模擬S2掉線,觀察情況
S2:[root@cent ~]# systemctl stop mariadb.service 監控機:[root@zcent4 mysql-mmm]# mmm_control show db1(192.168.137.10) master/ONLINE. Roles: writer(192.168.137.100) db2(192.168.137.11) master/ONLINE. Roles: db3(192.168.137.12) slave/ONLINE. Roles: reader(192.168.137.150), reader(192.168.137.200) db4(192.168.137.13) slave/HARD_OFFLINE. Roles: 實行了頂替,期間讀寫復制正常
總結
1.monitor程序負責監控db服務器的狀態,包括Mysql數據庫、服務器是否運行、復制線程是否正常、主從延時等;它還用于控制agent程序處理故障。 2.如果master-db1主庫宕機,master-db2復制應用又落后于master-db1時就變成了主可寫狀態,這時的數據主無法保證一致性。 3.monitor會每隔幾秒鐘監控db服務器的狀態,如果db服務器已經從故障變成了正常,那么monitor會自動在60s之后將其設置為online狀態 (默認是60s可以設為其它的值),我上面改成了10. 4.實驗過程中遇到從服務器無法啟動agent,重啟解決了,原因不詳。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。