国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于MongoDB的數(shù)據(jù)庫高可用高性能研究

2017-12-11 08:45陳辰侯慶坤唐蘭文辛祥彬
電腦知識與技術(shù) 2017年31期
關(guān)鍵詞:高性能集群大數(shù)據(jù)

陳辰 侯慶坤 唐蘭文 辛祥彬

摘要:當今數(shù)據(jù)已滲透到各行業(yè)領(lǐng)域,社會發(fā)展已進入“大數(shù)據(jù)”時代,針對大數(shù)據(jù)進行管理、處理的新技術(shù)不斷涌現(xiàn)。數(shù)據(jù)資源種類多、容量大,會造成非IT技術(shù)人員進行數(shù)據(jù)應用困難,數(shù)據(jù)的潛在價值難以體現(xiàn),同時大數(shù)據(jù)的處理都是基于大平臺,平時一般的數(shù)據(jù)分析人員在處理數(shù)據(jù)時很少能在大平臺中進行數(shù)據(jù)分析,因此急需一套高可用高性能的億級數(shù)據(jù)快速查詢應用方法。

該文通過研究MongoDB的存儲原理和實現(xiàn)機制,討論了提升數(shù)據(jù)庫可用性和存儲查詢性能的方法,并設計了高可用高性能的數(shù)據(jù)庫集群方案,為海量數(shù)據(jù)的業(yè)務應用奠定了基礎(chǔ)。

關(guān)鍵詞:MongoDB;大數(shù)據(jù);高性能;集群

中圖分類號:TP393 文獻標識碼:A 文章編號:1009-3044(2017)31-0008-03

1 概述

隨著web2.0時代的到來,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫在面對超大規(guī)模的數(shù)據(jù)和高并發(fā)動態(tài)網(wǎng)頁生成任務時,顯得非常吃力。關(guān)系型數(shù)據(jù)庫具有嚴格的ACID特性(Atomicity原子性、Consistency一致性、Isolation隔離性、Durability持久性),因此會產(chǎn)生一些例如表連接等操作,這樣會大大降低系統(tǒng)的性能。NoSQL的概念提出于20世紀80年代,當時是關(guān)系型數(shù)據(jù)庫的天下,并沒有現(xiàn)實的使用需求和應用場景,更多的是為了跟關(guān)系型數(shù)據(jù)庫的概念相區(qū)別。但是,進入21世紀之后,隨著國內(nèi)互聯(lián)網(wǎng)產(chǎn)業(yè)的高速發(fā)展和一批以百度、騰訊、阿里巴巴為代表的互聯(lián)網(wǎng)巨頭企業(yè)的誕生,帶動了一大批創(chuàng)新行企業(yè)并改變了人們的生活方式,互聯(lián)網(wǎng)已成為不可或缺的一部分。這樣,網(wǎng)民不僅是信息消費者,也成為信息創(chuàng)建者,隨著數(shù)據(jù)規(guī)模擴大和大批非結(jié)構(gòu)化數(shù)據(jù)的產(chǎn)生,NoSQL數(shù)據(jù)庫有了特定需求場景。

近年來,NoSQL數(shù)據(jù)庫得到快速發(fā)展,具有代表性的就是MongoDB。目前國內(nèi)對于MongoDB的研究還比較少。張路路研究了基于MongoDB的大數(shù)據(jù)存儲方法,對典型的內(nèi)存優(yōu)化技術(shù)和布式存儲技等大數(shù)據(jù)存儲技術(shù)進行研究分析[1]。吳德寶對關(guān)系與非關(guān)系數(shù)據(jù)庫進行了比較與分析,并對它們的主要典型代表Microsoft SQL Server和Mongo DB進行實驗測試,對它們的性能做定量的對比和分析[2]。仝義明、黃蔚、李戴維等人設計并實現(xiàn)了一個基于MongoDB的多源信息集成系統(tǒng),通過數(shù)據(jù)集成將存放在不同地點的數(shù)據(jù)進行數(shù)據(jù)采集與轉(zhuǎn)化,利用MongoDB集群分布式存儲海量數(shù)據(jù)并提供統(tǒng)一檢索,實現(xiàn)了數(shù)據(jù)的共享[3]。

