MySQL+MMM 高可用叢集部署(一)
一、MMM的功能特點
MMM 即(Master-Master replication manager for MySQL)的簡稱,它是一套支援雙主故障切換和雙主日常管理的指令碼程式,而MMM是用 Perl 語言所開發,其主要功能是:
第一、用來監控和管理 MySQL 資料庫 主主複製(Master-Master),雖然是主主結構,但是由於資料庫自身特性,在業務邏輯中,同一時刻,僅允許有一個主庫寫入,而另一個主庫充當備份角色,一旦當前所使用的主庫出現故障,將立馬切換到另一個主庫
第二、用來監控和管理 MySQL 資料庫 主從複製(Master-Slave),而這裡的主從複製,首先、從庫的主要作用是進行 Read 負載均衡,其次,也充當備份角色。
MMM的優點:
1、開源免費、從產品面世到成型,經歷了很長一段時間,有前輩們的成熟的技術支援
2、來源於 MySQL 內部,屬於MySQL自己的技術
3、使用指令碼控制管理,簡單方便,易於理解
4、功能比較完善,自帶各種牛X工具及套件
MMM的缺點:
1、由於 MMM 自身建構的侷限性,只能有一個寫入點,其擴充套件性在大型企業中將會是一個瓶頸。
2、對於讀寫分離、Read 負載均衡,其不能通過自身完成,需要企業自己手動處理,或者藉助第三方軟體完成。
二、MMM 架構解析
如上圖拓撲
1、箭頭方向代表資料流向
2、對於主主結構,我們需要在兩臺主資料庫(主A 和 主B)中配置互為主從,當其中任意一臺主庫(比如主A)處於可寫入狀態時,另外一臺主庫(比如主B)將同步到它(主A)剛寫入的資料,反之亦然。
3、對於主從結構,當前,主B屬於主庫,則需要配置 從A 和 從B 兩臺資料庫做為 主B 的從庫即可,無論是 主A 還是 主B ,有資料寫入時,都會同步到 從A 和 從B 。如果,當前,主A 處於可寫入狀態,它首先會向 主B 進行資料同步,再由 主B 向 從A 和 從B 進行資料同步。這種結構在進行資料同步時,如果資料量較大(大型企業),將可能存在一定延時。
4、由 Monitor 監控伺服器同時對 主A、主B、從A、從B 4臺數據庫進行監控及管理,這裡指的是監控4臺數據庫的狀態(服務可達、服務不可達狀態,在生產環境中,資料庫一旦出現故障,那將是災難性的,影響企業命運的。所以,生產環境中,假如有4臺數據庫伺服器:雙主雙從,4臺數據庫伺服器不可能同時出現故障,亦或者說2臺主資料庫同樣不可能同時出現故障。),如果說,當前正在寫入的主資料庫(主A)由於硬體故障或者服務奔潰出現故障,Monitor 伺服器將會立馬將虛擬 IP 192.168.20.254 切換到另外一臺主資料庫(主B),這期間的時間,十分短暫,客戶基本不會有任何察覺,從庫亦是如此。
5、對於讀寫分離,我們在進行應用服務部署過程中,會進行手動配置(或者藉助第三方軟體實現),虛擬寫 IP :192.168.20.254,在單獨配置虛擬 讀IP:192.168.20.252、192.168.20.253,做讀寫分離,其主要目的是負載均衡,降低伺服器壓力。
三、主從同步配置詳解
1、環境安裝
a、資料庫規劃,這裡我們安裝4臺MySQL資料庫和1臺Monitor伺服器,配置如下:
b、虛擬IP規劃:
c、修改伺服器 hosts 檔案,將下面的內容貼上進去(注意,每臺伺服器都要新增):
192.168.20.134 masterA
192.168.20.128 masterB
192.168.20.129 slaveA
192.168.20.130 slaveB
192.168.20.131 cluster-proxy
[[email protected] ~]# vim /etc/hosts
d、關閉firewalld:
[[email protected] ~]# systemctl stop firewalld
[[email protected] ~]# systemctl disable firewalld
e、關閉selinux
[[email protected] ~]# setenforce 0
f、配置yum源和epel源
根據自己的需要進行配置,這裡不進行贅述
g、伺服器做時間同步
同步網路時間或者自己的時間伺服器,這裡不進行贅述
2、安裝MySQL
關於MySQL的安裝,請參考小弟我的另一篇文章:http://blog.51cto.com/4746316/2313577
3、配置MySQL
[[email protected] ~]# vim /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /wdata/mysql/data
tmpdir = /wdata/mysql/temp
plugin-dir = /usr/local/mysql/plugin
server_id = 1
socket = /wdata/mysql/data/mysql.sock
pid-file = /wdata/mysql/data/mysql.pid
explicit_defaults_for_timestamp = true
lower_case_table_names = 1
open_files_limit = 65535
event_scheduler = 1
log_slave_updates = 1
[[email protected] ~]# vim /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /wdata/mysql/data
tmpdir = /wdata/mysql/temp
plugin-dir = /usr/local/mysql/plugin
server_id = 2
socket = /wdata/mysql/data/mysql.sock
pid-file = /wdata/mysql/data/mysql.pid
explicit_defaults_for_timestamp = true
lower_case_table_names = 1
open_files_limit = 65535
event_scheduler = 1
log_slave_updates = 1
[[email protected] ~]# vim /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /wdata/mysql/data
tmpdir = /wdata/mysql/temp
plugin-dir = /usr/local/mysql/plugin
server_id = 3
socket = /wdata/mysql/data/mysql.sock
pid-file = /wdata/mysql/data/mysql.pid
explicit_defaults_for_timestamp = true
lower_case_table_names = 1
open_files_limit = 65535
event_scheduler = 1
log_slave_updates = 1
[[email protected] ~]# vim /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /wdata/mysql/data
tmpdir = /wdata/mysql/temp
plugin-dir = /usr/local/mysql/plugin
server_id = 4
socket = /wdata/mysql/data/mysql.sock
pid-file = /wdata/mysql/data/mysql.pid
explicit_defaults_for_timestamp = true
lower_case_table_names = 1
open_files_limit = 65535
event_scheduler = 1
log_slave_updates = 1
切記,在修改配置檔案時,一定要加入級聯複製選項(即:log_slave_updates = 1)
4、重啟4臺伺服器的MySQL資料庫
[[email protected] ~]# service mysqld restart
5、配置MySQL主從同步
a、配置主主結構
在mastera、masterb資料庫中建立主從同步所需要的使用者
mysql> grant replication slave on *.* to [email protected]"192.168.20.%" identified by "123456";
mastera
(1)、檢視master狀態
mysql> show master status;
(2)、設定主資料庫資訊,包括主資料庫IP、主資料庫使用者名稱、主資料庫密碼、主資料庫日誌檔案、主資料庫日誌檔案偏移量
mysql> change master to master_host="192.168.20.128",master_user="slaveuser",master_password="123456",master_log_file="mysql-bin.000007",master_log_pos=3766631;
(3)、啟動從庫
mysql> start slave;
(4)、檢視從庫狀態
mysql> show slave status\G;
說明:
1、master_host:主資料庫IP地址,這裡設定問masterb的IP地址
2、master_log_file:主資料庫的日誌檔名稱,通過在 masterb 中使用 show master status; 查詢獲得。
3、master_log_file:著資料庫的日誌檔案偏移量,也通過在 masterb 中使用 show master status; 查詢獲得。
masterb
(1)、檢視master狀態
mysql> show master status;
(2)、設定主資料庫資訊,包括主資料庫IP、主資料庫使用者名稱、主資料庫密碼、主資料庫日誌檔案、主資料庫日誌檔案偏移量
mysql> change master to master_host="192.168.20.134",master_user="slaveuser",master_password="123456",master_log_file="mysql-bin.000005",master_log_pos=3766317;
(3)、啟動從庫
mysql> start slave;
(4)、檢視從庫狀態
mysql> show slave status\G;
說明:
在執行完 show slave status\G; 命令時,我們會看到從庫當前的詳細資訊,但是又三個地方需要特別注意,如下圖:
1、Slave_IO_Running 和 Slave_SQL_Running 的值必須為 Yes ,否則將無法進行主從同步
Slave_IO_Running:I/O執行緒監控
Slave_SQL_Running:SQL執行緒監控
2、Master_UUID:這個值必須是唯一的,主資料庫、從資料庫的UUID不能相同,如果是克隆的伺服器,這個UUID的值應該是相同的,此時,需要在MySQL資料目錄下修改 auto.cnf 中的內容即可(不知道 怎麼修改的,可隨便改一位就行),如圖:
[[email protected]r-mysqlc data]# vim auto.cnf
3、Slave_SQL_Running_State 記錄SQL執行緒的狀態,一般當SQL執行緒為 NO 或者 Connecting 時,這裡會提示出詳細的錯誤原因,可根據這裡的提示,進行排錯。
4、Slave_IO_Running 值為 NO 時,一般為主資料庫的 IP地址,使用者名稱、密碼設定有誤,重新設定並重啟 slave 可恢復正常。而 Slave_SQL_Running 值為 NO 或者為 Connecting 時,其出錯原因比較豐富,需 要根據提示進行排錯。
b、配置主從結構
按照前面主主結構的配置模式,分別在 slavea 和 slaveb 中MySQL命令列中執行下面語句:
mysql> change master to master_host="192.168.20.128",master_user="slaveuser",master_password="123456",master_log_file="mysql-bin.000007",master_log_pos=3766631;
mysql> start slave;
mysql> show slave status\G;
c、驗證主從同步
1、在 mastera 中建立games資料庫,在其他資料庫伺服器中檢視是否存在。
mysql> create database games;
2、在其他三臺伺服器中檢視剛建立的資料庫是否存在
masterb slavea slaveb
上三圖表示,由mastera向其他三臺資料庫同步正常
3、在masterb 中建立使用者mmmagent、monitor、discuz,在其他三臺資料庫伺服器中檢視是否存在
mysql> grant all privileges on *.* to [email protected]"192.168.20.%" identified by "123456";
mysql> grant all privileges on *.* to [email protected]"192.168.20.%" identified by "123456";
4、在其他三臺伺服器中檢視剛建立的賬號是否存在
mastera slavea slaveb
上三圖表示,由masterb向其他三臺資料庫同步正常
主從同步到此,部署完成,下期,我們開始本章核心環節,MMM配置。
未完待續,下期再見,敬請期待。。。。。。