MMM(MySQL主主複製管理器)是一套支持雙主故障切換和雙主平常管理的腳本程序。MMM使用Perl語言開發,主要用來監控和管理MySQL Master-Master(雙主)複製,雖然叫作雙主複製,可是業務上同一時刻只容許對一個主進行寫入,另外一臺備選主上提供部分讀服務,以加速在主主切換時備選主的預熱,能夠說MMM這套腳本程序一方面實現了故障切換的功能,另外一方面其內部附加的工具腳本也能夠實現多個Slave的read負載均衡。mysql
MMM提供了自動和手動兩種方式移除一組服務器中複製延遲較高的服務器的虛擬IP,同時它還能夠備份數據,實現兩節點之間的數據同步等。因爲MMM沒法徹底保證數據的一致性,因此MMM適用於對數據的一致性要求不是很高,可是又想最大程度地保證業務可用性的場景。對於那些數據一致性要求很高的業務,很是不建議採用MMM這種高可用架構。linux
MMM是一套靈活的腳本程序,基於perl實現,用來對mysql replication進行監控和故障遷移,並能管理MySQL Master-Master複製的配置。sql
關於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數據庫管理系統是MySQL的一個分支,主要由開源社區在維護,採用GPL受權許可 MariaDB的目的是徹底兼容MySQL,包括API和命令行,使之能輕鬆成爲MySQL的代替品。在存儲引擎方面,使用XtraDB來代替MySQL的InnoDB。MariaDB基於事務的Maria存儲引擎,替換了MySQL的MyISAM存儲引擎,它使用了Percona的 XtraDB,InnoDB的變體,分支的開發者但願提供訪問即將到來的MySQL 5.4 InnoDB性能。這個版本還包括了 PrimeBase XT (PBXT) 和 FederatedX存儲引擎。vim
本次項目使用五臺centos7服務器模擬搭建centos
主機 | 操做系統 | 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 |
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源須在五臺服務器上都操做緩存
yum -y install mariadb-server mariadb
systemctl disable firewalld.service systemctl stop firewalld.service setenforce 0
以上三個步驟在另外三臺數據庫服務器上一摸同樣,重複三遍安全
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-m一、MariaDB-m二、MariaDB-m三、MariaDB-m4)的修改方法基本一致,惟一的不一樣是server_id不可相同,只要不一樣便可。服務器
mysql //登錄數據庫 show master status;
#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地址
start slave; show slave status\G;
在主服務器上建立一個庫,而後查看從服務器上是否有新建立的庫,若新建立庫存在;則再嘗試在從服務器上刪除新建立的庫,如果此時主服務器上的庫被成功刪除,則表示主主複製建立成功。架構
在MariaDB-m三、MariaDB-m4上進行操做
mysql show master status;
注意日誌文件和位置參數的改變
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;
start slave; show slave status\G;
咱們在最開始的操做中已經對全部的五臺服務器都安裝了epel源,因此這裏只須要使用yum安裝便可,全部的服務器都需安裝mysql-mmm*
yum -y install mysql-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 root@172.16.10.20:/etc/mysql-mmm/ scp /etc/mysql-mmm/mmm_common.conf root@172.16.10.24:/etc/mysql-mmm/ scp /etc/mysql-mmm/mmm_common.conf root@172.16.10.22:/etc/mysql-mmm/ scp /etc/mysql-mmm/mmm_common.conf root@172.16.10.21:/etc/mysql-mmm/
vim /etc/mysql-mmm/mmm_agent.conf this db1 //按着順序分別修改成db一、db二、db三、db4
grant super, replication client, process on *.* to 'mmm_agent'@'172.16.10.%' identified by '123456';
grant replication client on *.* to 'mmm_monitor'@'172.16.10.%' identified by '123456';
flush privileges;
systemctl start mysql-mmm-agent.service //開啓服務 systemctl enable mysql-mmm-agent.service //加入開機自啓動
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
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
systemctl stop mariadb.service //關閉m1
systemctl start mariadb.service //開啓m1 主不會搶佔
systemctl stop mariadb.service //關閉m3
systemctl start mariadb.service //開啓m3,VIP會從新回到各自服務器上