Android wordpress shell 微软 google java mysql apache php centos 云计算 linux Windows 程序员 开源 Firefox Python nginx 编程 Ubuntu

雲時代下的數據庫存儲——運籌帷幄的阿裏雲數據庫MongoDB

小荷才露尖尖角——初识MongoDB数据库

 

d8eb45986da11142387161644a81316e01de4298

 

在了解MongoDB數據庫之前首先介紹與MongoDB強相關的三個關鍵詞:Humongos、Scale Out和Document。

作為MongoDB名稱的由來,Humongos中文意思為極大的、巨大的,MongoDB從創辦的第一天起就是圍繞著對大數據量存儲支撐的願景來展開代碼開發的。

在數據庫產品的升級當中一般有兩個維度:第一個維度為Scale up向上升級,即隨著硬件的能力從兩核升級到四核再升級到八核向上升級的過程,但是機器終究是有上限的,此時數據庫很難突破物理機性能的瓶頸;第二個維度為MongoDB天然支持的Scale Out橫向擴展能力,當一臺機器的性能達到上限時,可以加入一臺機器組成一個新的集群。這種橫向擴展的能力使得MongoDB的集群可以不斷地去提升自身的性能和存儲能力,從而達到大數據量所需要的性能要求,也成為了MongoDB對大數據量支撐的佐證。

MongoDB是一個文檔型的數據庫,以文檔為存儲單元,而傳統的mysql等關系型數據庫是以行存為單位的,相比行存的數據庫文檔型數據庫在存儲上更為靈活,這也是在很多業務場景選擇使用文檔型數據庫來存儲業務數據的的重要原因之一。

 

8707b69cba5945f4d3415cf25b06efa357f9d34f

 

如上圖所示,假設我們要存儲一輛汽車的數據,其中包括所有的部件信息。由於每種部件所需要的信息不同,傳統的行存數據庫需要先將汽車所有的部件都拆開,分別存儲在不同的數據表中,例如發動機需要存儲的信息包括是否為燃油機、柴油機、吸氣方式、燃油效率等字段,輪胎需要存儲的信息包括輪轂高度、胎壓範圍等字段。行存數據庫的數據結構需要多張表的支撐才能完整地組成一個所需要的部件信息。

 

b2794b7dcc0ea30af619878bbbc85408588ab81c

 

文檔型數據庫不需要事先完全設計好表一樣的結構來一一映射到每個部件上,它支持動態結構,可以把每一個存儲項的項目名和值直接存儲在一個文檔當中,在數據結構上只需要簡單的幾行就可以把多張數據表的信息匯總起來,文檔型數據庫天然支持的一些數據的聚合、嵌套和數組結構的特性,提供了一個更為簡練的存儲結構、更為靈活的存儲優勢。

阿裏雲數據庫MongoDB的產品架構

6e0ffc00399150bfb62cf840fe269133492fb766

 

首先介紹的是MongoDB最為基礎最為常見的一個三副本架構,一旦創建三副本的實例,雲數據庫MongoDB會自動將三個節點部署在三臺不同的機器上,同時對外提供主節點寫入的支持以及其中一個備節點讀取的支持,兩個備節點自動從主節點獲取日誌進行數據同步。三副本架構的優勢在於,當其中某個節點出現故障時,另外一個備節點直接進行替換,系統會將之前的讀取流量切換到另外一個正在運行的備節點上,從而保證當單點出現故障時整個應用的讀寫不會受到任何影響。但這樣的架構同時會暴露出一個問題,當每臺機器上的節點性能達到物理機的上限時,很難再去擴展能力,不論是在存儲能力,或者是處理能力包括在CPU、內存這些性能指標上都很難再去達到一個突破,所以阿裏雲也支持了如下的MongoDB集群架構。

e081bb9eeae3139d0deafa997051ded22df17d17

 

在MongoDB集群架構模式中,每一個集群下都由多個三副本節點構成,每個Shard的節點依舊采用三副本來保障Shard節點的高可用,一個集群可以通過橫向擴展不斷地把Shard節點加入進來,目前最多支持32個Shard節點的添加。當一個Shard節點上面的機器性能達到上限時可以不斷地添加新的Shard節點以達到一個橫向的擴展能力,也是MongoDB作為水平橫向擴展一個非常重要的特性。不論是MongoDB三副本的架構保證一個高可用,還是是集群架構在高可用的基礎上兼容了橫向擴展的能力,由於數據庫本身對於高可用、擴展性的考慮每一個架構所對應到後端的數據庫硬件成本都有非常多個節點。

 

