基於mysql-mmm實現MySQL數據庫的高可用

MMM簡介

MMM(Master-Master Replication Manager for MySQL)MySQL主主複製管理器,實現了對MySQL雙主複製架構的監控,故障轉移和管理。mysql-mmm在實現過程中提供了多個虛擬IP,包括用於寫操作的虛擬IP和用於讀操作的虛擬IP。在雙主複製架構中僅有其中的一臺主節點可用於寫操作,所有節點包括從節點對外提供讀操作。當其中的一個從節點故障時,它持有的虛擬IP會自動轉移至其他節點上。若故障的是主節點,它持有的寫操作的虛擬IP和讀操作的虛擬IP都會自動轉移至另外一個主節點,向它同步數據的從節點也會將主服務器指向另一個主節點。

另外用於監控的monitor需要單獨部署,可以對monitor節點部署高可用以解決其單點故障。mysql-mmm僅能對mysql數據庫實現高可用,若要實現讀寫分離,負載均衡可以使用Ameoba或mysql-proxy。


實現過程

服務器架構

wKiom1XbFnCgR1VuAACoyWgmIHk661.jpg

實驗環境:

服務器主機名IP地址server-id
master1node1192.168.1.1061
master2node2192.168.1.1262
slave1node3192.168.1.1273
slave2node4192.168.1.1314
monitornode5192.168.1.132

虛擬IP:

    write:192.168.1.200

    read:192.168.1.201,192.168.1.202,192.168.1.203


配置過程

1)首先在master和slave節點上安裝mariadb-10數據庫,5個節點實現時間同步。

2)node1和node2實現雙主複製架構

node1上配置文件(以實現半同步複製):

[root@node1 ~]# vim /etc/mysql/my.cnf 
server-id       = 1
binlog_format = row
datadir = /data/mydata
sync_binlog = 1
autocommit = off
relay-log = /data/relaylog/relay-log
innodb_support_xa = 1
sync_master_info = 1
sync_relay_log = 1
sync_relay_log_info = 1
auto-increment-increment = 2
auto-increment-offset = 1
slave_parallel_threads = 3
rpl_semi_sync_master_enabled = 1
rpl_semi_sync_master_timeout = 1000
rpl_semi_sync_slave_enabled = 1
log_slave_updates = 1

node2上配置文件(已實現半同步複製,其餘配參數與node1上相同):

server-id       = 2
...........
auto-increment-increment = 2
auto-increment-offset = 2

在兩個節點上創建授權賬號:

MariaDB [(none)]> grant replication slave,replication client on *.* to repuser@'192.168.1.%' identified by 'repuser';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> flush privileges;

相互以對方爲主服務器:

node1上:

MariaDB [(none)]> change master to master_host='192.168.1.126',master_user='repuser',master_password='repuser',master_log_file='master-bin.000004',master_log_pos=657;

node2上:

MariaDB [(none)]> change master to master_host='192.168.1.106',master_user='repuser',master_password='repuser',master_log_file='master-bin.000004',master_log_pos=657;

node1,node2上啓動線程:

MariaDB [(none)]> start slave;


3)從服務器node3和node4向node1同步數據

node3配置文件:

server-id       = 3
datadir = /data/mydata
relay-log = /data/relaylog/relay-log
read_only       = 1
slave_parallel_threads = 3
sync_master_info = 1
sync_relay_log = 1
sync_relay_log_info = 1
rpl_semi_sync_slave_enabled = 1

node4配置文件(省略部分與node3一致):

server-id       = 4
.......
.......

將node3和node4的主服務器指向node1:

MariaDB [(none)]> change master to master_host='192.168.1.106',master_user='repuser',master_password='repuser',master_log_file='master-bin.000004',master_log_pos=657;

node3,node4上啓動線程:

MariaDB [(none)]> start slave;


4)部署MMM

mysql-mmm工作時,有如下幾個服務進程:

mmm_agentd:運行在各mysql服務器上,代理進程。

mmm_control:運行在監控節點上,通過命令行管理mmm_mond進程

mmm_mond:運行在監控節點上,監控守護進程,執行節點的移除等


首先在各個mysql服務器上安裝mysql-mmm-agent,在監控節點上安裝mysql-mmm-monitor。

在node1-4上:

