1. 程式人生 > >MaxScale:實現MySQL讀寫分離與負載均衡的中介軟體利器

MaxScale:實現MySQL讀寫分離與負載均衡的中介軟體利器

1、MaxScale 是幹什麼的?

配置好了MySQL的主從複製結構後,我們希望實現讀寫分離,把讀操作分散到從伺服器中,並且對多個從伺服器能實現負載均衡。

讀寫分離和負載均衡是MySQL叢集的基礎需求,MaxScale 就可以幫著我們方便的實現這些功能。

MySQL

2、MaxScale 的基礎構成

MaxScale 是MySQL的兄弟公司 MariaDB 開發的,現在已經發展得非常成熟。MaxScale 是外掛式結構,允許使用者開發適合自己的外掛。

MaxScale 目前提供的外掛功能分為5類:

  • 認證外掛

    提供了登入認證功能,MaxScale 會讀取並快取資料庫中 user 表中的資訊,當有連線進來時,先從快取資訊中進行驗證,如果沒有此使用者,會從後端資料庫中更新資訊,再次進行驗證

  • 協議外掛

    包括客戶端連線協議,和連線資料庫的協議

  • 路由外掛 

    決定如何把客戶端的請求轉發給後端資料庫伺服器,讀寫分離和負載均衡的功能就是由這個模組實現的

  • 監控外掛

    對各個資料庫伺服器進行監控,例如發現某個資料庫伺服器響應很慢,那麼就不向其轉發請求了

  • 日誌和過濾外掛

    提供簡單的資料庫防火牆功能,可以對SQL進行過濾和容錯

3、MaxScale 的安裝使用

例如有 3 臺數據庫伺服器,是一主二從的結構。

過程概述

(1)配置好叢集環境

(2)下載安裝 MaxScale

(3)配置 MaxScale,新增各資料庫資訊

(4)啟動 MaxScale,檢視是否正確連線資料庫

(5)客戶端連線 MaxScale,進行測試

詳細過程

(1)配置一主二從的叢集環境

準備3臺伺服器,安裝MySQL,配置一主二從的複製結構。

(2)安裝 MaxScale

最好在另一臺伺服器上安裝,如果資源不足,可以和某個MySQL放在一起。

MaxScale 的下載地址:https://downloads.mariadb.com/files/MaxScale

根據自己的伺服器選擇合適的安裝包。

以 centos 7 為例 安裝步驟如下:

yum install libaio.x86_64 libaio-devel.x86_64 novacom-server.x86_64 libedit -yrpm -ivh maxscale-1.4.3-1.centos.7.x86_64.rpm

(3)配置 MaxScale

在開始配置之前,需要在 master 中為 MaxScale 建立兩個使用者,用於監控模組和路由模組。

建立監控使用者

mysql> create user [email protected]’%’ identified by “111111”;mysql> grant replication slave, replication client on *.* to [email protected]’%’;

建立路由使用者

mysql> create user [email protected]’%’ identified by “111111”;mysql> grant select on mysql.* to [email protected]’%’;

使用者建立完成後,開始配置

vi /etc/maxscale.cnf

找到 [server1] 部分,修改其中的 address 和 port,指向 master 的 IP 和埠。

複製2次 [server1] 的整塊兒內容,改為 [server2] 與 [server3],同樣修改其中的 address 和 port,分別指向 slave1 和 slave2:

MySQL

找到 [MySQL Monitor] 部分,修改 servers 為 server1,server2,server3,修改 user 和 passwd 為之前建立的監控使用者的資訊(scalemon,111111)。

MySQL

找到 [Read-Write Service] 部分,修改 servers 為 server1,server2,server3,修改 user 和 passwd 為之前建立的路由使用者的資訊(maxscale,111111)。

MySQL

由於我們使用了 [Read-Write Service],需要刪除另一個服務 [Read-Only Service],刪除其整塊兒內容即可。

配置完成,儲存並退出編輯器。

(4)啟動 MaxScale

執行啟動命令

maxscale –config=/etc/maxscale.cnf

檢視 MaxScale 的響應埠是否已經就緒

netstat -ntelp

MySQL

  • 4006 是連線 MaxScale 時使用的埠
  • 6603 是 MaxScale 管理器的埠

登入 MaxScale 管理器,檢視一下資料庫連線狀態,預設的使用者名稱和密碼是 admin/mariadb。

maxadmin –user=admin –password=mariadb

MaxScale> list servers

MySQL

可以看到,MaxScale 已經連線到了 master 和 slave。

(5)測試

先在 master 上建立一個測試使用者

mysql> grant ALL PRIVILEGES on *.* to [email protected]”%” Identified by “111111”;

使用 Mysql 客戶端到連線 MaxScale

mysql -h MaxScale所在的IP -P 4006 -u rtest -p111111

執行檢視資料庫伺服器名的操作來知道當前實際所在的資料庫:

MySQL

開啟事務後,就自動路由到了 master,普通的查詢操作,是在 slave上

MaxScale 的配置完成了。

4、MaxScale 在 slave 有故障後的處理