dea0720163c05e7407fbcc8e94bb9e0054876079

 

然而在一些實際的應用場景當中,很多用戶在一些開發、測試的日常場景使用MongoDB時,發現沒有必要使用那麽多的節點數去存儲,對於一些測試環境,我們可以容忍一定時間內的數據庫宕機,或者數據並不需要非常強的擴展性來進行支撐。阿裏雲會在近期發布一個MongoDB更為基礎的架構,即MongoDB的單節點架構,這個架構完全是針對整個MongoDB在測試、開發環境上的支撐所去構建的,它只有一個節點,一旦掛掉之後並不會有切換,而需要等待修復的過程。推薦用戶在一些微核性的場景,類似於測試、開發這樣的場景去使用,從而更好地顯示單節點架構高性價比的特性。

 

阿里云数据库MongoDB的售卖形态

 

c035969c4fad35f7131f98261cc5c30fd97e1e1c

 

阿裏雲所有的MongoDB都是基於實例規格和存儲空間兩個定價因子進行收費的,在包年包月的模式上有更為折扣的價格,而按量付費更為靈活,支持隨時啟動和釋放。在二月份到三月份,阿裏雲將會提供支持用戶從按量付費的方式進行測試之後直接轉到包年包月的方式,無需重新開啟一個新的實例去修改應用的連接方式。同時在阿裏雲目前所支持的包括三副本、集群和單節點的多種架構中,例如購買了三副本模式,購買頁面中直接把三個節點的價格形成一個匯總顯示在頁面上而不需要用戶再去自己買多個節點。

精益求精——云数据库MongoDB产品优势

 

阿里云上的MongoDB相比于一些用户在机房自建部署的MongoDB上会有哪些方面的区别?

 

安全性:访问控制和日志审计

 

26dbfb1d893621686a704266336e0c992ed4497c

 

首先從安全性上看,從2016年底到2017年中期這段時間,全球爆發了非常嚴重的MongoDB配置的漏洞問題,據不完全統計,全球大概有數十萬臺MongoDB,包括很多用戶在機房自己搭建的、在其它雲廠商上搭建的數據庫,都受到了不同程度的黑客攻擊,這些MongoDB集群在被黑客攻擊之後,完全地被黑客所控制,數據庫中的數據全部被黑客所加密,黑客在控制了這些集群之後同時向這些MongoDB的用戶發起了勒索,在數據作為安身立命重要支柱的企業當中,一旦被黑客所控制將產生嚴重的後果。在這樣一場非常嚴重的浩劫當中,阿裏雲數據庫MongoDB上所有的實體都沒有被黑客所攻破。阿裏雲在雲數據庫MongoDB上面對安全做了哪些方面的加持呢?

 

ed9e602cd1b9ac4ac045164fe22beb6e5795059e

 

首先,在訪問控制方面,阿裏雲上天然所支持的VPC專有網絡架構能夠很好地將用戶所部署的一些應用、數據庫以及其它的一些雲產品全部放到一個隔離的網絡環境內部,這個網絡環境內部就相當於我們自己在機房內所建的一個私有網絡,完全隔離於外部,在此之上雲數據庫MongoDB支持ip白名單的功能,例如可以在MongoDB的實例上去設置哪些服務器是可以連接到MongoDB上的,而當機器的IP地址不在設置列表當中時,這臺機器是完全無法連通MongoDB實體的。即使整個賬號密碼完全被竊取,也無法將不在白名單內的機器連接到MongoDB這個實體上。

e4c14e4b40c2992b735edbb53c92f81a77a28c8e

 

其次,作為對MongoDB目前所支持的一個非常重要的功能,即日誌審計的模式,可以做到完全地記錄用戶對於某一個MongoDB實例所做的一些更新、插入操作以及一些查詢時間超過100毫秒的慢查詢操作,這樣的一些操作範圍會有怎樣的作用呢?

