MySQL - MMM 實現 MySQL 高可用
-
MMM (Master-Master replication manager for MySQL,MySQL 主主復制管理器)是一套支持雙主故障切換和雙主日常管理的腳本程序。MMM 使用 Perl 語言開發,主要用來監控和管理 MySQL Master-Master(雙主)復制,雖然也叫雙主復制,但是業務上同一時刻只允許對一個主進行寫入,另一臺備選主上提供部分讀服務,以加速在主主切換時備選主的預熱,可以說 MMM 這套腳本程序一方面實現了故障切換的功能,另一方面其內部附加的工具腳本也可以實現多個 Slave 的 read 負載均衡。
-
MMM提供了自動和手動兩種方式移除一組服務器中復制延遲較高的服務器的虛擬 ip,同時它還可以備份數據,實現兩節點之間的數據同步等。由於 MMM 無法完全保證數據的一致性,所以 MMM 適用於對數據的一致性要求不是很高,但是又想最大程度的保證業務可用性的場景。對於那些對數據的一致性要求很高的業務,非常不建議采用 MMM 這種高可用架構。
- 關於 MMM 高可用架構的說明如下:
mmm_mon:監控進程,負責所有的監控工作,決定和處理所有節點角色活動。此腳本需要在監管機上運行。
mmm_agent:運行在每個 MySQL 服務器上的代理進程,完成監控的探針工作和執行簡單的遠端服務shezhi.cijiaoben需要在被監管機上運行。
mmm_control:一個簡單的腳本,提供管理 mmm_mond 進程的命令。
mysql-mmm 的監管端會提供多個虛擬 IP (VIP),包括一個可寫 VIP,多個可讀 VIP,通過監管的管理,這些 IP 會綁定在可用 MySQL 之上,當某一臺 MySQL 宕機時,監管會將 VIP 遷移至其他 MySQL。
部署環境
主機 | 操作系統 | IP地址 | VIP地址 |
---|---|---|---|
mysql-m1主服務器 | CentOS 7.4 x86_64 | 192.168.100.200 | 192.168.100.100(Writer) |
mysql-m2主服務器 | CentOS 7.4 x86_64 | 192.168.100.201 | 192.168.100.100(Writer) |
mysql-monitor | CentOS 7.4 x86_64 | 192.168.100.204 | |
mysql-m3從服務器 | CentOS 7.4 x86_64 | 192.168.100.202 | 192.168.100.101(Reader) |
mysql-m4從服務器 | CentOS 7.4 x86_64 | 192.168.100.203 | 192.168.100.102(Reader) |
開始部署
- 安裝所需軟件包,修改配置文件(四臺MySQL服務器操作一致)
-
搭建ALI雲源,安裝epel-release源。
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo #下載ALI雲源 yum -y install epel-release #安裝epel-release源 yum clean all && yum makecache #清空緩存,生成新的緩存文件
-
安裝 MariaDB 數據庫,開啟服務(和MySQL同源,搭建步驟相同)
yum -y install mariadb-server mariadb systemctl stop firewalld.service setenforce 0 systemctl start 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=1 log_slave_updates=true #開啟同步 sync_binlog=1 auto_increment_increment=2 auto_increment_offset=1 # scp /etc/my.cnf [email protected]:/etc # scp /etc/my.cnf [email protected]:/etc # scp /etc/my.cnf [email protected]:/etc # 註:另外三臺主機的配置文件裏的server_id要做修改,保證不一致即可
- 配置主主復制(m1和m2兩臺主服務器互相同步)
-
查看對方的日誌文件名稱和偏移值
mysql> show master status;
-
主服務器互相提升訪問權限(m1、m2服務器分別執行)
# mysql-m1 grant replication slave on *.* to ‘replication‘@‘172.168.100.%‘ identified by ‘123456‘; # 使用賬戶為replication 密碼為123456 change master to master_host=‘172.168.100.201‘,master_user=‘replication‘,master_password=‘123456‘,master_log_file=‘mysql_bin.000003‘,master_log_pos=245; # 當在MariaDB-m1上執行時,master_host地址為MariaDB-m2地址 ··· # mysql-m2 grant replication slave on *.* to ‘replication‘@‘172.168.100.%‘ identified by ‘123456‘; change master to master_host=‘172.168.100.200‘,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; # Slave_IO_Running: Yes # Slave_SQL_Running: Yes
-
配置m3、m4服務器作為從服務器
show master status; # 查看m1服務器的日誌文件以及偏移值(註意日誌文件和偏移值的改變) # m1和m2互相同步,在此只需執行m1即可 change master to master_host=‘172.168.100.200‘,master_user=‘replication‘,master_password=‘123456‘,master_log_file=‘mysql_bin.000004‘,master_log_pos=245; # m3和m4上分別執行
-
分別查看m3和m4的主從狀態
start slave; show slave status\G; # Slave_IO_Running: Yes # Slave_SQL_Running: Yes
-
安裝配置MMM架構
前面我們使用wget配置了ALI雲源並簡易安裝 MariaDB 來代替 MySQL ,並搭建了主主同步,主從復制以便完成實驗,現在我們來完成MMM架構 -
安裝mysql-mmm,修改配置文件(五臺主機配置相同)
# yum -y install mysql-mmm* //前面我們配置了epel源,直接yum安裝 # 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.168.100.200 mode master peer db2 </host> <host db2> ip 172.168.100.201 mode master peer db1 </host> <host db3> ip 172.168.100.202 mode slave </host> <host db4> ip 172.168.100.203 mode slave </host> <role writer> hosts db1, db2 ips 172.168.100.100 mode exclusive </role> <role reader> hosts db3, db4 ips 172.168.100.101, 172.168.100.102 mode balanced </role>
-
快速為其他主機修改配置文件
scp mmm_common.conf [email protected]:/etc/mysql-mmm/ scp mmm_common.conf [email protected]:/etc/mysql-mmm/ scp mmm_common.conf [email protected]:/etc/mysql-mmm/ scp mmm_common.conf [email protected]:/etc/mysql-mmm/
-
在主機上修改mmm_agent.conf文件的名稱
# vim /etc/mysql-mmm/mmm_agent.conf this db1 //按照規劃分別修改為db1、db2、db3、db4
-
在所有主機上對mmm_agent、mmm_moniter進行授權
mysql> grant super, replication client, process on *.* to ‘mmm_agent‘@‘192.168.100.%‘ identified by ‘123456‘; mysql> grant replication client on *.* to ‘mmm_monitor‘@‘192.168.100.%‘ identified by ‘123456‘; # flush privileges; //重新加載權限表
-
配置監控主機(在mysql-monitor上配置)
# 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.168.100.200,172.168.100.201,172.168.100.202,172.168.100.203 auto_set_online 10 #上線時間修改為10s # 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 check all # 檢查監控服務器對所有主機的監控是否完善 # 檢查結果全部OK,則部署完成
至此,MySQL-MMM已經部署成功,進一步的話,我們可以結合Amoeba實現讀寫分離,Writer 的虛擬VIP可以寫入數據庫,而 Reader 可以用來讀取數據。並通過Keepalived對 monitor 服務器進行雙機熱備。
MySQL - MMM 實現 MySQL 高可用