
2015-08-08 &nbs≤™¥p;| 發布者→↓ :梁國(guó)芳 | &•φδ©nbsp; 查看(kàn):3320次
IT新聞
作(zuò)為(wèi)雲計(jì)算(su$ ≥àn)服務中的(de)重要(yào)一(yī)環,雲數(shù)據庫提供了∏φ★(le)可(kě)彈性伸縮的(de)結構化(huà)、半☆∑結構化(huà)和(hé)非結構化(huà)數(shù)>•♥據的(de)存儲服務。用(yòng)戶可(kě)以根據自(zì)α≥♠¥身(shēn)業(yè)務狀況,按需購(gòu→±≥÷)買,一(yī)鍵部署,按需擴展。換句話(huà)說(shuō★↑♠←),用(yòng)戶可(kě)以直接省去(qù)中間(jiān)一(yī)系₩α€列繁瑣的(de)資源調配、配置優化(huà)等工(gōng)作(zuò)✔×¶,這(zhè)樣托管式的(de)運維模式,為(wèi) ©用(yòng)戶帶來(lái)了(le)極好(hǎo) 的(de)體(tǐ)驗。
但(dàn)是(shì),雲數(shù)據庫服務對(duì)可(kě)•↕用(yòng)性和(hé)性能(néng)有(yǒu)極高(₽₹♥÷gāo)的(de)要(yào)求,這(zhè)也(yě)正是(shì)用(yλ♦↕©òng)戶最為(wèi)關心的(de)話(huà)題。UClo☆∞Ωud提供的(de)雲數(shù)據庫服務U✘♦DB(UCloud Database),完全兼容MySQL ×和(hé)MongoDB協議(yì),其中在ε↕♣構建高(gāo)可(kě)用(yòng)、高(ε♠gāo)擴展性的(de)MongoDB雲數(shù)據庫服務過程中,采用(☆÷≠₩yòng)了(le)Docker容器(qì)技(jì)術(s←$≈hù)。本文(wén)将介紹Docker容器(qì)技(jì)術(shù)在M±↔σongoDB雲數(shù)據庫服務中的(de)應用(yòng)實踐。α
MongoDB是(shì)NoSQL領域非常優秀的(de)面向文(wén)檔的φ₩€→(de)非關系型數(shù)據庫,适用(yòng)場(chǎng)景↑₹是(shì)非常的(de)廣泛,可(kě)以是(shì)業(y£≈✘♥è)務類、日(rì)志(zhì)類、監控類、元數(shù)據、文(w$®÷én)件(jiàn)存儲等場(chǎng±©)景,普遍的(de)特點是(shì)數(shù)據增長(cΩ"háng)快(kuài),Schema多(duō)樣。當單表的(de→÷£)數(shù)據量達到(dào)TB級别時(shí),關系數÷®↔•(shù)據庫管理(lǐ)系統(RDBMS)很(hěn)可(kě)能<±(néng)就(jiù)力不(bù)從(có★ §ng)心。此外(wài),單點壓力和(hé)單點故障更是(shì)普÷∞σ遍存在的(de)問(wèn)題,還(hái)有(yǒu)成本控制(↕₽Ωzhì)和(hé)管理(lǐ)運維等問(wèn)題。
面對(duì)這(zhè)些(xiē)問(wèn)題,MongoDB雲數(✘φshù)據庫服務提供了(le)較好(hǎo)的(de)解決方案。MongoDB&♦不(bù)僅可(kě)以通(tōng)過水(→λ§shuǐ)平分(fēn)片(sharding)來(lá♥αi)解決單點負載極限的(de)問(wèn)題,還(hái)可(>α¥kě)以通(tōng)過副本集(replica s'↑et)解決高(gāo)可(kě)用(yòng)和(hé)讀(dú)'"π寫分(fēn)離(lí)等問(wèn)題。另外(wài),結合雲平台優勢✘♥§←,充分(fēn)利用(yòng)物(wù)理(★ lǐ)資源,降低(dī)集群部署的(deσ↔)成本,也(yě)借助雲平台,達到(dào)易部署、易管€&♦理(lǐ)的(de)目的(de)。具有(yǒ¥§λu)高(gāo)可(kě)用(yòng)、高(gāo)擴展性的★∑€÷(de)MongoDB雲數(shù)據庫σ♦¥的(de)典型分(fēn)布式架構包括以下(xià)三類組φ®™件(jiàn):
(1)shardsvr
每個(gè)分(fēn)片是(shì)一(yī)個(gè)副本集,集群可§≠₩(kě)有(yǒu)1個(gè)至多(duō)個(gè)分(fēn¥≥)片shardsvr,提供數(shù)據存"≤×γ儲服務,存儲整個(gè)集群的(de)某部分(σδfēn)數(shù)據。副本集按角色區(qū)分(fēn),可&δ&↕(kě)分(fēn)為(wèi)prima♠¶✘♥ry、secondary、arbiter,分(fēn)别為(≤≠↑wèi)主節點、從(cóng)節點、仲裁節點 ₹♦。主節點可(kě)讀(dú)寫,從(cóng)節點隻讀(dú),仲裁節點參與≈ε÷✘auto-failover選舉投票(piào)。通(tōng)常一(yī)個(gè)副本集是(shì)一(yī)主一(yī)從(cóng)一(y'©↓ī)仲裁的(de)結構,從(cóng)節點也(yě)可β← (kě)以更多(duō),建議(yì)是(shì)維持副 ♣≥本集總節點數(shù)為(wèi)奇數(shù)。主節點一(yī)旦出現( ∞₽÷xiàn)不(bù)可(kě)達情況,剩∏π'餘節點自(zì)動選舉出新主節點,實現(xiàn) •auto-failover。可(kě)以為(wèΩ→®>i)當前規模的(de)集群新增分(fēn)片數(shù)量,φ ↓各分(fēn)片自(zì)動均衡數(shù)據,實現(xiàn)水¶∏∑(shuǐ)平擴展。
(2)configsvr
集群可(kě)以有(yǒu)1個(gè)或者3個♣≤↓(gè)配置服務器(qì)configsvr,主要(yào)提供集群的(dΩ®≈e)元數(shù)據存儲服務,記錄集群數(shù)據分(fēn ≠)布。
(3)mongos
mongos是(shì)整個(gè)集群的(de)入口,提供查詢的∏Ω≈(de)路(lù)由分(fēn)發和(hé)結果聚合₽ε服務,集群可(kě)有(yǒu)1個(gè)或者多(duō)個(gè)路 ♦ (lù)由服務器(qì)mongos。

圖:UDB平台上(shàng)MongoDB集群的(de)架構圖
從(cóng)我們的(de)視(shì)角,雲數(shù)據庫服務需要☆>(yào)克服多(duō)方面的(de)問(™₽wèn)題,因為(wèi)雲化(huà)意味著§☆(zhe)面對(duì)的(de)是(sh↕γì)多(duō)租戶環境,需為(wèi)之協調物©£®(wù)理(lǐ)資源、設定資源配額;從★≈>(cóng)成本控制(zhì)來(lái)講,我 σ 們希望能(néng)夠充分(fēn)利用(yòng)≥π←物(wù)理(lǐ)機(jī)資源,到(dào)達降低(dī)£¶成本的(de)目的(de);由于每個(gè)D↑§"B實例行(xíng)為(wèi)不(bù) >可(kě)預知(zhī),多(duō)租戶環境下(ε←βxià)必須嚴格把控資源隔離(lí),避免資源競争,這(zhè)就(jiùδ&∞®)要(yào)求更高(gāo)的(de) €<σ多(duō)租戶環境可(kě)控和(hé)安全;透明€'¶(míng)的(de)雲數(shù)據庫服務,任何可(kě)能(néng)的♠•(de)物(wù)理(lǐ)故障都(dōu)有(yǒu)可(kě)能(£φ±néng)随時(shí)發生(shēng),可(kě)運維和(hé)可(£♣kě)移植就(jiù)顯得(de)非常重要(yào)。βΩ↔
面對(duì)以上(shàng)難題,虛∞δ®拟機(jī)VM或許是(shì)一(yī)種選擇,但(dà$®n)是(shì)對(duì)雲數(shù)據庫應↓✔♣®用(yòng)來(lái)講,有(yǒu)比較大(dà)的(↓≥©₽de)局限性。所以,容器(qì)技(jì)術(shù)®會(huì)是(shì)一(yī)種更好 ♠∏(hǎo)的(de)選擇,比如(rú)DocΩ€ ker。
1.相(xiàng)比虛拟機(jī),Dockφγ←"er是(shì)一(yī)種輕量化(huà)虛拟α ™化(huà)技(jì)術(shù),輕量意味著(zhe)✔β"$占用(yòng)資源少(shǎo),損耗低(dī),啓動快(k×₹↑uài),這(zhè)對(duì)構建快(kuài)速交付的(de)運行(xí©☆ng)時(shí)環境非常有(yǒu)利。
2.以Docker為(wèi)代表的(de)容器(qì)技( λjì)術(shù)出現(xiàn),使架構轉向微(wēi)服務≤¥★σ的(de)設計(jì)模式,微(wēi)服務基本思路(lù)是(shì)£¶∑将服務單元化(huà)和(hé)标準化(huà),關注每★♠個(gè)原子(zǐ)服務最基本功能(néng)。
MongoDB集群是(shì)典型的(de> γ)分(fēn)布式系統,可(kě)利用(yòng)容器(qì)封裝幹淨≤π的(de)運行(xíng)時(shí)環境,容器(qì)來(lái)封↕↕β裝微(wēi)服務單元,即各類型的(de)DB實例,容器(₩∑↕qì)之間(jiān)保持互通(tōng),重組成完σ ≈整的(de)集群,提供完整的(de)數(sσhù)據服務。所以,結合容器(qì)技(jì)術¶¶≥(shù)構建MongoDB集群是(shì)一(yī)種非常好(h<≈ǎo)的(de)實踐手段。
從(cóng)多(duō)個(gè)角度來(lái)看(kàn), Dockeφ©r對(duì)MongoDB雲服務而言,存π↔在互補,在衆多(duō)方面是(shì)特性增強。

在UDB控制(zhì)台上(shàng)創建一(yī)個(gè)MongoD¥ '≥B實例,選擇DB類别,選擇物(wù)理(↕ ≈÷lǐ)(內(nèi)存和(hé)磁盤)配置,由cons✔∏ole通(tōng)過 API調用(yòng)向後端API₩"-gateway發起,經過資源注冊、訂單、資源分(fē✘γγn)配(包括ip、內(nèi)存和(héβ•€)磁盤)、實例化(huà)等過程後,在資源池中啓動一(yī)個γσ(gè)裝載DB實例的(de)容器(qì)。DB實例在內(nèi)網暴露IPδ←和(hé)port來(lái)提供訪問(wèn),這€≠(zhè)也(yě)是(shì)訪問(wèn)DB的(de)唯一(yī)方式 ≠α。

圖:集群實例分(fēn)布效果圖
通(tōng)過最為(wèi)簡單的(de)創建、組合≠λ←≤兩步,一(yī)個(gè)完整集群就(ji$→£♠ù)呈現(xiàn)出來(lái)。後端按可(kě)用(yòng)性來(lá↔♦→i)規避副本集內(nèi)的(de)節點部署在同台宿主機(jī),每個α↑×(gè)Docker Engine上(shà∏₽ng)可(kě)以運行(xíng)(起)多(duō¶≤)個(gè)容器(qì)。

圖:集群部署示意圖
我們在大(dà)規模部署Docker的(de)生(shēng)産≠>環境的(de)過程中,也(yě)總結了(le)一(yī)些(xiē)經驗 ₩₹,分(fēn)享如(rú)下(xià):
1.Image
(1)制(zhì)作(zuò)基礎鏡像,要(yào)求是(shì)£₩✔ 幹淨、安全的(de),推薦使用(yòng)官網的(de)基礎鏡β™♣像;
(2)使用(yòng)Dockerfile或者其他(tā)工(gōng)具,£ 注意安裝必要(yào)的(de)工(gōng)具鏈απ★γ;
(3)建議(yì)對(duì)Image有(yǒu)合理(lǐ)→¶的(de)版本叠代,逐步完善工(gōng)具¶$γ鏈,對(duì)運維和(hé)問(wèn)題排§ &查帶來(lái)極大(dà)的(de)便利。
2.操作(zuò)系統
(1)注意內(nèi)核版本與Docker版本适配;
(2)注意使用(yòng)Cgroup默認挂載;
(3)提高(gāo)最大(dà)文(wén)件(jiàn)數(shù)限制(z↔↔≥hì),以避免DB連接數(shù)受限。
3.數(shù)據持久化(huà)
(1)數(shù)據卷挂載;
(2)為(wèi)數(shù)據卷設置合± 理(lǐ)讀(dú)寫權限。
4.網絡設置
(1)自(zì)定義網橋,限制(zhì)dockεγer0;
(2)內(nèi)網建議(yì)按多(duō)租戶隔離 ♣↑(lí);
(3)不(bù)作(zuò)DB端口映射;
(4)按需配置DNS。
5.安全加強
(1)啓動SELinux/GRSEC等安全機(jī)制(zhì);
(2)啓用(yòng)能(néng)力機(jī'©✘☆)制(zhì),控制(zhì)某些(xiē)超級♣←§權限。
6.Docker Daemon防護
(1)禁止宿主機(jī)的(de)根目錄映射;
(2)禁止濫用(yòng)root權限。≤↔↕☆
其中,網絡設置、安全加強和(hé)Docker↑ Daemon三點主要(yào)是(shì)針對λ≥>(duì)安全方面的(de),安全性還(hái)是(shì)非常值得(¥$✔de)關注的(de)。容器(qì)在虛拟網絡層面已®←σ按多(duō)租戶內(nèi)網隔離(lí),跨用(yòng)戶是(shì)無π§≠法訪問(wèn)的(de)。此外(wài),不(bù)提供途徑訪問(α☆δwèn)容器(qì),用(yòng)戶唯一(yī)可(×kě)以訪問(wèn)的(de)是(shì)DB服務。因為(wèi)DB φ✘±實例被嚴格限制(zhì)在容器(qì)裡(l→ φπǐ),而且數(shù)據落地(dì)最終在外(wài)部→λ≤設備,那(nà)麽可(kě)以認為(wèi)這(zhè)Ω♠樣的(de)容器(qì)它是(shì)輕容器(qì),帶IP+內(nè≈δ≈i)存緩存,就(jiù)很(hěn)容易實現(xiàn)對(duì)DB←實例在線擴容、縮容,或者在某些(xiē)物(wù)理(l✘♣≈ǐ)故障預警情況下(xià),提前在線遷移。
此外(wài),在保證服務的(de)可( ¶↕kě)靠性方面,多(duō)方面的(de)監控、告→↕警是(shì)非常必要(yào)的(de)§ ,建議(yì)從(cóng)宿主機(jī)存活、網絡連通(tōng)性,Doc←¥ker Daemon,容器(qì)存活和(δ'₹hé)DB實例存活、網絡聯通(tōng)性四個(gè)層次展開™€(kāi)。一(yī)旦出現(xiàn)問(wèn)題,可(kě)借助★÷log進行(xíng)診斷分(fēn)析ε♦•★,如(rú)宿主機(jī)(/var/log/♣σ 'messages)、Docker(/var/lo<×>±g/docker)、DB系統日(rì)志(zhì)和(hé)業(→×yè)務邏輯等日(rì)志(zhì)。
借助容器(qì)技(jì)術(shù)在多(duō)租戶∏↓™÷環境下(xià),封裝一(yī)個(gè)安全的(de)DB運行(xínελg)時(shí)環境,做(zuò)到(d£ εào)資源限額和(hé)隔離(lí),結合雲↔©↕平台,真正做(zuò)到(dào)方便快(kuài)捷地(dì§π)部署MongoDB集群。目前,UDB ¥∏→for MongoDB雲數(shù)據庫服務已經穩定運營達一(yī)年(n≤∞ián)半,已有(yǒu)數(shù)千個(gè)容≤∞器(qì)在運行(xíng)。希望本文(wén)提到(dà©×βo)的(de)部署和(hé)運維經驗,能(néng)為(wèi)λ↔正在使用(yòng)Docker或是(shì)即将使用(yò♠¥γαng)Docker技(jì)術(shù)的(de)朋(pε→וéng)友(yǒu)提供一(yī)些(xiē)幫助。