一些企業在發生被外界所攻擊或者內部人員的數據竊取等安全事件之後,可以在日誌審計中查找完整的操作記錄,包括操作的用戶是誰、操作時間是什麽以及對MongoDB的實例做了哪些破壞性竊取性操作,使得用戶有據可查、有證可依,同時在很多的金融領域尤其是在金融監管需求下,日誌審計成為一種必要的功能。

可用性:同城容灾和异地容灾

 

0cdb182a9d0ccd005bedf2c4cd849f814a0669f8

 

雲數據庫在MongoDB可用性上所做的一些突破,如一開始所介紹的,MongoDB目前最為典型的三副本架構可以比較好地避免單點故障問題,可以保障有99.95%的SOA承諾,但是對於一些比較核心甚至敏感的業務場景還是遠遠不夠的,如果整個部署三節點的機房完全掛掉,例如出現一些斷電斷網的行為時,整個三節點會在同一時間完全地不可用,這個時間段內整個應用還是會受到影響,所以目前阿裏雲正在部署一套新的架構,很快將會在頁面上顯示,即支持將每一個MongoDB的三副本實例的三個節點部署在同一個城市內的三個機房裏,三個節點之間通過網絡連接進行內網的通訊,還是和之前單機房的三副本架構一樣,另外兩個備節點依然從主節點上去同步數據,跟之前所不同的是一旦三個機房的其中一個出現了非常嚴重的自然災害導致整個機房掛掉之後,MongoDB目前所支持的一個HA高可用系統會直接將應用流量從掛掉的實例切換到另外兩個依舊正常運行的實例上,即使是整個機房受到自然災害的影響,整個業務依然沒有任何影響。

 

91c3bb2049c0cb75f2f1253bb70835db3a234fe4

 

在同城容災的基礎上,很多的如一些證監會、銀監會對一些比較敏感的金融業務場景提出兩地三中心部署的架構需求,這樣的需求目前MongoDB已經支持上線,例如用戶在杭州的地域買到一個MongoDB的實例之後,可以在北京也開啟一個這樣的實例,而阿裏雲目前所支持的數據通道工具會將杭州的實例數據準實時地通過通道同步到北京這邊,一旦整個杭州地區出現比較嚴重的故障,整個業務流量可以整體地從杭州切換到北京,避免業務流量受到城市級自然災害的影響,從而去確保整個應用的高可用保障。

运维:备份和恢复

 

b912b786752c2ff2fe53b5eecaf0be466930aec4

 

在日常的一些運維操作當中,數據庫主要的一些故障會來自於兩個方面的原因,第一種是硬件或自然災害的影響,我們之前所介紹的三節點的高可用保障、同城容災、異地容災這些架構已經能夠很好地規避這樣的硬件故障級別的一些問題,但與此同時數據庫容易遭受第二種更為嚴重的影響,即人為的一些操作失誤,其最根本最有效的解決方法是做一個數據的歸檔、數據的恢復,所有的雲數據和MongoDB實例目前已經在備份和恢復上面做了很大的改進,一方面在備份上所有的雲數據庫、MongoDB實例都會支持每天定時定點地進行自動備份的操作,完全不需要人為的介入。

 

c8af2d94e06082a1bf77c4a5420c9bbd74bcc56a

 

此外相比於傳統的用戶通過開源版本自建的數據庫,雲數據庫MongoDB通過對內核的深度優化改良,做出一些非常重要的提升。第一點是流式備份,所有的備份直接通過網絡傳輸到雲存儲OSS上,而不在本地的機器上落地,這樣可以避免在整個備份過程當中對機器所在的IO產生影響,整個備份的速度會有10%左右的提升。第二點是物理備份,相比於官方的備份模式有更大的改進,官方目前支持的邏輯備份方式,在備份和恢復速度方面都比較慢,而在經過內核的改造之後目前已經在雲數據庫MongoDB上實現了物理備份方式的支持,效率上大致有10倍左右的性能提升。

b4dd7cef6ec17e8ef24812ee72fd0e3dd4a63599

 

