白玉杰,夏 方,程順達(dá)(河北省中醫(yī)院 信息中心,河北 石家莊 050011)
基于MongoDB的文件存儲(chǔ)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
白玉杰,夏 方,程順達(dá)
(河北省中醫(yī)院 信息中心,河北 石家莊 050011)
基于MongoDB數(shù)據(jù)庫,采用復(fù)制集群與分片集群結(jié)合的方式,建立分片復(fù)制集群(本文中為3分片,每個(gè)分片為3副本),集群包括路由節(jié)點(diǎn)、配置節(jié)點(diǎn)、主副本節(jié)點(diǎn)、仲裁節(jié)點(diǎn).這樣既兼顧了集群的性能,也保證了其高可用性.可有效解決原關(guān)系型數(shù)據(jù)庫的不足,提高非結(jié)構(gòu)化數(shù)據(jù)的查詢效率,緩解關(guān)系數(shù)據(jù)庫的讀寫負(fù)載壓力和運(yùn)維壓力,而且當(dāng)用戶訪問量劇增時(shí),可以動(dòng)態(tài)增加MongoDB節(jié)點(diǎn)來擴(kuò)展性能和提高負(fù)載能力.
MongoDB;數(shù)據(jù)庫;存儲(chǔ)系統(tǒng);集群
隨著信息技術(shù)的不斷發(fā)展,系統(tǒng)集中的建設(shè)模式逐漸成為主流.系統(tǒng)集中不僅可按需分配計(jì)算能力,提高系統(tǒng)運(yùn)行效率,而且大大節(jié)約硬件的投資成本.但在原有分散建設(shè)系統(tǒng)時(shí),支撐業(yè)務(wù)的圖片、Word、Excel、視頻等文件有可能存儲(chǔ)于傳統(tǒng)的關(guān)系型數(shù)據(jù)庫中.在系統(tǒng)集中后,如何將海量的非結(jié)構(gòu)化文件數(shù)據(jù)統(tǒng)一存儲(chǔ)又不會(huì)降低系統(tǒng)運(yùn)行效率,是一個(gè)難題.本文引入了面向非結(jié)構(gòu)化數(shù)據(jù)的NoSql數(shù)據(jù)庫來解決這一難題.
MongoDB是時(shí)下流行的NoSql數(shù)據(jù)庫,其特點(diǎn)是高性能、易部署、易使用,存儲(chǔ)數(shù)據(jù)非常方便,尤其適合大尺寸、低價(jià)值的文件數(shù)據(jù)的存儲(chǔ).MongoDB支持單機(jī)、主從、復(fù)制集群(Replica Set)及分片集群Sharding)4種模式.復(fù)制集群模式是一種進(jìn)化的主從結(jié)構(gòu),在主節(jié)點(diǎn)失效后,仲裁節(jié)點(diǎn)會(huì)選出一個(gè)副本節(jié)點(diǎn)作為主節(jié)點(diǎn),這樣保證了集群的高可用性.分片集群則是通過將數(shù)據(jù)存儲(chǔ)分布到不同機(jī)器上進(jìn)行保存,使更新或查詢操作也分布到不同節(jié)點(diǎn)進(jìn)行,從而將I/O操作分布到各個(gè)機(jī)器上,從整體上提高了訪問效率,防止出現(xiàn)性能瓶頸.因此,我們采用復(fù)制集群與分片集群結(jié)合的方式,建立分片復(fù)制集群(本文中為3分片,每個(gè)分片為3副本),這樣,既兼顧了集群的性能,也保證了其高可用性.
1) 路由節(jié)點(diǎn):路由節(jié)點(diǎn)是數(shù)據(jù)庫集群請求的入口,所有的請求都通過路由節(jié)點(diǎn)進(jìn)行協(xié)調(diào),不需要在應(yīng)用程序添加一個(gè)路由選擇器,路由節(jié)點(diǎn)自己就是一個(gè)請求分發(fā)中心,它負(fù)責(zé)把對應(yīng)的數(shù)據(jù)請求轉(zhuǎn)發(fā)到對應(yīng)的分片服務(wù)器上.這里用多路由節(jié)點(diǎn)作為請求的入口,來保障高可用性.
2) 配置節(jié)點(diǎn):存儲(chǔ)所有數(shù)據(jù)庫元信息(路由、分片)的配置.路由節(jié)點(diǎn)本身沒有物理存儲(chǔ)分片服務(wù)器和數(shù)據(jù)路由信息,只是緩存在內(nèi)存里,配置服務(wù)器則實(shí)際存儲(chǔ)這些數(shù)據(jù).路由節(jié)點(diǎn)第一次啟動(dòng)或者關(guān)掉重啟就會(huì)從配置節(jié)點(diǎn)加載配置信息,以后如果配置服務(wù)器信息變化會(huì)通知到所有的路由節(jié)點(diǎn)更新自己的狀態(tài),這樣路由節(jié)點(diǎn)就能繼續(xù)準(zhǔn)確路由.這里采用多個(gè)配置節(jié)點(diǎn)服務(wù)器也是為了保障高可用性.
3) 主、副本節(jié)點(diǎn):兩個(gè)節(jié)點(diǎn)互為主備,是文件數(shù)據(jù)存儲(chǔ)的空間.默認(rèn)情況下,主節(jié)點(diǎn)提供增刪查改功能,副本節(jié)點(diǎn)提供查詢功能,這樣就可以減少主節(jié)點(diǎn)的壓力,當(dāng)客戶端進(jìn)行數(shù)據(jù)查詢時(shí),請求自動(dòng)轉(zhuǎn)到副本節(jié)點(diǎn)上.
4) 仲裁節(jié)點(diǎn):仲裁節(jié)點(diǎn)是一種特殊的節(jié)點(diǎn),它本身并不存儲(chǔ)數(shù)據(jù),主要的作用是將副本節(jié)點(diǎn)在主節(jié)點(diǎn)掛掉之后提升為主節(jié)點(diǎn).
在程序設(shè)計(jì)和開發(fā)時(shí),我們借助于GridFS來實(shí)現(xiàn)文件的存取,GridFS是MongoDB數(shù)據(jù)庫之上的一個(gè)簡單文件系統(tǒng)抽象.GridFS會(huì)為每個(gè)文件創(chuàng)建chunks和files信息,GridFS會(huì)將大文件對象分割成多個(gè)小的chunk(文件片段),每個(gè)chunk將作為MongoDB的一個(gè)文檔(document)被存儲(chǔ)在chunks集合中.和文件有關(guān)的元數(shù)據(jù)將會(huì)被存在files集合中.files集合的格式如下:
采用C#語言開發(fā)的存儲(chǔ)文件函數(shù)如下:
讀取文件的函數(shù)如下:
將原有存儲(chǔ)于關(guān)系數(shù)據(jù)庫中的非結(jié)構(gòu)化數(shù)據(jù),剝離到MongoDB數(shù)據(jù)庫進(jìn)行存儲(chǔ),可有效解決原關(guān)系型數(shù)據(jù)庫的不足,提高了非結(jié)構(gòu)化數(shù)據(jù)的查詢效率,緩解關(guān)系數(shù)據(jù)庫的讀寫負(fù)載壓力和運(yùn)維壓力,而且當(dāng)用戶訪問量劇增時(shí),可以動(dòng)態(tài)增加MongoDB節(jié)點(diǎn)來擴(kuò)展性能和提高負(fù)載能力.
(責(zé)任編校:李建明 英文校對:李玉玲)
Design and Implementation of File Storage System Based on MongoDB
BAI Yujie, XIA Fang, CHENG Shunda
(Information Centre, Hebei Hospital of Traditional Chinese Medicine, Shijiazhuang, Hebei 050011, China)
Based on MongoDB, a kind of slice replication cluster can be created by the combination of replication lusters and slice clusters (The slice replication cluster has three slices and every slice has three replicas). The creation f the slice replication cluster, which includes routing nodes, configuration nodes, primary replica nodes and arbitrition odes, not only takes into accounts the performance of the cluster but also can ensure its high availability. It can effectively olve the problem of the insufficiency of the original relational database, improve the query efficiency of the unstructured ata, alleviate the read and write load pressure and operation pressure of the relational database, but also dynamically dd mongodb nodes to extend performance and increase load capacity when the number of access users increases.
MongoDB; database; storage system; clusters
TP311.13
A
1673-2065(2016)04-0008-03
2016-05-03
白玉杰(1983-),男,河北阜平人,河北省中醫(yī)院信息中心助理工程師.
夏方(1979-),男,江蘇丹陽人,河北省中醫(yī)院信息中心助理工程師.
10.3969/j.issn.1673-2065.2016.04.005
10.3969/j.issn.1673-2065.2016.04.004