亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

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

        陳辰 侯慶坤 唐蘭文 辛祥彬

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

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

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

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

        1 概述

        隨著web2.0時(shí)代的到來,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫在面對超大規(guī)模的數(shù)據(jù)和高并發(fā)動(dòng)態(tài)網(wǎng)頁生成任務(wù)時(shí),顯得非常吃力。關(guān)系型數(shù)據(jù)庫具有嚴(yán)格的ACID特性(Atomicity原子性、Consistency一致性、Isolation隔離性、Durability持久性),因此會(huì)產(chǎn)生一些例如表連接等操作,這樣會(huì)大大降低系統(tǒng)的性能。NoSQL的概念提出于20世紀(jì)80年代,當(dāng)時(shí)是關(guān)系型數(shù)據(jù)庫的天下,并沒有現(xiàn)實(shí)的使用需求和應(yīng)用場景,更多的是為了跟關(guān)系型數(shù)據(jù)庫的概念相區(qū)別。但是,進(jìn)入21世紀(jì)之后,隨著國內(nèi)互聯(lián)網(wǎng)產(chǎn)業(yè)的高速發(fā)展和一批以百度、騰訊、阿里巴巴為代表的互聯(lián)網(wǎng)巨頭企業(yè)的誕生,帶動(dòng)了一大批創(chuàng)新行企業(yè)并改變了人們的生活方式,互聯(lián)網(wǎng)已成為不可或缺的一部分。這樣,網(wǎng)民不僅是信息消費(fèi)者,也成為信息創(chuàng)建者,隨著數(shù)據(jù)規(guī)模擴(kuò)大和大批非結(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ù)進(jìn)行研究分析[1]。吳德寶對關(guān)系與非關(guān)系數(shù)據(jù)庫進(jìn)行了比較與分析,并對它們的主要典型代表Microsoft SQL Server和Mongo DB進(jìn)行實(shí)驗(yàn)測試,對它們的性能做定量的對比和分析[2]。仝義明、黃蔚、李戴維等人設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)基于MongoDB的多源信息集成系統(tǒng),通過數(shù)據(jù)集成將存放在不同地點(diǎn)的數(shù)據(jù)進(jìn)行數(shù)據(jù)采集與轉(zhuǎn)化,利用MongoDB集群分布式存儲海量數(shù)據(jù)并提供統(tǒng)一檢索,實(shí)現(xiàn)了數(shù)據(jù)的共享[3]。

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

        2 MongoDB簡介

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

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

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

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

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

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

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

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

        3 高可用性研究

        3.1 分片與副本集

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

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

        3.2 高可用集群設(shè)計(jì)

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

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

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

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

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

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

        3.3 可用性實(shí)驗(yàn)

        首先,需要配置和啟動(dòng)集群中的各個(gè)節(jié)點(diǎn)。

        (1) 配置和啟動(dòng)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 ]

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

        (2) 配置和啟動(dòng)配置節(jié)點(diǎn)的腳本如下

        [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 ]

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

        (3) 配置和啟動(dòng)路由節(jié)點(diǎn)的腳本如下

        [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 ]

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

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

        設(shè)置片鍵命令如下:

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

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

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

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

        此時(shí)可以停掉任意個(gè)分片節(jié)點(diǎn)服務(wù)器,通過db.vehicle.stats()命令,即可查看車輛表的狀態(tài)。實(shí)驗(yàn)表明,只要分片的副本集內(nèi),有一個(gè)節(jié)點(diǎn)服務(wù)器正常工作,整個(gè)集群的數(shù)據(jù)服務(wù)就不會(huì)中斷,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支持兩個(gè)引擎:支持集合級鎖的MMAP和支持壓縮和文檔級鎖的WiredTiger存儲引擎。MongoDB3.0在多線程、批量插入場景下較之于MongoDB2.6有大約7倍的增長[6],如圖3所示。

        4.1 wiredTiger存儲引擎

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

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

        下面測試插入100w條數(shù)據(jù)時(shí),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設(shè)置為了默認(rèn)的存儲引擎,因此我們使用默認(rèn)設(shè)置即可。

        4.2 MongoDB性能優(yōu)化

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

        (1) 建立MongoDB集群

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

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

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

        (3) 讀寫分離

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

        (4) 范式化設(shè)計(jì)

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

        5 結(jié)論

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

        參考文獻(xiàn):

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

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

        [3] 仝義明,黃蔚,李戴維.基于MongoDB的信息集成系統(tǒng)的設(shè)計(jì)與實(shí)現(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 官方性能測試報(bào)告(I):YCSB測試下的并發(fā)量提升.http://www.mongoing.com/archives/862

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

        猜你喜歡
        大數(shù)據(jù)
        基于在線教育的大數(shù)據(jù)研究
        中國市場(2016年36期)2016-10-19 04:41:16
        “互聯(lián)網(wǎng)+”農(nóng)產(chǎn)品物流業(yè)的大數(shù)據(jù)策略研究
        中國市場(2016年36期)2016-10-19 03:31:48
        基于大數(shù)據(jù)的小微電商授信評估研究
        中國市場(2016年35期)2016-10-19 01:30:59
        大數(shù)據(jù)時(shí)代新聞的新變化探究
        商(2016年27期)2016-10-17 06:26:00
        淺談大數(shù)據(jù)在出版業(yè)的應(yīng)用
        今傳媒(2016年9期)2016-10-15 23:35:12
        “互聯(lián)網(wǎng)+”對傳統(tǒng)圖書出版的影響和推動(dòng)作用
        今傳媒(2016年9期)2016-10-15 22:09:11
        大數(shù)據(jù)環(huán)境下基于移動(dòng)客戶端的傳統(tǒng)媒體轉(zhuǎn)型思路
        新聞世界(2016年10期)2016-10-11 20:13:53
        基于大數(shù)據(jù)背景下的智慧城市建設(shè)研究
        科技視界(2016年20期)2016-09-29 10:53:22
        數(shù)據(jù)+輿情:南方報(bào)業(yè)創(chuàng)新轉(zhuǎn)型提高服務(wù)能力的探索
        中國記者(2016年6期)2016-08-26 12:36:20
        YW亚洲AV无码乱码在线观看| 精品国产精品国产偷麻豆| 色偷偷av男人的天堂| 香蕉色香蕉在线视频| 中文字幕一区,二区,三区| 一区二区三区日韩精品视频| 男人扒开添女人下部免费视频| 欧美疯狂性xxxxxbbbbb| 久久这里有精品国产电影网| 免费观看国产激情视频在线观看| 国产成人综合久久久久久| 无码午夜成人1000部免费视频| 91白浆在线视频| 日韩中文字幕一区二十| 久久777国产线看观看精品| 久久久久久国产精品mv| 国产成人无码A区在线观| 最近中文字幕一区二区三区| 国产成人久久精品一区二区三区 | av一区二区在线网站| 国内最真实的xxxx人伦| 国精产品一区二区三区| 中文无码免费在线| 国产精品亚洲av高清二区| 久久久精品一区aaa片| 国产黄色免费网站| 国内精品熟女一区二区| 一本一道久久精品综合| 黄瓜视频在线观看| 无夜精品久久久久久| 麻豆国产精品伦理视频| 欧美国产激情二区三区| 久久99精品久久久久久hb无码| 亚洲国产字幕| 日本女优激情四射中文字幕| av 日韩 人妻 黑人 综合 无码| āV第三区亚洲狠狠婷婷综合久久| 久久亚洲春色中文字幕久久久综合| 成熟人妻换xxxx| 高中生粉嫩无套第一次| 中国人妻沙发上喷白将av|