在恢復方式上,目前所支持的在控制臺上的一個恢復方式稱之為克隆實例,即將用戶在設置好的備份時間點內所備份的數據文件和日誌文件自動地存儲到一個雲存儲OSS上。當用戶需要做一些恢復操作時,並不是單純地直接把之前的一個數據庫備份文件直接恢復成我們所需要的數據,由於一些時間點並沒有產生數據備份,MongoDB支持當用戶指定一個存儲周期內的時間點後,系統會自動地尋找離這個時間點最近的一個備份文件,先將備份恢復出來,然後再通過這份備份文件所存儲的一些日誌文件將整個用戶所需要的數據追溯到用戶所指定的時間點,這個時間點目前可以支持到7天之內的任意秒級別。同時數據備份並不單單直接將恢復做到原來的實際上面,因為一旦恢復之後發現整個恢復的過程、恢復的選項是錯誤的時,數據備份將會受到非常大的影響,所以克隆實例會先將數據恢復到一個全新的實例上面,在恢復完成之後用戶可以登到全新的實例上去做一些數據的仿真校驗,確認無誤之後,再將我們需要恢復的部分或全部的數據直接導入到原來的數據庫實例上面,在這個數據恢復的過程當中,既可以確保整個系統恢復安全性的保障,同時整個恢復的過程又不會影響原來數據庫的正常運行。

 

612c76165e0186d0b71988112936542d8d37a557

 

在監控方面的改良上,數據監控是數據庫運維非常核心的一個功能,目前在雲數據庫MongoDB上的控制臺會支持用戶查看非常多的包括機器本身的、引擎本身的一些監控數據,同時這些監控數據也會匯總一份到雲監控的產品上,去做一個數據更長期的存儲以及用戶針對這些數據去做一個像報警的預值設置。

同時,阿裏雲將會在近期支持一個非常獨家的功能,雲數據庫MongoDB版將會支持到整個監控數據的采集力度,從現有的5分鐘級別直接優化到秒級別,即每一秒都會有一個點,這樣采集力度的優化,在平時的運維當中會產生哪些比較大的影響呢?

 

9068ec51dd4a4765c778214cb0021378290a0e4c

 

以上兩張圖都是對同一個實例在同一個時間段內的采集,上面的圖是分鐘級的采集,下面的圖是秒級別的采集,從中我們可以看出,在秒級別中每一個數據每一個時間段內都有波峰波谷,而在分鐘級的監控圖中,整個監控過程非常的平滑,很難去發現一些問題。在平常的一些運維管理當中會發現,某一段時間內的數據庫或者是整個應用出現的一些比較大的例如應用卡頓等一些方面的影響,但是從監控數據上看整個過程又非常的平滑,很難去發現問題的所在,當切換到秒級別的監控力度上去之後,是可以很清楚很濃密地看到,在哪個時間段內性能出現了抖動,哪一個監控下出現了問題。基於這樣的數據才能夠更快地去定位到問題所產生的一些原因,更深一步地去優化這個問題對應用和整個架構所帶來的一些影響,例如一些慢查詢的優化、建立新的索引之類的優化操作。

索引推荐:多存储引擎

 

23194893293c9139cade1f62ba7a7a2c17f014d2

 

最後是對整個雲數據庫MongoDB上所支持的一個比較獨家特性的介紹,即多存儲引擎的功能,MongoDB官方目前支持的默認存儲引擎是WiredTiger,它的綜合性能非常穩定,一旦用戶使用MongoDB開源的版本去生成數據庫時,默認采用這樣的存儲引擎去支持整個數據的存儲過程,而阿裏雲數據庫MongoDB在WiredTiger的基礎上又獨家支持了TerarkDB和RocksDB這兩款存儲引擎,很多用戶根據業務的特性去選擇存儲引擎來達到性能優化、成本縮減的目的。

TerarkDB是非支持全局高壓縮技術的存儲引擎,能夠大幅度地提高一些隨機查詢的性能,在一些大數據存儲的場景中能夠有效地減少整個存儲的成本。而RocksDB存儲引擎支持大數據量持續寫入的場景,在一些官方的文檔上會有比較詳細的介紹。在相同的一些持續大數據寫入的場景測試下,通過第三方的測試工具會發現,RocksDB在該條件下依舊能夠保持長時間的非常高的穩定性寫入,推薦用戶如果有大數據量寫入或者大數據量存儲場景可以通過我們官方的文檔去了解一下我們目前所支持的這兩款存儲引擎。

 

