- 創(chuàng)建MySQL主數(shù)據(jù)庫并等待其就緒
- 創(chuàng)建第一個從屬數(shù)據(jù)庫,并將其連接至主數(shù)據(jù)庫
- 針對其余從屬數(shù)據(jù)庫重復(fù)該操作
當(dāng)然,最終獲得的效果與上述操作類似,但我們并不需要明確關(guān)注操作的執(zhí)行順序,只需要根據(jù)需求創(chuàng)建能反映最終結(jié)果的目標(biāo)狀態(tài)即可:
“schemadock01-mezzanine-cluster1-db1”: { “data”: { “disabled”: false, “role”: “master”, “port”: 7335, “size”: “all” }},“schemadock02-mezzanine-cluster1-db2”: { “data”: { “master_host”: “schemadock01”, “master_port”: 7335, “disabled”: false, “role”: “minion”, “port”: 7335, “size”: “all” }},“schemadock03-mezzanine-cluster1-db3”: { “data”: { “master_host”: “schemadock01”, “master_port”: 7335, “disabled”: false, “role”: “minion”, “port”: 7335, “size”: “all” }}
上述信息會以隨機(jī)的順序推送給相關(guān)代理,隨后代理會開始執(zhí)行操作。為達(dá)到目標(biāo)狀態(tài)可能需要重試多次,者主要取決于執(zhí)行順序。通常可以在幾次重試或?qū)崿F(xiàn)目標(biāo)狀態(tài),但某些操作可能需要重試上百次。舉例來說,如果首先處理的是從屬數(shù)據(jù)庫,此時將無法連接至主數(shù)據(jù)庫,并只能稍后重試。由于主數(shù)據(jù)庫可能要等一段時間才能啟動并正常運(yùn)行,因此從屬數(shù)據(jù)庫可能需要重試多次:
(點(diǎn)擊放大圖像)
兩個從屬數(shù)據(jù)庫先于主數(shù)據(jù)庫啟動的范例。最初的啟動階段(第1和第2步)中,從屬數(shù)據(jù)庫無法從獲得主數(shù)據(jù)庫的快照,因此啟動過程失敗。隨后主數(shù)據(jù)庫在第3步中順利啟動,從屬數(shù)據(jù)庫即可通過第4和第5步連接并同步數(shù)據(jù)。
Docker運(yùn)行時的使用體驗
我們的大部分宿主機(jī)運(yùn)行了Docker 1.9.1,并使用LVM中的devicemapper
作為存儲。我們發(fā)現(xiàn)使用LVM中的devicemapper
在執(zhí)行效果方面要比回調(diào)(Loopback)的devicemapper
更好。devicemapper
在性能和可靠性方面有不少問題,但AuFS和OverlayFS等替代品的問題也不少[3]。這意味著整個社區(qū)對最佳存儲選項方面還有不少的爭議。目前OverlayFS的改進(jìn)最多,似乎已經(jīng)逐漸變得穩(wěn)定了,因此我們準(zhǔn)備在升級到Docker 1.12.1之后切換為使用OverlayFS。
升級Docker最大的痛苦之一在于需要重啟動,并且需要重啟動所有容器。這意味著升級過程必須進(jìn)行必要的控制,確保升級宿主機(jī)時沒有處于運(yùn)行狀態(tài)的主數(shù)據(jù)庫。希望Docker 1.12能成為我們必須關(guān)注這個問題的最后一個版本。1.12提供了在不重啟動容器的前提下重啟動并升級Docker守護(hù)進(jìn)程(Daemon)的選項。
每個新版本在帶來大量改進(jìn)和新功能的同時,也不可避免引入了一些瑕疵和問題。1.12.1看起來比老版本改進(jìn)了很多,但我們依然面臨一些局限:
- Docker成功運(yùn)行多天后,遭遇
docker inspect
時不時掛起的情況。 - 配合Userland代理(Proxy)使用橋接網(wǎng)絡(luò)會遇到TCP連接終止的怪異問題。無論配置多長的超時值,客戶端連接有時候會完全無法收到RST信號并始終保持打開狀態(tài)。
- 容器進(jìn)程偶爾會重置(Reparented)至Pid 1(init),這意味著Docker與容器的連接丟失。
- 我們經(jīng)常看到Docker守護(hù)進(jìn)程新建容器所需的時間變得很長。
總結(jié)
優(yōu)步對存儲集群的管理有下列幾個需求:
- 同一臺宿主機(jī)運(yùn)行多個容器
- 自動化
- 單點(diǎn)管理和訪問
現(xiàn)在我們已經(jīng)可以通過一個界面用簡單的工具執(zhí)行日常維護(hù)操作,所有操作均不需要直接訪問宿主機(jī):
管理控制臺截圖。在這里可以追蹤目標(biāo)狀態(tài)進(jìn)度,本例中我們首先添加第2個集群,隨后斷開復(fù)制鏈接,借此將一個集群一分為二。
通過在一臺宿主機(jī)上運(yùn)行多個容器,可以更充分地利用宿主機(jī)資源,借此即可用受控的方式對整個環(huán)境進(jìn)行升級。Docker的使用讓我們可以更快速實現(xiàn)這一切,Docker還使得我們能夠在本地測試環(huán)境中運(yùn)行完整的集群配置工作,借此對各種操作過程進(jìn)行實驗。