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