906ecdc3acd3c2a57eb5e66e0cf010dd84ba5642

 

通過上述的一些介紹,我們可以發現相比於用戶自建的MongoDB實例,雲數據庫MongoDB無論是在可用性、擴展性、整個安全上的如訪問控制、審計日誌這樣一些獨家的功能、自動備份、克隆恢復、以及即將獨家支持的秒級監控、索引推薦優化等功能上都存在非常大的優勢,如果用戶自建數據庫的話將會投入非常大的開發力量。

实践是检验真理的唯一标准——MongoDB的典型场景

 

b9b85421a884f8b3a89b5a2d6cf19f596669a6d5

 

物聯網行業中,由於許多物聯網設備每時每刻都在通過傳感器向服務端寫入一些數據,所以物聯網第一個特性就是整體的數據量非常大,在這種情況下MongoDB的集群版所支持的橫向擴展的能力能夠很好地支撐數據量不斷地寫入,而不必像一些單機的數據庫那樣一旦達到整個機器上限時還需要另外做連接地址、數據庫更換性能的優化操作,Sharding模式可以持續地實現一個水平能力的擴展。物聯網第二個特性就是數據結構非常靈活,例如可穿戴設備,它所采集的一些數據的特征都是各不相同的,在這種情況下我們一開始所介紹的MongoDB很靈活的文檔型結構就可以很好地去支撐這種豐富的結構數據擴展。整個物聯網最終訴求就是基於如此大量的數據存儲之後,還需要在這些存儲的數據上面做一個分析最後匯總成一個結果反饋到每一個客戶端或服務端上形成一些結果的展示和數據的決策,在這種情況下MongoDB自身所支持的一些低壓條件可以很好地去做大數據分析的支持,所以在物聯網這個行業上面不論是從數據的存儲、大數據的支撐以及數據分析的支持上MongoDB各方面的特性都可以得到非常淋漓盡致的展示。

 

b9d082fffca8f3f5d6d00104aa841694270cba1e

 

遊戲行業中,首先MongoDB Document這樣一個非常靈活的架構支持,可以支撐遊戲應用上非常多的功能擴展,其次一旦整個遊戲開始進入推廣期之後,它需要不斷地去做一些開服的操作來支撐大量的用戶量,這些開服操作在之前很多的運維的順序是,需要先去建一個服務器,再去建一個同樣的MongoDB數據庫,再通過數據拉取導入等方式將本來數據庫裏的數據轉移到新的數據庫當中,因為遊戲開服以後兩邊的數據庫結構差別不是很大,這樣的一套操作需要消耗運維非常多的時間和精力,所以在這樣的場景之下克隆實例能夠很好地發揮這樣的功能,當用戶需要做一個開服操作時,只需要在原先的數據庫實例(稱為母實例)上面直接通過克隆實例的功能選擇它所需要克隆實例的數量以及它克隆的整個數據需要基於哪個備份文件和指定一個克隆時間點可以是當前的時間點,在做完這幾步操作之後,系統會自動根據用戶的訴求生成多個一模一樣的數據庫實例,這些數據庫實例不僅可以在規格和性能上保持一致,同時在裏面的數據上也可以跟用戶之前的數據庫保持一致,可以幫助遊戲行業在開服這個操作上提高效率。

850403a2337cfc52fc1a66b4a084816620052183

 

地理信息行業中,首先MongoDB自身天然地支持像地理信息數據索引的一些操作,可以很方便地應用於一些應用場景,如經緯度的查詢、坐標的精確查詢等數據操作的支持,這是MongoDB本身就支持的一些特性。同時地理信息的行業會經常需要從各地采集數據匯總到某個中心庫上形成一個信息的匯總,目前雲數據庫MongoDB已經支持了這樣一個數據通道的功能,可以幫助用戶很輕松地構建這樣一個數據匯總操作,幫助用戶將各地分布的分布節點上所存儲的數據自動同步到一個中心庫上,從而永久性地確保中心庫上的數據永遠是最全面的,同時可以幫助用戶節省很多像數據同步、數據更新的一些自動同步操作。

延伸阅读

评论