您好,登錄后才能下訂單哦!
這篇文章的知識點包括:MMM架構的簡介、MMM架構的搭建部署以及MMM架構的優缺點介紹,閱讀完整文相信大家對MMM架構有了一定的認識。
MMM是Multi-Master Replication Manager for MySQL的縮寫,它是MySQL提供的一個多主復制管理器,其核心是使用perl語言編寫的一組腳本。實際上MMM是比較早期甚至有點老的一種用于構建高可用MySQL架構的方式,但因其還有一定的應用場景。
MMM 由兩個組件組成:
monitor
:監控集群內數據庫的狀態,在出現異常時發布切換命令,一般和數據庫分開部署agent
:運行在每個 MySQL 服務器上的代理進程,monitor
命令的執行者,完成監控的探針工作和具體服務設置,例如設置 VIP、指向新同步節點MMM的主要作用:
MMM提供了什么功能:
MMM對于主備切換后如何讓從庫同步日志點:
本文要搭建的MMM架構如下:
以上述架構為例,描述一下故障轉移的流程,現在假設 Master1 宕機:
read_only=1
select master_pos_wait()
等待同步完畢read_only=0
從整個流程可以看到,如果主節點出現故障,MMM 會自動實現切換,不需要人工干預,同時我們也能看出一些問題,就是數據庫掛掉后,只是做了切換,不會主動補齊丟失的數據,所以 MMM 會有數據不一致性的風險。
搭建MMM架構所需的資源說明:
名稱 | 數量 | 說明 |
---|---|---|
Master服務器 | 2 | 用于主備模式的主主復制配置 |
Slave服務器 | 0-N | 可以配置0臺或多臺從服務器,但不建議太多 |
監控服務器 | 1 | 安裝MMM用于監控MySQL復制集群 |
IP地址 | 2*(n+1) | n為MySQL服務器的數量 |
監控用戶 | 1 | 用于監控數據庫狀態的MySQL用戶(至少擁有replication client 權限) |
代理用戶 | 1 | 用于MMM代理的MySQL用戶(至少擁有super 、replication client 、process 權限) |
復制用戶 | 1 | 用于配置MySQL主從復制的用戶(至少擁有replication slave 權限) |
本文中所使用的機器說明:
名稱 | IP | 角色 |
---|---|---|
master-01 | 192.168.190.146 | 主庫 |
master-02 | 192.168.190.148 | 備庫 |
slave-01 | 192.168.190.149 | 從庫 |
manager | 192.168.190.147 | 集群管理器(MMM) |
環境版本說明:
另外的說明:
1、在master-01
和master-02
上使用如下語句分別創建用于主主復制的MySQL用戶:
create user 'repl'@'%' identified with mysql_native_password by 'Abc_123456';
grant replication slave on *.* to 'repl'@'%';
flush privileges;
2、修改master-01
上的MySQL配置文件:
[root@master-01 ~]# vim /etc/my.cnf
[mysqld]
# 設置節點的id
server_id=101
# 開啟binlog,并指定binlog文件的名稱
log_bin=mysql_bin
# 開啟relay_log,并指定relay_log文件的名稱
relay_log=relay_bin
# 將relaylog的同步內容記錄到binlog中
log_slave_updates=on
在master-02
的配置文件中也是添加一樣配置,只不過server_id
不一樣:
[root@master-02 ~]# vim /etc/my.cnf
[mysqld]
server_id=102
log_bin=mysql_bin
relay_log=relay_bin
log_slave_updates=on
接著是配置slave-01
,由于該節點不是作為備庫存在,而只是單獨的從庫角色,所以不需要開啟log_slave_updates
參數:
[root@slave-01 ~]# vim /etc/my.cnf
[mysqld]
server_id=103
log_bin=mysql_bin
relay_log=relay_bin
完成以上配置文件的修改后,分別重啟這三個節點上的MySQL服務:
[root@master-01 ~]# systemctl restart mysqld
[root@master-02 ~]# systemctl restart mysqld
[root@slave-01 ~]# systemctl restart mysqld
master-02
對master-01
的主從關系進入master-01
的MySQL命令行終端,通過如下語句查詢master-01
當前正在使用的二進制日志及當前執行二進制日志位置:
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql_bin.000001 | 155 | | | |
+------------------+----------+--------------+------------------+-------------------+
記錄其中的File
和Position
的值,然后進入master-02
的MySQL命令行終端,分別執行如下語句:
mysql> stop slave; -- 停止主從同步
mysql> change master to master_host='192.168.190.146', master_port=3306, master_user='repl', master_password='Abc_123456', master_log_file='mysql_bin.000001', master_log_pos=155; -- 配置master-01節點的連接信息,以及從哪個binlog文件的哪個位置開始復制
mysql> start slave; -- 啟動主從同步
配置完主從關系后,使用show slave status\G;
語句查看主從同步狀態,Slave_IO_Running
和Slave_SQL_Running
的值均為Yes
才能表示主從同步狀態是正常的:
master-01
對master-02
的主從關系為了實現主主復制,master-01
和master-02
需要互為主從關系,所以還需要配置master-01
對master-02
的主從關系。進入master-02
的MySQL命令行終端,通過如下語句查詢master-02
當前正在使用的二進制日志及當前執行二進制日志位置:
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql_bin.000001 | 155 | | | |
+------------------+----------+--------------+------------------+-------------------+
記錄其中的File
和Position
的值,然后進入master-01
的MySQL命令行終端,分別執行如下語句:
mysql> stop slave;
mysql> change master to master_host='192.168.190.148', master_port=3306, master_user='repl', master_password='Abc_123456', master_log_file='mysql_bin.000001', master_log_pos=155;
mysql> start slave;
同樣配置完成后,使用show slave status\G;
語句查看主從同步狀態,Slave_IO_Running
和Slave_SQL_Running
的值均為Yes
才能表示主從同步狀態是正常的:
slave-01
對master-01
的主從關系接著就是配置從庫對主庫的主從關系了,這里與master-02
是一樣的,除非期間對master-01
上的數據做了修改才需要重新獲取日志點:
mysql> stop slave;
mysql> change master to master_host='192.168.190.146', master_port=3306, master_user='repl', master_password='Abc_123456', master_log_file='mysql_bin.000001', master_log_pos=155;
mysql> start slave;
1、在所有的機器上安裝 epel
源:
yum install -y epel-release
2、在所有的主從節點上安裝MMM代理客戶端:
yum install -y mysql-mmm-agent
3、在 manager
節點上安裝所有的MMM包:
yum install -y mysql-mmm*
4、然后在master-01
上創建用于監控和代理的MySQL用戶:
-- 監控用戶
create user 'mmm_monitor'@'%' identified with mysql_native_password by 'Abc_123456';
grant replication client on *.* to 'mmm_monitor'@'%';
-- 代理用戶
create user 'mmm_agent'@'%' identified with mysql_native_password by 'Abc_123456';
grant super, replication client, process on *.* to 'mmm_agent'@'%';
flush privileges;
由于配置了主從的原因,此時其他兩個數據庫節點也會同步這些新建的用戶。在另外兩個節點執行如下語句就可以查詢到:
mysql> use mysql;
mysql> select host,user,plugin from user;
+-----------+------------------+-----------------------+
| host | user | plugin |
+-----------+------------------+-----------------------+
| % | mmm_agent | mysql_native_password |
| % | mmm_monitor | mysql_native_password |
| % | repl | mysql_native_password |
| localhost | mysql.infoschema | caching_sha2_password |
| localhost | mysql.session | caching_sha2_password |
| localhost | mysql.sys | caching_sha2_password |
| localhost | root | caching_sha2_password |
+-----------+------------------+-----------------------+
5、編輯所有節點包括監控節點上的mmm_common.conf
配置文件,主要是配置當前節點和集群中其他節點的信息。這里以master-01
節點為例,其配置內容如下:
[root@master-01 ~]# vim /etc/mysql-mmm/mmm_common.conf
active_master_role writer
<host default>
cluster_interface ens32 # 當前節點的網卡名稱,用于綁定虛擬IP,可以ip addr命令查詢
pid_path /run/mysql-mmm-agent.pid # pid文件存放的路徑
bin_path /usr/libexec/mysql-mmm/ # 可執行文件存放的路徑
replication_user repl # 用于復制的MySQL用戶
replication_password Abc_123456 # repl用戶的密碼
agent_user mmm_agent # 用于代理的MySQL用戶
agent_password Abc_123456 # mmm_agent用戶的密碼
</host>
# 配置master-01的ip地址和角色
<host db1>
ip 192.168.190.146
mode master
peer db2
</host>
# 配置master-02的ip地址和角色
<host db2>
ip 192.168.190.148
mode master
peer db1
</host>
# 配置slave-01的ip地址和角色
<host db3>
ip 192.168.190.149
mode slave
</host>
# 配置負責寫操作的庫
<role writer>
hosts db1, db2 # 指定可寫的庫,這里是上面host標簽中定義的名稱
ips 192.168.190.90 # 配置寫虛擬IP,可以有多個使用逗號分隔
mode exclusive # 表示同一時刻只有一個主庫提供服務
</role>
# 配置負責讀操作的庫
<role reader>
hosts db1, db2, db3 # 指定可讀的庫
ips 192.168.190.91,192.168.190.92,192.168.190.93 # 配置讀虛擬IP
mode balanced # 表示將讀請求負載均衡到以上所配置的db上
</role>
其他三個節點也按照相同的方式進行配置即可,除了網卡名稱可能會不同外,其它的參數都應該是一致的。
6、然后配置各個節點的mmm_agent.conf
文件,聲明當前節點在host
標簽中所定義的名稱。master-01
節點的配置如下:
[root@master-01 ~]# vim /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this db1
master-02
節點的配置如下:
[root@master-02 ~]# vim /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this db1
slave-01
節點的配置如下:
[root@slave-01 ~]# vim /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this db3
7、接著配置監控節點上的mmm_mon.conf
文件,配置內容如下:
[root@manager ~]# 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.190.146,192.168.190.148,192.168.190.149 # 配置集群中各個節點的IP
auto_set_online 60 # 設置當節點宕機恢復后自動上線的時間,單位為秒
# 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>
# 配置用于監控的MySQL用戶和密碼
monitor_user mmm_monitor
monitor_password Abc_123456
</host>
debug 0
8、啟動所有主從節點的MMM代理服務:
[root@master-01 ~]# systemctl start mysql-mmm-agent
[root@master-02 ~]# systemctl start mysql-mmm-agent
[root@slave-01 ~]# systemctl start mysql-mmm-agent
agent
服務默認會監聽9989
端口,如果開啟了防火墻則需要開放該端口:
firewall-cmd --zone=public --add-port=9989/tcp --permanent
firewall-cmd --reload
9、啟動監控節點上的監控服務:
[root@manager ~]# systemctl start mysql-mmm-monitor
10、完成以上所有步驟后,在監控節點上使用mmm_control show
命令就可以查看到集群中各個節點的狀態及其分配的虛擬IP,如下示例:
[root@manager ~]# mmm_control show
db1(192.168.190.146) master/ONLINE. Roles: reader(192.168.190.91), writer(192.168.190.90)
db2(192.168.190.148) master/ONLINE. Roles: reader(192.168.190.93)
db3(192.168.190.149) slave/ONLINE. Roles: reader(192.168.190.92)
[root@manager ~]#
到此為止,我們就已經完成了MMM高可用架構的搭建,接下來我們對其進行一些簡單的測試。例如,測試下是否能正常ping
通虛擬IP,畢竟應用端訪問數據庫時連接的是虛擬IP,所以首先得確保虛擬IP是能夠被訪問的。如下:
能ping
通之后,使用Navicat等遠程連接工具測試下能否正常連接上:
確定了各個虛擬IP都能正常訪問后,測試下MMM是否能正常進行故障轉移,首先將master-01
上的MySQL服務給停掉:
[root@master-01 ~]# systemctl stop mysqld
正常情況下,此時到監控節點上使用mmm_control show
命令可以看到master-01
節點已經處于脫機狀態,而用于寫的虛擬IP正常的切換到了master-02
節點上:
[root@manager ~]# mmm_control show
db1(192.168.190.146) master/HARD_OFFLINE. Roles:
db2(192.168.190.148) master/ONLINE. Roles: reader(192.168.190.93), writer(192.168.190.90)
db3(192.168.190.149) slave/ONLINE. Roles: reader(192.168.190.91), reader(192.168.190.92)
[root@manager ~]#
接著進入slave-01
節點上的MySQL終端。之前我們配置slave-01
的主庫是master-01
,現在已經將master-01
停掉后,可以看到slave-01
的主庫被MMM切換成了master-02
:
經過以上測試后,可以看到我們搭建的MMM架構是能夠正常運行的,已經使得Replication集群擁有了基本的高可用能力,即便主庫下線后也能正常切換到備庫上,也正確建立了從庫與新主庫的關系。
綜合優缺點可以得知:MMM僅適用于對數據一致性要求不高,允許丟失少量數據的場景下,例如評論、資訊類等數據
看完上述內容,你們對MMM架構有進一步的了解嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。