目前而言,國內(nèi)研究主要在存儲和基于MongoDB設計應用系統(tǒng)以及與傳統(tǒng)關(guān)系數(shù)據(jù)庫進行對比研究。本文的側(cè)重點有所不同,主要研究利用MongoDB實現(xiàn)數(shù)據(jù)的高可用性和數(shù)據(jù)查詢的高性能。

2 MongoDB簡介

關(guān)系型數(shù)據(jù)庫建立在關(guān)系模型的基礎(chǔ)上,以數(shù)據(jù)表為單位進行存儲,擅長結(jié)構(gòu)化數(shù)據(jù)的存儲、查詢、刪除、連接、交集、并集、差集等操作,仍是各個領(lǐng)域主要在用的數(shù)據(jù)庫類型,在此不做贅述。

NoSQL(Not Only SQL)是非關(guān)系型數(shù)據(jù)存儲的廣義定義,得到廣泛認同。在目前主要的NoSQL數(shù)據(jù)庫中,有MongoDB、HBase、HyperTable、Cassandra等,而其中MongoDB是功能最豐富,最像關(guān)系數(shù)據(jù)庫的。

MongoDB是一款強大、靈活,且易于擴展的通用型數(shù)據(jù)庫[4]。相比關(guān)系型數(shù)據(jù)庫,MongoDB是一個面向文檔(document-oriented)的數(shù)據(jù)庫,它有很多特點和優(yōu)勢,主要體現(xiàn)在以下幾個方面:

1) 去除了關(guān)系型數(shù)據(jù)庫的關(guān)系特征,面向集合存儲,使得數(shù)據(jù)十分易于擴展;

2) 具有很好的讀寫性能,在海量數(shù)據(jù)下,性能表現(xiàn)同樣非常優(yōu)秀,這主要因為其結(jié)構(gòu)簡單,不受關(guān)系型數(shù)據(jù)庫中表間關(guān)系的束縛;

3) 不需要預先創(chuàng)建數(shù)據(jù)字段,在集合中可以隨時存入自定義的數(shù)據(jù)格式,可以輕而易舉地增加或者刪除字段;

4) 實現(xiàn)高可用架構(gòu)的同時,不會對性能產(chǎn)生較大影響;

基于以上特點,本文選擇MongoDB作為研究對象和候選工具,以解決處理海量數(shù)據(jù)時遇到的性能瓶頸問題。

3 高可用性研究

3.1 分片與副本集

我們知道,單臺服務器的資源存儲和計算能力都是有限的,當數(shù)據(jù)量和計算量達到一定程度時,進行垂直擴展會產(chǎn)生高昂的成本,這時就需要使用分布式存儲進行橫向擴展。

MongoDB實現(xiàn)的分布式技術(shù),主要在于數(shù)據(jù)的分片(Shard)以及副本集,分片是集群中負責某一子集的一臺或多臺服務器[5]。簡單來說,分片就是將數(shù)據(jù)集分割存儲在不同的服務器上,以此來提高數(shù)據(jù)容量和讀寫吞吐量。MongoDB的分片以集合(Collection,集合的概念與關(guān)系型數(shù)據(jù)庫中數(shù)據(jù)表Table類似)作為最小的單位,一個集合中的數(shù)據(jù)通過片鍵被分配到不同的分片節(jié)點存儲。為了提高單個分片的可用性,每個分片需要有多個副本,存儲在不同服務節(jié)點上,同一分片的多個副本組成一個副本集(Replica Set)。集合、分片和副本集的關(guān)系如圖1所示。

3.2 高可用集群設計

