MySQL Group Replication — 實現應用層HA:MySQL Router

在上一篇中,我們完成了MySQL Group Replication Mulit-Primary的實現,但對應用層(Web、Application等,以下簡稱AP)來說,
仍舊一次只能連一個啊…
這該怎麼辦才好呢( ′・ω・‵)

這時候就想到MySQL一樣在前陣子推出的另一個套件 — MySQL Router

MySQL Router可以用來作為AP與資料庫的中介
解決當節點Fail時,AP不會自動切換的問題,
雖然這件事情,可以透過AP自己去寫code解決,
但少一件事總比多一件事好( ′・ω・‵)

MySQL的前身即為MySQL Proxy,歷史就不說了,自己去查
這篇主要還是來當作建置筆記用的…( ′・ω・‵)

安裝部分,我們使用的是TAR包
直接解Tar後建個symbol link方便使用

接下來是設定檔,看存哪裡都可以

[DEFAULT]
logging_folder = /data/logs
plugin_folder = /data/mysqlrouter/lib/mysqlrouter
runtime_folder = /data/mysqlrouter/run
[logger]
level = INFO
[keepalive]
interval = 60
[routing:read_write]
bind_address = 127.0.0.1
bind_port = 3306
destinations = 127.0.0.1:10921,127.0.0.1:10922,127.0.0.1:10923
mode = read-write
connect_timeout = 5
max_connections = 100
[routing:read_only]
bind_address = 127.0.0.1
bind_port = 3307
destinations = 127.0.0.1:10922,127.0.0.1:10923,127.0.0.1:10921
mode = read-only
connect_timeout = 1
max_connections = 100

這邊稍微來解釋一下設定檔的參數功能

logging_folder:MySQL Router運行時log存放的資料夾位置
plugin_folder:MySQL Router Plugin存放的資料夾位置
runtime_folder:存放runtime的位置

log跟runtime似乎可任意指定,
因為我是使用Tar包,所以plugin的位置就在解tar後的資料夾裡

[routing:read_write]和[routing:read_only]
和Oracle Database的Listener類似的意思,
看是要開幾條路給人使用,
read_write做為給AP寫入時使用,read_only則是作為負載分流
詳細後面再說明
( ′・ω・‵)

bind_address :要用什麼IP來供AP連線
bind_port:用什麼port
destinations:MySQL Server的List, 格式為IP:port,以逗號區隔
mode:運作模式,分為read-write及read-only

注意destinations不能包含bind_address:bind_port

需要特別提一下的的參數大概是mode = read-write和read-only的差別
官方文件中提到,
read-write
採用逐一連線的方式,照著destinations list上面寫的順序
第一個掛了後換連線到第二個,以此類推,
在後台寫入情形不重的情況下,
我們可以採用這方式來避免寫入順序使得資料不正確的情形發生

read-only
採round-robin的方式,
第一個連線會分配到destinations list中的第一個,
下一個連線則到destination list的第二個,
照這規則一路下去,所以用途很明顯的就是在進行負載分流

經過實驗證明,在Multi-Primary模式下
即使是mode=read-only,
還是可以寫入( ′・ω・‵)

設定好,建好設定檔中沒有的資料夾後,
我們就可以來啟動MySQL Router了

指令:mysqlrouter -c config檔位置
mysqlrouter -c /data/config/mysqlrouter.cnf &

然後就開始實驗吧!

第一個listener:port 3306

來建個table跟塞筆資料試試( ′・ω・‵)

還記得我們在寫mysql server的設定檔時,有個server-id參數嗎?
我們用這個來確認現在連到哪個MySQL Server

SELECT @@server_id;

看來是s1,那我們就直接連到s2看看有沒有資料

看來有資料( ′・ω・‵)

接下來換測試看看Failure Over
關掉s1

確認s1關掉後 重新再透過Router連線一次

server-id顯示為2,也能正常寫入,我們直接去s3看看

s3也有資料了,測試告一段落,把s1接回去( ′・ω・‵)

接下來我們換測試第二個listener:port 3307

實驗證明,mode = read-only只是連線順序的改變,還是可以寫入( ′・ω・‵)

我們重新透過MySQL Router連線到資料庫看server-id

果然和官方文件寫的相同,連線到下一個Server了( ′・ω・‵)

結論:
Multi-Primary模式下 MySQL Router的mode=read-only
只是把連線順序改為round-robin,
還是可以寫入( ′・ω・‵)

下一階段我們來看看如何建立MySQL Router的HA,
以避免單點Failed的情形發生在MySQL Router….