1. 程式人生 > >MySQL-MMM實現MySQL高可用群集

MySQL-MMM實現MySQL高可用群集

ade 策略 ins 結果 you fff ont 自增 sts

簡介

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高可用群集