牛倩
摘要:MongoDB為了提高處理大數(shù)據(jù)量時(shí)的性能,提供了自動(dòng)分片的技術(shù)。MongoDB的分片是集合級(jí)別的,根據(jù)基于分區(qū)的片鍵可以將數(shù)據(jù)集合均勻的分布在各片上。文中在研究MongoDB特點(diǎn)的基礎(chǔ)上,著重分析自動(dòng)分片技術(shù)的應(yīng)用。對(duì)比普通和分片情況下的MongoDB性能,提出使用基于分區(qū)的MongoDB自動(dòng)分片技術(shù)可以提高數(shù)據(jù)量較大時(shí)的性能,使MongoDB更穩(wěn)定。對(duì)比片索引和普通索引的性能,提出對(duì)于使用非常頻繁的查詢或?qū)懖僮?,?yīng)使用基于片鍵的索引,可以大幅度提高M(jìn)ongoDB的性能。
關(guān)鍵詞:MongoDB 自動(dòng)分片 性能測(cè)試 非關(guān)系型數(shù)據(jù)庫(kù)
中圖分類號(hào):TP311.13 文獻(xiàn)識(shí)別碼:A 文章編號(hào):1007-9416(2016)06-0000-00
1 MongoDB介紹
MongoDB是一種強(qiáng)大、靈活、可擴(kuò)展的數(shù)據(jù)存儲(chǔ)方式。它擴(kuò)展了關(guān)系型數(shù)據(jù)庫(kù)的眾多有用功能,如輔助索引、范圍查詢和排序。MongoDB的功能非常豐富,比如內(nèi)置的對(duì)MapReduce式聚合的支持,以及對(duì)地理空間索引的支持。MongoDB既有優(yōu)點(diǎn)也有缺點(diǎn),但是總體來(lái)說(shuō)還是相當(dāng)不錯(cuò)的,它是NoSQL數(shù)據(jù)庫(kù)中最接近SQL數(shù)據(jù)的一種基于文檔的數(shù)據(jù)庫(kù)產(chǎn)品,主要為網(wǎng)頁(yè)應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案,并且已經(jīng)應(yīng)用在一些世界頂級(jí)的互聯(lián)網(wǎng)公司的產(chǎn)品中。
2 MongoDB的自動(dòng)分片技術(shù)介紹
使用自動(dòng)分片技術(shù)的MongoDB集群包括以下三個(gè)組件:分片服務(wù)器、路由服務(wù)器配置服務(wù)器。
分片服務(wù)器負(fù)責(zé)存儲(chǔ)數(shù)據(jù)。為了提供高可用性和數(shù)據(jù)一致性,在生產(chǎn)環(huán)境中,分片服務(wù)器集群中,每一個(gè)片都是一個(gè)副本集。如果是開(kāi)發(fā)環(huán)境或者測(cè)試環(huán)境中,可以不采用副本集機(jī)制。本文主要研究MongoDB的自動(dòng)分片技術(shù),為了更好的觀察MongoDB的自動(dòng)分片技術(shù)本文中的每一個(gè)片都是一個(gè)單獨(dú)的Mongod服務(wù),并沒(méi)有采用副本集技術(shù)。
路由服務(wù)器,也可稱為查詢路由服務(wù)器,它是mongos實(shí)例程序,接收客戶端的請(qǐng)求,把請(qǐng)求直接分發(fā)給適當(dāng)?shù)囊粋€(gè)或幾個(gè)分片服務(wù)器,收集分片服務(wù)器的操作結(jié)果匯總成最終結(jié)果,然后將最終結(jié)果返回給客戶端。一個(gè)MongoDB集群可以有多個(gè)路由服務(wù)器。
配置服務(wù)器存儲(chǔ)MongoDB集群的元數(shù)據(jù)。包括數(shù)據(jù)的分片策略。路由服務(wù)器根據(jù)這些元數(shù)據(jù)把請(qǐng)求分發(fā)到特殊的分片服務(wù)器。并且在3.2版本以后,配置服務(wù)器可以應(yīng)用副本集機(jī)制。
3 性能測(cè)試
此次測(cè)試共涉及5臺(tái)服務(wù)器:3臺(tái)MongoDB服務(wù)器。機(jī)器配置:CPU 為 Intel(R) Core (TM) i7-5500U CPU @ 2.40GHz、內(nèi)存為16G、硬盤(pán)1T、操作系統(tǒng)為L(zhǎng)inux。分別在3臺(tái)機(jī)器運(yùn)行一個(gè)mongod實(shí)例和一個(gè)mongos進(jìn)程。在Scala程序設(shè)計(jì)語(yǔ)言下,使用MongoDB官方提供的casbah工具包編寫(xiě)程序?qū)ongoDB進(jìn)行操作。
(1)對(duì)三個(gè)數(shù)據(jù)集分別插入1億條數(shù)據(jù),要求數(shù)據(jù)的L1字段取值均勻的分布在長(zhǎng)整型取值空間上;
在插入的數(shù)據(jù)每條為1kB的情況下,普通插入的方式在數(shù)據(jù)量小于1000萬(wàn)條時(shí),三個(gè)數(shù)據(jù)集性能都是是比較高效的,但之后每秒插入數(shù)據(jù)量驟降。原因是MongoDB的普通插入只是把數(shù)據(jù)寫(xiě)入內(nèi)存就結(jié)束了,所以在內(nèi)存有空閑時(shí),普通插入速度是非常高效的,但是隨著寫(xiě)入數(shù)據(jù)量的增加,內(nèi)存逐漸被占用,此事再寫(xiě)入數(shù)據(jù)需要在磁盤(pán)和內(nèi)存間進(jìn)行大量的數(shù)據(jù)交換,因此性能下降較快。
雖然隨著寫(xiě)入數(shù)據(jù)量的增加,寫(xiě)入性能明顯下降,但是分片數(shù)據(jù)集下降率比未分片的數(shù)據(jù)集低。在數(shù)據(jù)量大于2000萬(wàn)后的寫(xiě)入數(shù)據(jù)性能,分片數(shù)據(jù)集比未分片數(shù)據(jù)集要好。
比較collection1和collection2發(fā)現(xiàn),在數(shù)據(jù)量大于4000萬(wàn)后,collection1的寫(xiě)入性能更好,原因是在數(shù)據(jù)量達(dá)到4000萬(wàn)時(shí),collection2數(shù)據(jù)集第一個(gè)塊寫(xiě)滿,數(shù)據(jù)均衡的操作,數(shù)據(jù)在不同的shard間移動(dòng),導(dǎo)入寫(xiě)入速度下降。而collection1進(jìn)行了分塊操作,在數(shù)據(jù)寫(xiě)入之前,已經(jīng)將數(shù)據(jù)均勻的分布在了三個(gè)shard上,所以collection1隨著數(shù)據(jù)量的上升寫(xiě)入性能下降較為緩慢,寫(xiě)入操作的壓力被均勻的分布在了三個(gè)片上。
(2)分別根據(jù)普通索引、分片索引查詢1000條數(shù)據(jù)測(cè)試結(jié)果如圖1所示,對(duì)未分片的數(shù)據(jù)集進(jìn)行查詢3,查詢性能非常不穩(wěn)定,但是對(duì)分片的collection1進(jìn)行的1和2查詢相對(duì)比較穩(wěn)定。查詢1使用的是分片索引,查詢2使用的是普通索引,觀察可以發(fā)現(xiàn),使用分片索引的查詢效率高于普通索引。原因是根據(jù)分片索引,mongos可以把查詢操作有選擇的分發(fā)到相關(guān)的一部分mongod服務(wù)器上,而根據(jù)普通索引的查詢,mongos必須把查詢操作分發(fā)給每一個(gè)mongod服務(wù)器。
4 結(jié)語(yǔ)
經(jīng)過(guò)測(cè)試分析得知,使用MongoDB自動(dòng)分片技術(shù)可以提高數(shù)據(jù)量較大時(shí)的性能,并且時(shí)MongoDB更穩(wěn)定。并且,在使用自動(dòng)分片技術(shù)時(shí),應(yīng)設(shè)置塊的劃分,一方面可以使數(shù)據(jù)均勻的分布在每一個(gè)片上,而且可以減少數(shù)據(jù)平衡時(shí)的數(shù)據(jù)移動(dòng)。在查詢操作時(shí),使用片索引效率比普通索引效率高。對(duì)于使用非常頻繁的查詢,應(yīng)該考慮使用這個(gè)索引的關(guān)鍵詞來(lái)進(jìn)行分片。在未來(lái)的研究工作中,將對(duì)MongoDB集群不僅使用自動(dòng)分片技術(shù),而且加入副本集技術(shù),并觀測(cè)在有Mongod故障情況下,MongoDB集群的性能以及故障服務(wù)的恢復(fù)方法等。
參考文獻(xiàn)
[1] 程顯峰.MongoDB權(quán)威指南[M].北京人民郵電出版社,2011.
[2] 黎瑞瑜.分布式實(shí)時(shí)分發(fā)微博系統(tǒng)[D].華南理工大學(xué),2011.