什麼是MMM?
MMM(MySQL主主複製管理器)是一套支持雙主故障切換和雙主日常管理的腳本程序。MMM使用Perl語言開發,主要用來監控和管理MySQL Master-Master(雙主)複製,雖然叫做雙主複製,但是業務上同一時刻只允許對一個主進行寫入,另一臺備選主上提供部分讀服務,以加速在主主切換時備選主的預熱,可以說MMM這套腳本程序一方面實現了故障切換的功能,另一方面其內部附加的工具腳本也可以實現多個Slave的read負載均衡。
MMM提供了自動和手動兩種方式移除一組服務器中複製延遲較高的服務器的虛擬IP,同時它還可以備份數據,實現兩節點之間的數據同步等。由於MMM無法完全保證數據的一致性,所以MMM適用於對數據的一致性要求不是很高,但是又想最大程度地保證業務可用性的場景。對於那些數據一致性要求很高的業務,非常不建議採用MMM這種高可用架構。
MMM是一套靈活的腳本程序,基於perl實現,用來對mysql replication進行監控和故障遷移,並能管理MySQL Master-Master複製的配置。
關於MMM高可用架構的說明如下
- mmm_mon:監控進程,負責所有的監控工作,決定和處理所有節點角色活動。此腳本需要在監管機上面運行
- mmm_agent:運行在每個MySQL服務器上的代理進程,完成監控的探針工作和執行簡單的遠端服務設置。此腳本需要在監管機上面運行
- mmm_control:一個簡單的腳本,提供mmm_mond進程的命令
- mysql_mmm的監管端會提供多個虛擬IP(VIP),包括一個可寫VIP,多個可讀VIP,通過監管的管理。這些IP會綁定在可用MySQL之上,當某一臺MySQL宕機時,監管會將VIP遷移至其他MySQL。
在整個監管過程中,需要在MySQL中添加相關授權用戶,以便讓MySQL可以支持監理機的維護。授權的用戶包括一個mmm_monitor用戶和一個mmm_agent用戶,如果想使用MMM的備份工具則還要添加一個mmm_tools用戶。
什麼是MariaDB數據庫?
MariaDB數據庫管理系統是MySQL的一個分支,主要由開源社區在維護,採用GPL授權許可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能輕鬆成爲MySQL的代替品。在存儲引擎方面,使用XtraDB來代替MySQL的InnoDB。MariaDB基於事務的Maria存儲引擎,替換了MySQL的MyISAM存儲引擎,它使用了Percona的 XtraDB,InnoDB的變體,分支的開發者希望提供訪問即將到來的MySQL 5.4 InnoDB性能。這個版本還包括了 PrimeBase XT (PBXT) 和 FederatedX存儲引擎。
項目環境
本次項目使用五臺centos7服務器模擬搭建
主機 | 操作系統 | IP地址 | VIP | 主要軟件 |
---|---|---|---|---|
MariaDB-m1 主服務器 | CentOS-7-x86_64 | 172.16.10.23 | 172.16.10.100 | MariaDB、MMM |
MariaDB-m2 主服務器 | CentOS-7-x86_64 | 172.16.10.20 | 172.16.10.100 | MariaDB、MMM |
MariaDB-m3 從服務器 | CentOS-7-x86_64 | 172.16.10.24 | 172.16.10.110 | MariaDB、MMM |
MariaDB-m4 從服務器 | CentOS-7-x86_64 | 172.16.10.22 | 172.16.10.120 | MariaDB、MMM |
MariaDB-monitor | CentOS-7-x86_64 | 172.16.10.21 | MMM |
搭建MariaDB多主多從模式
安裝MariaDB
配置ALI雲源,安裝epel-release源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum -y install epel-release
yum clean all && yum makecache //清空所有,重新更新元數據緩存
配置epel源須在五臺服務器上都操作
安裝mariadb
yum -y install mariadb-server mariadb
關閉防火牆及selinux防火牆
systemctl disable firewalld.service
systemctl stop firewalld.service
setenforce 0
以上三個步驟在另外三臺數據庫服務器上一摸一樣,重複三遍
配置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 //mysql,information_schema這兩個數據庫不生成二進制日誌文件
character_set_server=utf8
log_bin=mysql_bin //二進制日誌文件功能開啓
server_id=10 //id每臺都不相同
log_slave_updates=true //開啓同步
sync_binlog=1 //1爲安全值
auto_increment_increment=2
auto_increment_offset=1
開啓服務
systemctl start mariadb //開啓服務
netstat -anpt | grep 3306 //查看服務狀態
配置文件修改時,只需將原有的[mysqld]直接刪除,大約九行。替換爲以上內容,四臺服務器(MariaDB-m1、MariaDB-m2、MariaDB-m3、MariaDB-m4)的修改方法基本一致,唯一的不同是server_id不可相同,只要不同即可。
配置MariaDB-m1、MariaDB-m2主主模式
- 先查看log bin日誌和pos值的位置
在MariaDB-m1、MariaDB-m2中分別進行操作mysql //登陸數據庫 show master status;
- MariaDB-m1、MariaDB-m2互相提升訪問權限
在兩臺主服務器上分別執行#MariaDB-m1 grant replication slave on *.* to 'replication'@'172.16.10.%' identified by '123456'; //使用賬戶爲replication 密碼爲123456 change master to master_host='172.16.10.20',master_user='replication',master_password='123456',master_log_file='mysql_bin.000003',master_log_pos=245; //當在MariaDB-m1上執行時,master_host地址爲MariaDB-m2地址 ··· #MariaDB-m2 grant replication slave on *.* to 'replication'@'172.16.10.%' identified by '123456'; //在兩臺master上分別執行,slave不需要執行 change master to master_host='172.16.10.23',master_user='replication',master_password='123456',master_log_file='mysql_bin.000003',master_log_pos=245; //當在MariaDB-m2上執行時,master_host地址爲MariaDB-m1地址
- 開啓同步,同時查看服務器的主從狀態
Slave_IO_Running: Yes、Slave_SQL_Running: Yes這兩個條目的結果,必須爲yesstart slave; show slave status\G;
測試主主同步是否成功
在主服務器上創建一個庫,然後查看從服務器上是否有新創建的庫,若新創建庫存在;則再嘗試在從服務器上刪除新創建的庫,若是此時主服務器上的庫被成功刪除,則表示主主複製創建成功。
配置MariaDB-m3、MariaDB-m4作爲MariaDB-m1的從服務器
在MariaDB-m3、MariaDB-m4上進行操作
- 查看MariaDB-m1上log bin日誌和pos值的位置
mysql show master status;
注意日誌文件和位置參數的改變
- 在MariaDB-m3、MariaDB-m4上分別執行
change master to master_host='172.16.10.23',master_user='replication',master_password='123456',master_log_file='mysql_bin.000004',master_log_pos=245;
- 分別查看MariaDB-m3、MariaDB-m4上主從狀態
start slave; show slave status\G;
安裝配置MMM
安裝MMM
我們在最開始的操作中已經對所有的五臺服務器都安裝了epel源,所以這裏只需要使用yum安裝即可,所有的服務器都需安裝mysql-mmm*
yum -y install mysql-mmm*
配置MMM
五臺服務器中的該配置文件都是相同的
vim /etc/mysql-mmm/mmm_common.conf active_master_role writer <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> <host db1> ip 172.16.10.23 mode master peer db2 </host> <host db2> ip 172.16.10.20 mode master peer db1 </host> <host db3> ip 172.16.10.24 mode slave </host> <host db4> ip 172.16.10.22 mode slave </host> <role writer> hosts db1, db2 ips 172.16.10.100 mode exclusive </role> <role reader> hosts db3, db4 ips 172.16.10.110, 172.16.10.120 mode balanced </role> </host> <host db4> ip 172.16.10.22 mode slave </host> <role writer> hosts db1, db2 ips 172.16.10.100 mode exclusive </role> <role reader> hosts db3, db4 ips 172.16.10.110, 172.16.10.120 mode balanced </role>
快速爲其他服務器修改配置文件
scp /etc/mysql-mmm/mmm_common.conf [email protected]:/etc/mysql-mmm/
scp /etc/mysql-mmm/mmm_common.conf [email protected]:/etc/mysql-mmm/
scp /etc/mysql-mmm/mmm_common.conf [email protected]:/etc/mysql-mmm/
scp /etc/mysql-mmm/mmm_common.conf [email protected]:/etc/mysql-mmm/
在數據庫主機上修改/etc/mysql-mmm/mmm_agent.conf文件,根據不同主機,修改不同的名稱
vim /etc/mysql-mmm/mmm_agent.conf
this db1 //按着順序分別修改爲db1、db2、db3、db4
對所有數據庫服務器進行一波安排
- 在所有數據庫上爲mmm_agent授權
grant super, replication client, process on *.* to 'mmm_agent'@'172.16.10.%' identified by '123456';
- 在所有數據庫上爲mmm_moniter授權
grant replication client on *.* to 'mmm_monitor'@'172.16.10.%' identified by '123456';
- 重新加載權限表
flush privileges;
- 在所有數據庫服務器上啓動mysql-mmm-agent
systemctl start mysql-mmm-agent.service //開啓服務 systemctl enable mysql-mmm-agent.service //加入開機自啓動
配置監控主機
在監控主機(MariaDB-monitor)上修改/etc/mysql-mmm/mmm_mon.conf文件
vim /etc/mysql-mmm/mmm_mon.conf include mmm_common.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 172.16.10.23,172.16.10.20,172.16.10.24,172.16.10.22 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
關閉防火牆及selinux防火牆
systemctl disable firewalld.service
systemctl stop firewalld.service
setenforce 0
啓動服務,查看各節點狀態
systemctl start mysql-mmm-monitor.service
ERROR: Can't connect to monitor daemon!,如若出現報錯,可嘗試重啓服務解決
查看監控服務器對所有數據庫的監控是否完善
mmm_control checks all //檢查結果需爲全部ok
故障測試
停止m1,查看VIP是否爲漂移到m2上
systemctl stop mariadb.service //關閉m1
systemctl start mariadb.service //開啓m1 主不會搶佔
停止m3,查看VIP漂移狀態
systemctl stop mariadb.service //關閉m3
systemctl start mariadb.service //開啓m3,VIP會重新回到各自服務器上