GCP虛擬主機建構MySQL基於DRBD與Heartbeat的高可靠性資料庫伺服器

在2014年時撰寫了"使用DRBD與Heartbeat建構高可靠性的MySQL資料庫伺服器"一文, 那麼在Google Cloud Platform是否能重現此架構呢? 經由實際測試與Google服務商方面的協助, 終於也能利用DRBD與Heartbeat來做MySQL Server HA, 其實Google Cloud Platform官方是建議用HAProxy的。

2018/5/19更新改用Alias IP: Google Cloud Platform使用Alias IP簡易達成DRBD + Heartbeat HA

基本上安裝方法與一般實體機器相同, 但是Google Cloud Platform VPC(Virtual Private Cloud)網路的隔離下, 自己開啟Heartbeat產生Virtual IP來當MySQL server所服務的IP完全不可行, 替代方案是使用路由方式, 讓其他虛擬機能夠連接MySQL server, 以下虛擬機均採用Debian 9, 其他Linux系統大同小異。

接著先說明建立虛擬機(Compute Engine)要設定的地方:

1. DRBD與Heartbeat要指定對方IP, 所以我使用了預留內部IP分別是Primary Node的db1 (10.140.0.11), Secondary Node的db2 (10.140.0.12)

另外服務用的Virtual IP 10.141.0.1則需要跳脫default VPC subnet使用範圍(10.140.0.x)

GCP虛擬主機建構MySQL基於DRBD與Heartbeat的高可靠性資料庫伺服器
虛擬機也額外連接SSD Persistent disk, 當作MySQL server的資料碟, 同樣建議兩台虛擬機規格與磁碟大小一致

2. 虛擬機網路需要額外開啟"IP 轉送(IP Forwarding)", 而且是建立虛擬機時就得設定, 若沒有開啟, 虛擬機建立後是無法修改的
GCP虛擬主機建構MySQL基於DRBD與Heartbeat的高可靠性資料庫伺服器

3. 需要動到路由, 所以要讓虛擬機有對Compute Engine API的讀寫權限
 GCP虛擬主機建構MySQL基於DRBD與Heartbeat的高可靠性資料庫伺服器
建立了兩台虛擬機後, 依照上述方法設定DRBD與Heartbeat, 比較不同的地方是haresources不需要建立Virtual IP, 這裡用shell script來改動路由, 讓其他Web server虛擬機可以連接資料庫

db1與db2均要修改/etc/network/interface檔案, 增加虛擬介面eth0:0, 並綁上Virtual IP
nano /etc/network/interface


最後一行加上
auto eth0:0
iface eth0:0 inet static
address 10.141.0.1
netmask 255.255.255.255

*兩台虛擬機都是相同介面設定, 如果您的虛擬機內網介面不是eth0, 請照著增加"介面名稱:0"的方式加入新介面

啟動新介面
ifup eth0:0


接著個別加入控制路由的shell script
db1虛擬機上
nano /etc/heartbeat/resource.d/db-route

貼上shell script
#!/bin/bash
gcloud compute routes delete db-service-ip --quiet
sleep 1
gcloud compute routes create db-service-ip --network=default --priority=400 --destination-range=10.141.0.1/32 --next-hop-instance=db1 --next-hop-instance-zone=asia-east1-a --quiet

設為可執行
chmod +x /etc/heartbeat/resource.d/db-route

"db-service-ip"是我自定的路由名稱, 其他設定值請參考您的Google Cloud Platform實際環境

所以db2虛擬機上
nano /etc/heartbeat/resource.d/db-route


貼上shell script
#!/bin/bash
gcloud compute routes delete db-service-ip --quiet
sleep 1
gcloud compute routes create db-service-ip --network=default --priority=400 --destination-range=10.141.0.1/32 --next-hop-instance=db2 --next-hop-instance-zone=asia-east1-a --quiet

兩者只差別在--next-hop-instance參數

設為可執行
chmod +x /etc/heartbeat/resource.d/db-route


共通的haresources即是
db1 drbddisk::r0 Filesystem::/dev/drbd0::/srv::xfs::noatime,nodiratime db-route mysql

1. 啟動DRBD r0資源
2. 掛載/dev/drbd0到/srv, XFS格式, noatime與nodiratime參數
3. db-route為路由修改shell script
4. mysql為MySQL Server resource script, 啟動MySQL Server


