MySQL-MMM實現MySQL高可用群集
MMM(Master-Master replication manager for MySQL)是一套支持雙主故障切換和雙主日常管理的腳本程序。MMM使用Perl語言開發,主要用來監控和管理MySQL Master-Master(雙主)復制,雖然叫做雙主復制,但是業務上同一時刻只允許對一個主進行寫入,另一臺備選主上提供部分讀服務,以加速在主主切換時刻備選主的預熱,可以說MMM這套腳本程序一方面實現了故障切換的功能,另一方面其內部附加的工具腳本也可以實現多個slave的read負載均衡。由於MMM無法完全的保證數據一致性,所以MMM適用於對數據的一致性要求不是很高,但是又想最大程度的保證業務可用性的場景。對於那些對數據的一致性要求很高的業務,非常不建議采用MMM這種高可用架構。
MMM工作原理
MMM(Master-Master replication managerfor Mysql,Mysql主主復制管理器)是一套靈活的腳本程序,基於perl實現,用來對mysql replication進行監控和故障遷移,並能管理mysql Master-Master復制配置。如圖所示:
-
mmm_mond:監控進程,負責所有的監控工作,決定和處理所有節點角色活動。此腳本需要在監管機上運行。
-
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用戶。
實驗環境:
準備五臺服務器模擬搭建,環境如表所示:
主機 | 操作系統 | IP地址 | 主要軟件 |
---|---|---|---|
mysql-m1服務器 | CentOS7.4 x86_64 | 192.168.113.160 | MySQL5.7、MySQL-MMM |
mysql-m2服務器 | CentOS7.4 x86_64 | 192.168.113.161 | MySQL5.7、MySQL-MMM |
mysql-m3服務器 | CentOS7.4 x86_64 | 192.168.113.162 | MySQL5.7、MySQL-MMM |
mysql-m4服務器 | CentOS7.4 x86_64 | 192.168.113.165 | MySQL5.7、MySQL-MMM |
mysql-monitor | CentOS7.4 x86_64 | 192.168.113.156 | mariadb、MySQL-MMM |
監控主機也作為客戶端使用
虛擬IP地址(VIP):
IP | Role |
---|---|
192.168.113.100 | writer |
192.168.113.210 | reader |
192.168.113.220 | reader |
實驗操作步驟
所有的主機都關閉防火墻,關閉安全性策略。
sysemctl stop firewalld.service
setenforce 0
1.搭建MySQL多主多從模式
(1)在所有的數據庫服務器上安裝MySQL
安裝步驟詳細參考Linux平臺上安裝MySQL服務。
(2)配置mysql-m1、mysql-m2、mysql-m3、mysql-m4
[root@mysql-m1 ~]# vim /etc/my.cnf
[mysqld] //添加以下內容
binlog-ignore-db=mysql,information_schema //不需要同步的數據庫名稱
character_set_server=utf8
log_bin=mysql_bin //開啟binlog日誌用於主從數據復制
server_id=1 //每臺server-id的值不要相同
log_slave_updates=true //此數據庫宕機,備用數據庫接管
sync_binlog=1 //每條自動更新,安全性高,默認是0
auto_increment_increment=2 //字段一次遞增多少
auto_increment_offset=1 //自增字段的起始值:1,3,5,7...等奇數ID
每臺MySQL主機server-id不能相同,其他配置文件參數相同即可,可以把配置文件復制到其它3臺數據庫服務器上,修改一下server-id就行。
scp /etc/my.cnf [email protected]:/etc/
scp /etc/my.cnf [email protected]:/etc/
scp /etc/my.cnf [email protected]:/etc/
(3)啟動mysql-m1、mysql-m2、mysql-m3、mysql-m4這四臺數據庫服務器
systemctl start mysqld.service
(4)配置mysql-m1、mysql-m2主主模式
1)先查看log bin日誌和pos值的位置
mysql-m1:
[root@mysql-m1 ~]# mysql -uroot -pabc123
mysql> show master status;
+------------------+----------+--------------+--------------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+--------------------------+-------------------+
| mysql_bin.000007 | 154 | | mysql,information_schema | |
+------------------+----------+--------------+--------------------------+-------------------+
1 row in set (0.00 sec)
mysql-m2:
[root@mysql-m2 ~]# mysql -uroot -pabc123
mysql> show master status;
+------------------+----------+--------------+--------------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+--------------------------+-------------------+
| mysql_bin.000013 | 154 | | mysql,information_schema | |
+------------------+----------+--------------+--------------------------+-------------------+
1 row in set (0.01 sec)
2)mysql-m1、mysql-m2互相提升訪問權限,配置同步
mysql-m1:
mysql> grant replication slave on *.* to ‘replication‘@‘192.168.113.%‘ identified by ‘123456‘; //給m2授予從的權限
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges; //刷新數據庫
Query OK, 0 rows affected (0.00 sec)
mysql> change master to
-> master_host=‘192.168.113.161‘,
-> master_user=‘replication‘,
-> master_password=‘123456‘,
-> master_log_file=‘mysql_bin.000013‘,
-> master_log_pos=154; //配置同步
Query OK, 0 rows affected, 2 warnings (0.01 sec)
mysql-m2:
mysql> grant replication slave on *.* to ‘replication‘@‘192.168.113.%‘ identified by ‘123456‘; //給m1授予從的權限
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges; //刷新數據庫
Query OK, 0 rows affected (0.00 sec)
mysql> change master to
-> master_host=‘192.168.113.161‘,
-> master_user=‘replication‘,
-> master_password=‘123456‘,
-> master_log_file=‘mysql_bin.000007‘,
-> master_log_pos=154; //配置同步
Query OK, 0 rows affected, 2 warnings (0.01 sec)
3)分別查看mysql-m1、mysql-m2服務器的主從狀態。
mysql> start slave; //啟動同步
mysql> show slave status\G;
結果如圖所示:
mysql-m1的狀態:
mysql-m2的狀態:
主主同步配置完畢,查看同步狀態Slave_IO和Slave_SQL為YES,說明主主同步成功。
4) 測試主主同步,在mysql-m2新建一個庫kgc。
mysql> create database kgc;
Query OK, 1 row affected (0.01 sec)
回到mysql-m1數據庫服務器,查看剛才創建的庫kgc,同步已經完成。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| kgc |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.09 sec)
(5)配置mysql-m3和mysql-m4作為mysql-m1的從庫。
1)先查看mysql-m1 master的狀態值。
mysql> show master status;
+------------------+----------+--------------+--------------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+--------------------------+-------------------+
| mysql_bin.000007 | 460 | | mysql,information_schema | |
+------------------+----------+--------------+--------------------------+-------------------+
1 row in set (0.00 sec)
2)在mysql-m3和mysql-m4分別執行下面語句,實現主從同步。
mysql> change master to
-> master_host=‘192.168.113.161‘,
-> master_user=‘replication‘,
-> master_password=‘123456‘,
-> master_log_file=‘mysql_bin.000007‘,
-> master_log_pos=460;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
3)分別查看mysql-m3和mysql-m4服務器的主從狀態。
mysql> start slave; //啟動同步
mysql> show slave status\G;
在mysql-m3和mysql-m4可以看到主從配置復制成功。
2.安裝配置MySQL-MMM
(1)安裝MMM
CentOS默認沒有mysql-mmm軟件包,官方推薦使用epel源,五臺主機都要安裝epel源和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
yum -y install mysql-mmm*
(2)在mysql-m1、mysql-m2、mysql-m3、mysql-m4節點授權monitor訪問。
-------------為mmm-agent授權--------------------
mysql> grant super, replication client, process on *.* to ‘mmm_agent‘@‘192.168.113.%‘ identified by ‘123456‘;
-------------為mmm-monitor授權--------------------
mysql> grant replication client on *.* to ‘mmm_monitor‘@‘192.168.113.%‘ identified by ‘123456‘;
(3)修改/etc/mysql-mmm/mmm_common.conf配置文件。
系統中所有主機的配置文件內容都是一樣的,包括監控主機mysql-monitor。
vim /etc/mysql-mmm/mmm_common.conf
……
<host default>
cluster_interface ens33
……
replication_user replication
replication_password 123456
agent_user mmm_agent
agent_password 123456
<host db1>
ip 192.168.113.160 //mysql-m1主機
mode master
peer db2
</host>
<host db2>
ip 192.168.113.161 //mysql-m2主機
mode master
peer db1
</host>
<host db3>
ip 192.168.113.163 //mysql-m3主機
mode slave
</host>
<host db4>
ip 192.168.113.165 //mysql-m4主機
mode slave
</host>
<role writer>
hosts db1, db2
ips 192.168.113.100 //writer 虛擬IP
mode exclusive //只有一個host可以進行寫操作模式
</role>
<role reader>
hosts db3, db4
ips 192.168.113.210,192.168.113.220 //reader 虛擬IP
mode balanced //多個slave主機可以進行讀操作模式
</role>
通過scp命令傳送到其他四臺:
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/
(4)在數據庫主機上(mysql-m1、mysql-m2、mysql-m3、mysql-m4)編輯/etc/mysql-mmm/mmm_agent.conf文件,根據不同的主機修改為不同的值.
vim /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this db1 //分別修改為db1、db2、db3和db4
(5)在監控主機上編輯/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 192.168.113.160,192.168.113.161,192.168.113.162,192.168.113.165 //監控服務器的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 //mmm_monitor 用戶名
monitor_password 123456 //mmm_monitor 密碼
</host>
debug 0
(6)啟動代理和監控
1)在所有數據庫主機上啟動代理服務
systemctl start mysql-mmm-agent.service
systemctl enable mysql-mmm-agent.service
2)在監控主機上啟動監控服務
systemctl start mysql-mmm-monitor.service
(7)測試群集
[root@monitor ~]# cd /etc/mysql-mmm/
[root@mysql-mmm ~]# mmm_control show
db1(192.168.113.160) master/ONLINE. Roles: writer(192.168.113.100)
db2(192.168.113.161) master/ONLINE. Roles:
db3(192.168.113.162) slave/ONLINE. Roles: reader(192.168.113.220)
db4(192.168.113.165) slave/ONLINE. Roles: reader(192.168.113.210)
後面的虛擬IP是真正來訪問MySQL數據庫的。
3.故障轉移切換
監控主機也作為客戶端,可以yum安裝mariadb。
yum -y install mariadb-server mariadb
systemctl start mariadb
在m1服務器上為監控機地址授權登錄。
mysql> grant all on *.* to ‘testdba‘@‘192.168.113.156‘ identified by ‘123456‘;
Query OK, 0 rows affected, 1 warning (0.05 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.03 sec)
1) 停掉主db1數據庫,可以看到數據庫db1處於HARD_OFFLINE(離線狀態),檢測不到數據庫的存在。
[root@monitor ~]# cd /etc/mysql-mmm/
[root@mysql-mmm ~]# mmm_control show
db1(192.168.113.160) master/HARD_OFFLINE. Roles:
db2(192.168.113.161) master/ONLINE. Roles: writer(192.168.113.100) //虛擬IP轉移
db3(192.168.113.162) slave/ONLINE. Roles: reader(192.168.113.220)
db4(192.168.113.165) slave/ONLINE. Roles: reader(192.168.113.210)
宕掉db1數據庫後,虛擬IP轉移到另一臺正常的數據庫db2上
2)模擬主主故障創建數據庫測試
在監控機上用虛擬IP連接數據庫,進行創建數據庫測試。
[root@monitor ~]# mysql -utestdba -p -h 192.168.113.100
Enter password: //輸入授權的密碼
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 14304
Server version: 5.7.17-log Source distribution
MySQL [(none)]> //成功連接上數據庫
MySQL [(none)]> create database test;
Query OK, 1 row affected (0.01 sec)
接下來回到mysql-m2數據庫服務器上查看,創建的test數據庫是否在到mysql-m2數據庫上。
啟動主db1數據庫後,可以看到mysql-m1數據庫已恢復在線狀態,不過虛擬IP不會轉移(可以執行命令mmm_control move_role writer db1手動轉移)。
[root@monitor ~]# cd /etc/mysql-mmm/
[root@mysql-mmm ~]# mmm_control show
db1(192.168.113.160) master/ONLINE. Roles: //恢復在線狀態
db2(192.168.113.161) master/ONLINE. Roles: writer(192.168.113.100) //虛擬IP轉移
db3(192.168.113.162) slave/ONLINE. Roles: reader(192.168.113.220)
db4(192.168.113.165) slave/ONLINE. Roles: reader(192.168.113.210)
這時進入mysql-m1數據庫查看主主同步是否正常,並查看數據是否正常。
由此可看,mysql-mmm故障切換正常。
模擬主從故障也是如此,宕掉mysql-m4數據庫,虛擬IP會全部轉移到另一臺正常數據庫上。
[root@monitor ~]# cd /etc/mysql-mmm/
[root@mysql-mmm ~]# mmm_control show
db1(192.168.113.160) master/ONLINE. Roles:
db2(192.168.113.161) master/ONLINE. Roles: writer(192.168.113.100)
db3(192.168.113.162) slave/ONLINE. Roles: reader(192.168.113.210), reader(192.168.113.220) //虛擬IP轉移
db4(192.168.113.165) slave/HARD_OFFLINE. Roles:
MySQL-MMM實現MySQL高可用群集