前面已經介紹了 MaxScale可以實現MySQL的讀寫分離和讀負載均衡,那麼當 slave 出現故障後,MaxScale 會如何處理呢?

例如有 3 臺數據庫伺服器,一主二從的結構,資料庫名稱分別為 master, slave1, slave2。

現在我們實驗以下兩種情況:

(1)當一臺從伺服器( slave1 或者 slave2 )出現故障後,檢視 MaxScale 如何應對,及故障伺服器重新上線後的情況

(2)當兩臺從伺服器( slave1 和 slave2 )都出現故障後,檢視 MaxScale 如何應對,及故障伺服器重新上線後的情況

準備

為了更深入的檢視 MaxScale 的狀態,需要把 MaxScale 的日誌開啟:

修改配置檔案

vi /etc/maxscale.cnf

 找到 [maxscale] 部分,這裡用來進行全域性設定,在其中新增日誌。

配置 

log_info=1logdir=/tmp/

通過開啟 log_info 級別,可以看到 MaxScale 的路由日誌。

修改配置後,重啟 MaxScale 。

實驗過程

1、單個 slave 故障的情況

 初始狀態是一切正常。

MaxScale

停掉 slave2 的複製,登入 slave2 的 mysql 執行。

mysql> stop slave;

檢視 MaxScale 伺服器狀態

MaxScale

slave2 已經失效了。

檢視日誌資訊

cat /tmp/maxscale1.log

尾部顯示:

2016-08-15 12:26:02   notice : Server changed state: slave2[172.17.0.4:3306]: lost_slave

提示 slave2 已經丟失。

檢視客戶端查詢結果:

MaxScale

查詢操作全都轉到了 slave1。

可以看到, 在有 slave 故障後,MaxScale 會自動進行排除,不再向其轉發請求。

下面看下 slave2 再次上線後的情況。

登入 slave2 的 MySQL 執行

mysql> start slave;

檢視 MaxScale 伺服器狀態

MaxScale 伺服器

slave2 已經失效了。

檢視日誌資訊

cat /tmp/maxscale1.log

尾部顯示:

2016-08-15 12:26:02   notice : Server changed state: slave2[172.17.0.4:3306]: lost_slave

提示 slave2 已經丟失。

檢視客戶端查詢結果:

客戶端查詢結果

查詢操作全都轉到了 slave1。

可以看到, 在有 slave 故障後,MaxScale 會自動進行排除,不再向其轉發請求。

下面看下 slave2 再次上線後的情況。

登入 slave2 的 MySQL 執行

mysql> start slave;

檢視 MaxScale 伺服器狀態

MySQL讀寫分離

恢復了正常狀態,重新識別到了 slave2。

檢視日誌資訊,顯示:

2016-08-15 12:32:36   notice : Server changed state: slave2[172.17.0.4:3306]: new_slave

檢視客戶端查詢結果:

客戶端查詢結果

slave2 又可以正常接受查詢請求。

通過實驗可以看到,在部分 slave 發生故障時,MaxScale 可以自動識別出來,並移除路由列表,當故障恢復重新上線後,MaxScale 也能自動將其加入路由,過程透明。

2、全部 slave 故障的情況

分別登陸 slave1 slave2 的MySQL,執行停止複製的命令

mysql> stop slave;

檢視 MaxScale 伺服器狀態

MySQL讀寫分離

發現各個伺服器的角色都識別不出來了。

檢視日誌:

MySQL讀寫分離

從日誌中看到,MaxScale 發現2個slave 和 master 都丟了,然後報錯:沒有 master 了。

客戶端連線 MaxScale 時也失敗了。

MySQL讀寫分離

說明從伺服器全部失效後,會導致 master 也無法識別,使整個資料庫服務都失效了。

對於 slave 全部失效的情況,能否讓 master 還可用?這樣至少可以正常提供資料庫服務。

這需要修改 MaxScale 的配置,告訴 MaxScale 我們需要一個穩定的 master。

處理過程

先恢復兩個 slave,讓叢集回到正常狀態,登陸兩個 slave 的MySQL。

mysql> start slave;

修改 MaxScale 配置檔案,新增新的配置。

vi /etc/maxscale.cnf

找到 [MySQL Monitor] 部分,新增:

detect_stale_master=true

儲存退出,然後重啟 MaxScale。

驗證

停掉兩臺 slave ,檢視 MaxScale 伺服器狀態。

負載均衡

可以看到,雖然 slave 都無法識別了,但 master 還在,並提示處於穩定狀態

客戶端執行請求:

負載均衡

客戶端可以連線 MaxScale,而且請求都轉到了 master 上,說明 slave 全部失效時,由 master 支撐了全部請求。

當恢復兩個 slave 後,整體狀態自動恢復正常,從客戶端執行請求時,又可以轉到 slave 上。

負載均衡

小結

通過測試發現,在部分 slave 故障情況下,對於客戶端是完全透明的,當全部 slave 故障時,經過簡單的配置,MaxScale 也可以很好地處理。

來源:效能與架構 訂閱號(ID:yogoup)作者:杜亦舒