MongoDB集群的高可用性是通過副本集來實現(xiàn)的,這種數(shù)據(jù)冗余機制是可以靈活配置的,可以設置每個分片的副本數(shù)量。一個副本集中的節(jié)點是有主從之分的,與傳統(tǒng)的主從集群的不同之處在于它的主節(jié)點是不固定的,主節(jié)點是由集群推舉產(chǎn)生,節(jié)點之間通過心跳機制檢測活躍度,當主節(jié)點宕機或者停止時會自動將其他節(jié)點切換為主節(jié)點,因此具有很好的故障自動恢復功能。

通常情況下,搭建MongoDB高可用集群需要多臺服務器實現(xiàn),限于實驗條件限制,本文使用Docker虛擬化技術(shù)模擬服務器完成搭建。在整個集群中,包含以下功能節(jié)點:

Mongos:集群的路由節(jié)點,用來處理分發(fā)客戶機發(fā)起的數(shù)據(jù)庫請求,它掌握著每個分片的內(nèi)容記錄,會將數(shù)據(jù)請求轉(zhuǎn)發(fā)到對應的分片節(jié)點并負責聚合分片服務器的結(jié)果集,返回給客戶端。這樣客戶端就可以像使用單機服務器一樣進行正常的請求,同時數(shù)據(jù)庫實現(xiàn)了系統(tǒng)負載均衡。

Configdb:集群的配置節(jié)點,用來存儲整個集群的配置文件,每個數(shù)據(jù)塊的片鍵范圍等,也負責新的分片服務器的加入和認證。

Shards:集群的分片服務器節(jié)點,用來存儲真實的業(yè)務數(shù)據(jù),每個分片可以存在多個副本。

根據(jù)以上研究,每個分片保存兩個副本,使用兩個以上配置節(jié)點和兩個以上路由節(jié)點,即可保證整個集群的高可用性。其中任何一個節(jié)點宕機,都不會影響數(shù)據(jù)庫的正常服務。集群架構(gòu)如圖2所示。

3.3 可用性實驗

首先,需要配置和啟動集群中的各個節(jié)點。

(1) 配置和啟動shard1的腳本如下:

[dbpath=/MongoDB/data/shard1

logpath=/MongoDB/log/shard1.log

pidfilepath=/MongoDB/pid/shard1.pid

directoryperdb=true

logappend=true

replSet=shard1

port=10010

fork=true

shardsvr=true

journal=true ]

同理,啟動shard1副本節(jié)點和shard2、shard3類似,僅修改部分參數(shù)即可。

(2) 配置和啟動配置節(jié)點的腳本如下

[dbpath=/MongoDB/config/config1

logpath=/MongoDB/log/config1.log

pidfilepath=/MongoDB/pid/config1.pid

directoryperdb=true

logappend=true

port=10040

fork=true

configsvr=true

journal=true ]

同理,啟動其他config節(jié)點與此類似,僅修改部分參數(shù)即可。

(3) 配置和啟動路由節(jié)點的腳本如下

[configdb=mongo0:10040,mongo1:10040,mongo2:10040

pidfilepath=/MongoDB/pid/route.pid

port=10050

chunkSize=1

logpath=/MongoDB/log/route.log

logappend=true

fork=true ]

同理,啟動其他路由節(jié)點與此類似,僅修改部分參數(shù)即可。需要說明的是,腳本中的mongo0,mongo1和mongo2分別為三個配置節(jié)點服務器的IP地址,實驗時需要替換為相應的值。

然后,需要登錄到路由節(jié)點,配置分片和片鍵。創(chuàng)建vehicle表做分片,車輛的ID為它的VIN碼,因此將VIN字段作為片鍵且唯一。

設置片鍵命令如下:

db.runCommand( { shardcollection : "testdata.vehicle",key : {vin: 1},unique : true } )

最后,通過路由節(jié)點,插入百萬條數(shù)據(jù)。腳本如下

[for( var i=1; i<=1000000; i++ )

db.vehicle.save({vin : i, volumn1 : “123456”, volumn2 : i*5}); ]

