摘? 要:進入Web3.0時代,網(wǎng)絡(luò)數(shù)據(jù)呈現(xiàn)出虛擬化和多元化的發(fā)展趨勢?;ヂ?lián)網(wǎng)上包含的信息種類不斷增加,例如地理信息、智能語音、復雜的人脈關(guān)系等,此外,網(wǎng)絡(luò)上的信息量每天都在高速增長。如何高效地存儲這些信息,并且可以在服務器發(fā)生故障時迅速從故障中恢復數(shù)據(jù),便成了網(wǎng)絡(luò)服務提供者必須重視的問題。MongoDB以其數(shù)據(jù)并發(fā)讀寫速度高、擴展性好、容錯性高、故障自動恢復等特點,在海量數(shù)據(jù)的存儲與分析中被廣泛應用。本文介紹了MongoDB的三種集群方案,并對集群方案的性能進行了對比分析,希望能為相關(guān)使用者提供一些借鑒和幫助。
關(guān)鍵詞:MongoDB集群;數(shù)據(jù)高可用性;負載均衡? ? ? ? ? ? ? ? ? ? ? ? ?中圖分類號:TP311.13? ? ? ? ? ? ? ? ? ? ?文獻標識碼:A
文章編號:1671-0134(2020)08-115-02? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?DOI:10.19483/j.cnki.11-4653/n.2020.08.030
本文著錄格式:賈成果.MongoDB三種集群方案研究及性能對比分析[J].中國傳媒科技,2020(8):115-116.
1. MongoDB優(yōu)勢概述
MongoDB是一個基于分布式文件存儲的數(shù)據(jù)庫,內(nèi)核由C++語言編寫,旨在為WEB應用提供可擴展的高性能數(shù)據(jù)存儲解決方案。[1]MongoDB是典型的NoSQL數(shù)據(jù)庫,具有NoSQL數(shù)據(jù)庫的所有優(yōu)點:
(1)數(shù)據(jù)并發(fā)讀寫速度高,可以瞬時處理海量數(shù)據(jù),應對幾十萬次每秒的讀寫操作;
(2)擴展性好,容易組建硬件集群以提高運算速度;
(3)部署成本低,即使在廉價服務器上也可以有不錯的讀寫效能;
(4)數(shù)據(jù)格式貼近編程語言,以JSON對象存儲數(shù)據(jù);
(5) MongoDB還支持索引、故障恢復、云計算以及Java、Ruby、PHP、C++等多種開發(fā)語言。
MongoDB通過集群實現(xiàn)數(shù)據(jù)的冗余備份,并在多個服務器上存儲數(shù)據(jù)副本,保證數(shù)據(jù)的完整性和安全性。
2. MongoDB三種集群方案研究
MongoDB的集群方案共有三種:ReplicaSet、Sharding和Master/Slave。這三種集群方案均可跨平臺實現(xiàn),無論是在Linux系統(tǒng)還是Windows系統(tǒng)上,都可以實現(xiàn)MongoDB集群。
2.1 ReplicaSet集群方案
ReplicaSet被稱為副本集,是多個MongoDB節(jié)點組成的集群,主服務器節(jié)點掛掉,備用服務器節(jié)點可以繼續(xù)提供服務。ReplicaSet最小的集群需要使用三個MongoDB服務器,一個主服務器、一個備用服務器、一個仲裁服務器。主節(jié)點和備用節(jié)點可以存儲數(shù)據(jù),仲裁節(jié)點用于判斷主節(jié)點是否掛掉,是否應該讓備用節(jié)點接替主節(jié)點的工作。備用節(jié)點會實時與主節(jié)點同步數(shù)據(jù),以保證數(shù)據(jù)的一致性。[2]客戶端要連接主服務器和備用服務器,而不需要連接仲裁服務器。
默認設(shè)置下,主節(jié)點提供所有的CRUD(創(chuàng)建、讀取、更新、刪除)操作,備用節(jié)點不提供任何服務。仲裁節(jié)點是很特殊的服務節(jié)點,它的工作是負責檢測主節(jié)點的工作狀態(tài)。一旦主節(jié)點宕機,仲裁節(jié)點就會從諸多備用節(jié)點中挑選出一個充當主節(jié)點,其他備用節(jié)點將與新主節(jié)點同步數(shù)據(jù)。如果前任主節(jié)點恢復了,那么仲裁節(jié)點就會讓現(xiàn)任主節(jié)點變?yōu)閭溆霉?jié)點,其他備選節(jié)點將與新主節(jié)點同步數(shù)據(jù)。
ReplicaSet集群方式的好處是數(shù)據(jù)是完整的,不會因為服務器崩潰而丟失數(shù)據(jù)。但是ReplicaSet最明顯的缺點是客戶端需要自主判斷哪個MongoDB是當前主節(jié)點服務器,然后連接這個服務器。
2.2 Sharding集群方案
Sharding(數(shù)據(jù)分片)是一種可水平擴展的集群模式,適用于數(shù)據(jù)量巨大的場合,與ReplicaSet集群的主備服務器節(jié)點實時同步數(shù)據(jù)不同,Sharding集群是采用分片機制存儲數(shù)據(jù)的,即通過把數(shù)據(jù)切分到不同的數(shù)據(jù)節(jié)點上存儲來提高整體系統(tǒng)的可靠性和數(shù)據(jù)一致性。數(shù)據(jù)切分后,索引深度也會隨之減小,索引查找速度隨之提高。
Sharding集群分為3大部分:shard節(jié)點、config節(jié)點和mongos節(jié)點。shard節(jié)點是實際存放數(shù)據(jù)的節(jié)點,每個shard節(jié)點的數(shù)據(jù)都被分為若干個chunk(數(shù)據(jù)塊)來管理,每個chunk的取值范圍(shard key)都記錄在config節(jié)點上。實際應用中shard往往采用ReplicaSet集群來實現(xiàn)高可用性。config節(jié)點是存儲配置信息的節(jié)點,包括集群的配置信息、數(shù)據(jù)存儲于哪些shard節(jié)點等。mongos節(jié)點是查詢路由節(jié)點,負責把數(shù)據(jù)請求轉(zhuǎn)發(fā)到對應的shard服務器上,也是客戶端直接訪問的節(jié)點,提供Sharding集群對外操作接口。
Sharding集群的特色就是自動化。具體體現(xiàn)為可以動態(tài)擴容、自動平衡數(shù)據(jù),以及透明的使用接口。可以從一個普通的 ReplicaSet平滑升級,動態(tài)增加或刪除節(jié)點,響應數(shù)據(jù)的快速增長??梢宰詣釉诠?jié)點間平衡數(shù)據(jù)量,避免負載集中在少數(shù)節(jié)點,而在這期間不影響數(shù)據(jù)庫讀寫訪問。對客戶端,可以使用完全相同的驅(qū)動,大部分功能可用,基本不需要更改任何代碼。[3]
2.3 Master/Slave集群方案
在Master/Slave(主/從)集群方案中,所有對數(shù)據(jù)修改的操作會被記錄在oplog日志中(查詢操作不會記錄)。當主節(jié)點數(shù)據(jù)發(fā)生改變,對應的操作就被記錄在oplog中。oplog日志空間大小是固定的。從節(jié)點復制oplog內(nèi)容,然后應用這些修改。
由于復制是異步的,如果從節(jié)點的操作已經(jīng)被主節(jié)點落下很遠,oplog日志在從節(jié)點上還沒執(zhí)行完,oplog日志內(nèi)容就有可能被覆蓋。從節(jié)點跟不上同步,主從節(jié)點間的數(shù)據(jù)同步就會停下,重新做完整的主從數(shù)據(jù)同步,這種情況會造成主從節(jié)點數(shù)據(jù)不一致,損壞數(shù)據(jù)完整性。為了避免此種情況,應盡量保證主節(jié)點的oplog足夠大,能夠存放相當長時間的操作記錄。[4]
3. 三種集群方案對比及性能分析
MongoDB的三種集群方案都可以跨平臺實現(xiàn),無論在Linux還是Windows系統(tǒng)中都可以進行集群操作。其中ReplicaSet和Master/Slave集群方案都可以實現(xiàn)數(shù)據(jù)同步,都能作為冗余備份的方案。而Sharding集群作為在數(shù)據(jù)量巨大情況下數(shù)據(jù)切分存儲的方案,可以更好地解決單一數(shù)據(jù)庫性能不足的問題。
3.1 ReplicaSet和Master/Slave集群方案對比及性能分析
(1)失效備援:Master/Slave方案中,如果主節(jié)點宕掉了,從節(jié)點無法接替寫數(shù)據(jù)的任務,系統(tǒng)將只能提供讀取服務,即主節(jié)點無法自動恢復。[5]而ReplicaSet方案中,如果主節(jié)點宕掉了,會立即選舉出一個新的主節(jié)點,系統(tǒng)不受影響,可以繼續(xù)提供服務。對于高可用可用性來說,ReplicaSet是完勝的。
(2)負載均衡:兩種方案的主節(jié)點數(shù)據(jù)庫都可以讀寫,從節(jié)點數(shù)據(jù)庫只具有數(shù)據(jù)備份和數(shù)據(jù)讀取功能。
(3)故障恢復:Master/Slave方案中,如果主節(jié)點出故障了,重啟后依然是主節(jié)點,無須恢復。因為在主節(jié)點故障期間,系統(tǒng)只能提供讀取服務,無法寫入數(shù)據(jù)。ReplicaSet方案中,原主節(jié)點故障重啟后變?yōu)閺墓?jié)點,自動與當前的主節(jié)點同步數(shù)據(jù)。因此ReplicaSet方案中,主節(jié)點宕機對系統(tǒng)沒有影響。
3.2 Sharding集群方案性能分析
(1)失效備援:Sharding集群中每個shard節(jié)點通常采用ReplicaSet集群來實現(xiàn)高可用性,避免出現(xiàn)某個shard節(jié)點出現(xiàn)故障而影響數(shù)據(jù)庫服務或者造成數(shù)據(jù)丟失的問題。每個config節(jié)點都存儲了全部的chunk信息,某個config節(jié)點故障并不影響shard節(jié)點的讀寫,只是shard節(jié)點數(shù)據(jù)瞬時不能遷移和自動均衡而已。Mongos節(jié)點是無狀態(tài)的,負責轉(zhuǎn)發(fā)客戶端的數(shù)據(jù)請求,并不會保存任何數(shù)據(jù)和配置信息,單個節(jié)點故障也并不會影響系統(tǒng)運行,因此Sharding集群可以保證系統(tǒng)的高可用性。
(2)負載均衡:Sharding集群通過數(shù)據(jù)分片機制將數(shù)據(jù)存儲在多個數(shù)據(jù)節(jié)點上,減少了單機存儲空間,提高了總存儲空間,通過設(shè)置多個mongos節(jié)點,使客戶端的請求不集中在單一服務器上,提高了總負載。此外,mongos節(jié)點上的balancer機制,會促使每個shard節(jié)點上的數(shù)據(jù)塊大小趨于平衡,減小單一節(jié)點的讀寫壓力。
(3)故障恢復:Sharding集群中,即使集群中的一個或多個分片不可用,集群也可以繼續(xù)執(zhí)行一部分讀寫操作。在宕機期間,不可用的分片上的數(shù)據(jù)是不能處理的,可用分片上的讀寫操作是可以被成功處理的。實際應用中,每一個數(shù)據(jù)分片(shard)將被部署成ReplicaSet,確保每個數(shù)據(jù)節(jié)點都具有備份、自動容錯轉(zhuǎn)移、自動恢復能力,提供了可增長的冗余和高可用性。
結(jié)語
綜上,在一般數(shù)據(jù)量大小的場景中,ReplicaSet集群方案的數(shù)據(jù)安全性、高可用性以及對硬件設(shè)備的要求等都有巨大優(yōu)越性,應優(yōu)先考慮。在儲存海量數(shù)據(jù)、瞬時并發(fā)讀寫高的場景中,Sharding集群更適合,因為Sharding集群需要更多的服務器,集群配置過程也是三種集群方案中最復雜的。
參考文獻
[1]陳敬靜,馬明棟,王得玉. MongoDB負載均衡算法優(yōu)化研究[J]. 計算機技術(shù)與發(fā)展,2020,30(03):88-92.
[2]施曉峰.基于分布式NoSQL數(shù)據(jù)庫的檔案大數(shù)據(jù)存儲與檢索方案研究[J].計算機應用與軟件,2019,36(05):15-20.
[3]熊峰,劉宇.基于MongoDB的數(shù)據(jù)分片與分配策略研究[J].計算機與數(shù)字工程,2019,47(04):892-897.
[4]牛初九. MongoDB之分片集群(Sharding)[EB/OL]. https://www.jianshu.com/p/3d44dcbd12ff.
[5] 張文盛,鄭漢華.基于MongoDB構(gòu)建高性能網(wǎng)站技術(shù)研究[J].吉林師范大學學報(自然科學版),2013,34(01):123-127.
作者簡介:賈成果(1987-),男,河北承德,助理工程師。