yum install mysql-mmm-agent

在node5上:

yum install mysql-mmm-monitor


添加代理、監控賬號,在其中一個主節點上完成即可。

MariaDB [(none)]> GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'192.168.1.%' IDENTIFIED BY 'mmm_monitor';
MariaDB [(none)]> GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'192.168.1.%'   IDENTIFIED BY 'mmm_agent';
MariaDB [(none)]> flush privileges;


所有主機上配置/etc/mysql-mmm/mmm_common.conf(node1-5上),簡單起見通過ansible完成。

active_master_role      writer
 
<host default>
    cluster_interface       eth0
    pid_path                /var/run/mysql-mmm/mmm_agentd.pid
    bin_path                /usr/libexec/mysql-mmm/
    replication_user        repuser              #複製用戶
    replication_password    repuser              #複製用戶密碼
    agent_user              mmm_agent            #代理用戶
    agent_password          mmm_agent            #代理用戶密碼
</host>
 
<host db1>
    ip      192.168.1.106
    mode    master
    peer    db2
</host>
 
<host db2>
    ip      192.168.1.126
    mode    master
    peer    db1
</host>
 
<host db3>
    ip      192.168.1.127
    mode    slave
</host>
 
<host db4>
    ip      192.168.1.131
    mode    slave
</host>
 
<role writer>
    hosts   db1, db2              #用於寫操作的節點
    ips     192.168.1.200         #用於寫操作的虛擬IP
    mode    exclusive             #db1,db2僅有一個被用於寫操作
</role>
<role reader>
    hosts   db1, db2, db3, db4    #用於讀操作的節點
    ips     192.168.1.201, 192.168.1.202, 192.168.1.203   #用於讀操作的虛擬IP
    mode    balanced              #虛擬IP會被均勻分配給以上節點
</role>


在monitor節點上(node5)配置/etc/mysql-mmm/mmm_mon.conf:

[root@node5 ~]# vim /etc/mysql-mmm/mmm_mon.conf 
include mmm_common.conf
 
<monitor>
    ip                  127.0.0.1
    pid_path            /var/run/mysql-mmm/mmm_mond.pid
    bin_path            /usr/libexec/mysql-mmm
    status_path         /var/lib/mysql-mmm/mmm_mond.status
    ping_ips            192.168.1.106,192.168.1.126,192.168.1.127,192.168.1.131   #被監控的服務器IP地址
    auto_set_online     60
</monitor>
 
<host default>
    monitor_user        mmm_monitor          #監控用戶
    monitor_password    mmm_monitor          #監控用戶密碼
</host>
 
debug 0


在各個被監控節點上配置mmm_agent.conf(如果是db2則最後行爲this db2,對應於mmm_common.conf文件中的配置

[root@node1 mysql-mmm]# vim /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
 
# The 'this' variable refers to this server.  Proper operation requires 
# that 'this' server (db1 by default), as well as all other servers, have the 
# proper IP addresses set in mmm_common.conf.
this db1

在各個mysql服務器節點上啓動服務:

[root@node1 mysql-mmm]# service mysql-mmm-agent start
Starting MMM Agent Daemon:                                 [  OK  ]

在monitor上啓動服務:

[root@node5 ~]# service mysql-mmm-monitor start
Starting MMM Monitor Daemon:                               [  OK  ]


在monitor節點上查看mysql服務器狀態:

wKioL1XbJ9eSJ3e8AAF3xR5rheg252.jpg

對應節點上的虛擬IP也已經啓用:

wKiom1XbJizyQGFOAAHGapdvPz8052.jpg


指向master1(node1)的從服務器有3臺,現在停止master1上的mysql服務。

wKioL1XbKOXR3Cz5AAERDpqUt-Q058.jpg

[root@node1 ~]# service mysqld stop
Shutting down MySQL..                                      [  OK  ]

wKiom1XbJ1SQCgtwAAGRPKoFGZw369.jpg

由圖可見master1已顯示爲offline,且用於寫操作的虛擬IP(192.168.1.200)已轉移至master2上。在master2上查看有多少個從服務器向本機同步數據。

wKiom1XbKKTisVR9AAEQ4640fbs512.jpg

可以看到兩臺從服務器已經指向master2(Master_id爲2),完成部署.................^_^

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章