此時可以停掉任意個分片節(jié)點服務器,通過db.vehicle.stats()命令,即可查看車輛表的狀態(tài)。實驗表明,只要分片的副本集內(nèi),有一個節(jié)點服務器正常工作,整個集群的數(shù)據(jù)服務就不會中斷,MongoDB集群完全滿足高可用性要求。

4 高性能研究

截至目前,MongoDB社區(qū)版的最新版本為3.4.9。在MongoDB版本3.0之前,其性能存在諸多問題,與2.x的版本相比,MongoDB3增加了高性能、可伸縮的數(shù)據(jù)存儲引擎WiredTiger,從而使得MongoDB3性能得到了極大的提升,尤其是寫性能和對硬件資源的利用率。MongoDB 2.6及更早的版本,使用MMAP存儲引擎,基于內(nèi)存映射技術(shù);MongoDB3支持兩個引擎:支持集合級鎖的MMAP和支持壓縮和文檔級鎖的WiredTiger存儲引擎。MongoDB3.0在多線程、批量插入場景下較之于MongoDB2.6有大約7倍的增長[6],如圖3所示。

4.1 wiredTiger存儲引擎

wiredTiger(簡稱WT)支持的存儲方式有三種:行存儲、列存儲以及LSM。MongoDB在使用時,只是把它作為普通的KV存儲引擎來使用,MongoDB的每個集合對應一個WT的table,table里包含多個Key-value pairs,以B樹形式存儲。同時,WT改進了鎖粒度和靈活性,并且提供了snappy(默認)和zlib兩種壓縮方式。經(jīng)測試,WT的平均壓縮率可達20%以上。

MongoDB 3.0支持用戶自定義存儲引擎,用戶可配置使用mmapv1或者wiredTiger存儲引擎[7]。

下面測試插入100w條數(shù)據(jù)時,WT引擎與mmapv1引擎的性能差異。

使用的Python代碼如下:

[import datetime

ISOTIMEFORMAT = '%Y-%m-%d %X'

from pymongo import MongoClient

client = MongoClient("127.0.0.1",27017)

db = client.users

db.users.drop()

date1 = datetime.datetime.now()

for i in range(0,1000000) :

db.users.insert_one({"name":"adc01","age":i,"addr":"tianjin"})

date2 = datetime.datetime.now()

count = db.users.find().count()

print("count is ",count)

print(date1)

print(date2)

timedelta = date2 - date1

tc = timedelta.days*24*3600 +timedelta.seconds

print(tc,"seconds")

client.close() ]

通過以上結(jié)果可以看出,WT引擎的性能提升十分明顯。在3.2版本的MongoDB已經(jīng)將WiredTiger設置為了默認的存儲引擎,因此我們使用默認設置即可。

4.2 MongoDB性能優(yōu)化

除了存儲引擎會對性能有影響,還有很多其他因素也會限制數(shù)據(jù)的性能,本節(jié)討論幾種主要的性能優(yōu)化的方案。

(1) 建立MongoDB集群

在第三章所設計的集群方案中,當客戶端向數(shù)據(jù)庫發(fā)起數(shù)據(jù)插入請求時,路由節(jié)點Mongos會根據(jù)數(shù)據(jù)項的片鍵分配給相應的分片節(jié)點進行存儲并將結(jié)果返回;與之類似,當客戶端向數(shù)據(jù)庫發(fā)起數(shù)據(jù)查詢請求時,如果查詢條件包含片鍵以外的字段,路由節(jié)點會將請求廣播給分片節(jié)點,每個分片服務器同步進行查詢,由路由節(jié)點匯總查詢結(jié)果返回。因此,集群的插入和查詢性能與單點服務器相比,會成倍提高。

(2) 創(chuàng)建索引

對于經(jīng)常需要查詢操作的數(shù)據(jù),適當創(chuàng)建索引可以極大提高查詢效率。當然有利就有弊,維護索引需要消耗一部分系統(tǒng)資源,也會影響系統(tǒng)的插入性能,在實際應用中需要權(quán)衡決定。在MondoDB中可以在后臺創(chuàng)建索引以避免collections 鎖和系統(tǒng)崩潰。