當嘗試failover測試, 可以在VPC網路的路由中看到"db-service-ip"路由規則加入
GCP虛擬主機建構MySQL基於DRBD與Heartbeat的高可靠性資料庫伺服器

實際測試整個failover切換費時2分30秒左右, 光是修改路由就需30秒, 頗慢...
由於我開啟的虛擬機規格與空間頗高, 費用驚人在測試完成後就暫且關機, 免得生出一大堆費用
非常感謝樓主的這篇分享資訊,最近工作上剛好也有這個需求。

我原本的架構也是使用 DRBD + Heartbeat (使用 Apache + Mysql)在 vmware 的環境上使用,運作良好

最近想把它移轉到 GCP 上面,剛好就查詢到樓主分享的這篇文章。

因為原本的環境 Primary Node 與 Secondary Node 是在同一個主機房環境

如果主機房的環境出了問題,Primary 與 Secondary 也會一起掛掉!

所以才想說使用 Google Cloud Platform 的環境來測試並改善!

我的問題點如下:

1. 我的規劃是想將 Primary Node 建立在台灣主機房,而 Secondary Node 建立在美國機房,不知道這樣可不可行?


2. 還有樓主您有提到在作 Failover 測試的時候,有修改路由要花30秒,請問是需要人工修改?還是系統自動修改?


3. 另外不知道樓主您配合的 Google 經銷商是哪家?



不好意思,因為對 GCP 的使用還不熟悉,還盼望分享一些使用經驗

非常感謝!
GCP Cloud SQL目前這個HA有跟沒有一樣, 很糟, 我有向GCP反應...只是他們什麼時候推出真的Cloud SQL HA就不知道了

1. 老實說我還真沒想到這樣做, 試了在美國機房架個web server, 從台灣機房curl抓美國機房的網頁(聽在內網IP), 是會通的, 不過網速...很慢

2. 用gcloud工具去改的, 很意外會慢到30秒

3. 這還不方便透露, 不過您找台灣GCP經銷商或參加GCP各項研討會, 出現的那幾大家經銷商都不錯

我也是GCP新手, 有些不明確的資訊還望海涵
Ryan Lai wrote:
GCP Cloud ...(恕刪)

另外是否有測試過在 GCP 上面使用外部 IP(PUBLIC IP),是否也是要另外寫指令才能進行移轉?
在Public IP上做DRBD+Heartbeat? 這我沒有實作過...

boneyhsu wrote:
另外是否有測試過在 ...(恕刪)
如果系統要對外提供服務的話,空有 DRBD+Heartbeat 的機制,但是卻沒有 Public IP 可以用的話,那不就白搭了 ORZ ,不知道有沒有解決方案!!
這樣啊, 我也不知道GCP上是否允許改Public IP路由

boneyhsu wrote:
如果系統要對外提供服...(恕刪)
另一個想法是多架一台Compute Engine, 開Firewall規則允許對外服務, MySQL Proxy接內部的MySQL Server

boneyhsu wrote:
如果系統要對外提供服...(恕刪)
我目前在 GCP 測試的結果:

1. 分別在台灣機房(MASTER)與新加坡機房(SLAVE),各建立一個 VM
2. 沒有使用樓主另外建立的路由步驟,Heartbeat 也不需要執行 shell script,DRBD + Heartbeat 可以正常運作 (切換的時間約 6 秒鐘,我的 2 個 VM 各配置 1 個 VCPU 與 1.75GB 記憶體而已喔! )





因此 DRBD + Heartbeat 在 GCP 的架構下,是可以跨國運作的!

但是現在問題來了

在圖上,可以看出有 2 個外部 IP

我要如何讓一個 Domain Name 對應 2 個 IP ?

舉例:

對外服務的 Domain Name :gcp.abc.com

兩個 VM 的外部 IP 分別是 35.201.0.1 與 35.197.0.1

應該類似 DNS Round Robin 的概念吧!


不過...話說回來
使用 GCP 免費美金300元的額度,真是好用
可以作各種測試練習,
額度用完了,再繼續使用其他 Google 帳號試用
請問您的服務是走HTTP/HTTPS?

如果是HTTP/HTTPS的話, 讓我理解一下您的架構
這兩台VM都跑Web Server與Database, 用了DRBD + Heartbeat做HA
是怕只有一台VM掛了就無法服務嗎?

boneyhsu wrote:
我目前在 GCP 測...(恕刪)
關閉廣告
文章分享
評分
評分
複製連結

今日熱門文章 網友點擊推薦!