MySQL Group Replication 與MySQL Router 營運環境建置

前篇
1. MySQL Group Replication的安裝、設定與測試
2. MySQL Group Multi-Primary設定與測試
3. MySQL Group Replication 搭配 MySQL Router實現應用層的高可用性環境

在前幾篇中,
我們建置了MySQL Group Replication與MySQL Router高可用性環境的建置
但幾乎都是在本機運作,所以也只能算是實驗環境,
實際要拿來運用的話,當然不可能全部都在同一台 ( ′・ω・‵)
今天就來看看多Server的話,該怎麼去運作吧!

首先是主機環境
作業系統:Red hat 7
MySQL Server 1:10.104.0.2
MySQL Server 2:10.104.0.3
MySQL Server 3:10.104.0.4
MySQL Router:10.104.0.5

MySQL Server及Group Replication建置方式大致和第一、二篇相同
但在實際建置時,Server 1很正常的啟動了MGR
而在Server 2、Server 3要加入時卻失敗了 (つд⊂)

在Server 2的log中看到以下訊息
[ERROR] Plugin group_replication reported: ‘[GCS] Timeout while waiting for the group communication engine to be ready!’

Timeout? 花生省魔術 ( ′・ω・‵)?
防火牆明明有開啊…

回到Server 1看看log有沒有好了 _(:3 」∠ )_
[Warning] Plugin group_replication reported: ‘[GCS] Connection attempt from IP address 10.140.0.3 refused. Address is not in the IP whitelist.’

好,看來答案很明顯了
要設定白名單( ′・ω・‵)
馬上來找一下mysql官網的文件看怎麼設定
https://dev.mysql.com/doc/refman/5.7/en/group-replication-options.html

在my.cnf中都加入
group_replication_ip_whitelist=”10.140.0.2,10.140.0.3,10.140.0.4"

重啟所有Server後再執行一次MGR的設定動作就成功加入囉

到這邊 MGR的設定大致上應該算是完成了
接下來換MySQL Router

安裝設定方式同最上面的第三篇,就不再多做說明

但,在安裝設定完後的測試才是問題的開始_(:3 」∠ )_

安裝完後,我們直接透過router進行連線
設定中,預設使用3306時,會連線到Server 1
所以我們從Server 2登入

登入失敗是不意外的

畢竟我並沒有設定root可以從Server 2登入到Server 1
但後來仔細看看錯誤訊息…myrt? ( ′・ω・‵)?
來看看他的ip…
嗯...是MySQL Router的IP,所有連線都統一從router進入,
所以可以確定MySQL Router果然前身就是MySQL Proxy
所有連線皆透過Router去連線

如此一來解決方式就簡單了,

建立User的時候,
IP部份統一都寫MySQL Router那台的IP就好了( ′・ω・‵)

先建立一個USER,IP則是MySQL Router的IP

然後測試連線

果然成功登入了( ′・ω・‵)

某方面來說這樣安全性還挺高的(?)
新建立的User只允許從MySQL Router連線,
而MySQL Router本身並無Client工具,
便可再從防火牆限制可連線到Router的IP

接下來進行最後一個測試

在看官方的文件中提到了以下說明

The number of servers (n) needed to tolerate f failures is then n = 2 x f + 1. In practice this means that to tolerate one failure the group must have three servers in it. 
As such if one server fails, there are still two servers to form a majority (two out of three) and allow the system to continue to make decisions automatically and progress. 
However, if a second server fails involuntarily, then the group (with one server left) blocks, because there is no majority to reach a decision.

這裡面提到了,假設有N台MySQL Server,容許failure的節點為F,
則關係式為N=2 x F + 1

在這個環境中3台Server能容許Fail的節點為1,系統仍舊能正常運作
但如果3台Server中,有2個Server Failed了,
MGR會因為無法進行多數決,而將剩下一台Server Block住

所以我們就來進行這部份的測試吧( ′・ω・‵)

首先是3台Server都活著的情況

然後我們先來試著寫入

我很懶...直接用phpmyadmin來進行測試

然後我們關掉Server 1後,server_id變成2了,順利連到了第二台

接下來再開個TABLE試試看( ′・ω・‵)

也能正常開TABLE,
接下來,我們關掉Server 2,看看會發生什麼事情吧!

順利的切換到了第3台Server
MGR也只剩下一個節點

看來讀取是正常的( ′・ω・‵)
接下來測試看看寫入,塞一筆資料到剛剛的table裡面試試

嗯?! 新增成功?!
跟說好的不一樣啊 Σ(゚Д゚;≡;゚д゚)
看一下資料是否真的存在

也有資料...所以到底發生什麼事了呢( ′・ω・‵)
直接進去Client確認也正常

我們把Server 1加回去試試看…

因為沒設定自動同步,所以剛啟動Server 1時,不會有建好的table,
設定同步後,資料就接上了

我們這次看log試試,關掉Server 3,讓MGR只剩下Server 1活著試試

連不上 Σ(゚Д゚;≡;゚д゚) 錯誤訊息也怪怪的
這是什麼巫術…

MySQL Router的訊息也怪怪的,但重啟後就正常了…
測試先到這邊,關於MySQL Router這個奇怪的問題另外再開一篇吧

總結重點:

  1. 建立MGR時,要先設定白名單
  2. 除了直接連線到Server外,所有的走Router的連線
    Server都把來源視為Router
  3. 當只剩下一個節點時,DBMS還是可以正常運作
    只是把Failed的節點再打開時,MySQL Router會失效
    (留著當下一篇的題材...)