(3) 讀寫分離

第三章中設計的集群,每個分片都有一個副本集,包含一個主節(jié)點和兩個從節(jié)點,如果數(shù)據(jù)的讀寫操作都在主節(jié)點進行的話,從節(jié)點就會經(jīng)常處在空閑狀態(tài),造成硬件資源的極大浪費。對于讀操作來說,完全可以在從節(jié)點實現(xiàn),因此要做的是在connection string中設置成secondary preferred。

(4) 范式化設計

在關(guān)系型數(shù)據(jù)庫中,如果存在一對多的實體關(guān)系,通常需要設計三張表,將實體的對應關(guān)系單獨存儲,這樣的查詢效率很低;這種場景下使用MongoDB時,完全可以將多個實體的ID數(shù)組作為一個字段添加到集合中,而根據(jù)ID查詢詳細信息的效率是很高的。

5 結(jié)論

為了解決海量數(shù)據(jù)應用場景下的高可用、高性能以及橫向擴展的需求,本文研究了MongoDB的分片和副本機制、存儲引擎及其性能,設計并驗證了MongoDB的高可用集群的架構(gòu)模式,同時對MongoDB的性能優(yōu)化提出了一些指導原則。從研究結(jié)果看,對MongoDB性能的研究和實驗,為實現(xiàn)億級數(shù)據(jù)的快速查詢和處理積累了實踐經(jīng)驗,達到了研究目的。

參考文獻:

[1] 張路路.基于MongoDB的大數(shù)據(jù)存儲方法研究與應用[D].成都理工大學,2015.

[2] 吳德寶.關(guān)系與非關(guān)系數(shù)據(jù)庫應用對比研究—以SQL Server與Mongo DB為例[D].東華理工大學,2015.

[3] 仝義明,黃蔚,李戴維.基于MongoDB的信息集成系統(tǒng)的設計與實現(xiàn)[J].信息技術(shù),2015(2):125-133.

[4] Kristina Chodorow Michael Dirolf、程顯峰(譯),MongoDB權(quán)威指南[M].北京:人民郵電出版社,2011.

[5] Dede E, Govindaraju M, Gunter D, et al. Performance evaluation of a MongoDB and Hadoop platform for scientific data analysis[C], Proceedings of the 4th ACM workshop on Scientific cloud computing.ACM, 2013: 13-20.

[6] MongoDB中文社區(qū).MongoDB 3.0 官方性能測試報告(I):YCSB測試下的并發(fā)量提升.http://www.mongoing.com/archives/862

[7] 張友東.MongoDB如何使用wiredTiger.MongoDB中文社區(qū).http://www.mongoing.com/archives/2214.

猜你喜歡
高性能集群大數(shù)據(jù)
海上小型無人機集群的反制裝備需求與應對之策研究
一種無人機集群發(fā)射回收裝置的控制系統(tǒng)設計
Python與Spark集群在收費數(shù)據(jù)分析中的應用
一款高性能BGO探測器的研發(fā)
高性能砼在橋梁中的應用
SATA推出全新高性能噴槍SATAjet 5000 B
高性能可變進氣岐管降低二氧化碳排放
安图县| 松溪县| 台北市| 图片| 赤水市| 竹溪县| 嘉善县| 蒲江县| 出国| 东海县| 永顺县| 丹巴县| 林芝县| 辛集市| 临邑县| 洛川县| 潍坊市| 苍梧县| 黄冈市| 平果县| 宣汉县| 清远市| 潍坊市| 汾阳市| 临夏市| 静宁县| 宁陕县| 宜兴市| 喜德县| 东阿县| 元朗区| 广东省| 伊金霍洛旗| 巍山| 康平县| 衡阳市| 黎平县| 麦盖提县| 施甸县| 梓潼县| 抚州市|