MongoDB中怎么實(shí)現(xiàn)分片操作-創(chuàng)新互聯(lián)

本篇文章為大家展示了MongoDB中怎么實(shí)現(xiàn)分片操作,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

秦都網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),秦都網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為秦都數(shù)千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的秦都做網(wǎng)站的公司定做!

1.分片簡(jiǎn)介

分片是指將數(shù)據(jù)拆分,將其分散存在不同機(jī)器上的過程.有時(shí)也叫分區(qū).將數(shù)據(jù)分散在不同的機(jī)器上,不需要功能

強(qiáng)大的大型計(jì)算機(jī)就可以存儲(chǔ)更多的數(shù)據(jù),處理更大的負(fù)載.

使用幾乎所有數(shù)據(jù)庫(kù)軟件都能進(jìn)行手動(dòng)分片,應(yīng)用需要維護(hù)與若干不同數(shù)據(jù)庫(kù)服務(wù)器的連接,每個(gè)連接還是完全

獨(dú)立的.應(yīng)用程序管理不同服務(wù)器上的不同數(shù)據(jù),存儲(chǔ)查村都需要在正確的服務(wù)器上進(jìn)行.這種方法可以很好的工作,但是也

難以維護(hù),比如向集群添加節(jié)點(diǎn)或從集群刪除節(jié)點(diǎn)都很困難,調(diào)整數(shù)據(jù)分布和負(fù)載模式也不輕松.

MongoDB支持自動(dòng)分片,可以擺脫手動(dòng)分片的管理.集群自動(dòng)切分?jǐn)?shù)據(jù),做負(fù)載均衡.

 2.MongoDB的自動(dòng)分片

MongoDB分片的基本思想就是將集合切分成小塊.這些塊分散到若干片里面,每個(gè)片只負(fù)責(zé)總數(shù)據(jù)的一部分.應(yīng)用程序不必知道

哪片對(duì)應(yīng)哪些數(shù)據(jù),甚至不需要知道數(shù)據(jù)已經(jīng)被拆分了,所以在分片之前要運(yùn)行一個(gè)路由進(jìn)程,進(jìn)程名mongos,這個(gè)路由器知道

所有數(shù)據(jù)的存放位置,所以應(yīng)用可以連接它來正常發(fā)送請(qǐng)求.對(duì)應(yīng)用來說,它僅知道連接了一個(gè)普通的mongod.路由器知道和片的

對(duì)應(yīng)關(guān)系,能夠轉(zhuǎn)發(fā)請(qǐng)求到正確的片上.如果請(qǐng)求有了回應(yīng),路由器將其收集起來回送給應(yīng)用.

在沒有分片的時(shí)候,客戶端連接mongod進(jìn)程,分片時(shí)客戶端會(huì)連接mongos進(jìn)程.mongos對(duì)應(yīng)用隱藏了分片的細(xì)節(jié).

從應(yīng)用的角度看,分片和不分片沒有區(qū)別.所以需要擴(kuò)展的時(shí)候,不必修改應(yīng)用程序的代碼.

不分片的客戶端連接:

 MongoDB中怎么實(shí)現(xiàn)分片操作

分片的客戶端連接:

 MongoDB中怎么實(shí)現(xiàn)分片操作

什么時(shí)候需要分片:

a.機(jī)器的磁盤不夠用了

b.單個(gè)mongod已經(jīng)不能滿足些數(shù)據(jù)的性能需要了

c.想將大量數(shù)據(jù)放在內(nèi)存中提高性能

一般來說,先要從不分片開始,然后在需要的時(shí)候?qū)⑵滢D(zhuǎn)換成分片.

3.片鍵

設(shè)置分片時(shí),需要從集合里面選一個(gè)鍵,用該鍵的值作為數(shù)據(jù)拆分的依據(jù).這個(gè)鍵成為片鍵.

假設(shè)有個(gè)文檔集合表示的是人員,如果選擇名字"name"做為片鍵,第一篇可能會(huì)存放名字以A-F開頭的文檔.

第二片存G-P開頭的文檔,第三篇存Q-Z的文檔.隨著增加或刪除片,MongoDB會(huì)重新平衡數(shù)據(jù),是每片的流量比較

均衡,數(shù)據(jù)量也在合理范圍內(nèi)(如流量較大的片存放的數(shù)據(jù)或許會(huì)比流量下的片數(shù)據(jù)要少些)

 4.將已有的集合分片

假設(shè)有個(gè)存儲(chǔ)日志的集合,現(xiàn)在要分片.我們開啟分片功能,然后告訴MongoDB用"timestamp"作為片鍵,就要所有數(shù)據(jù)放到

了一個(gè)片上.可以隨意插入數(shù)據(jù),但總會(huì)是在一個(gè)片上.

然后,新增一個(gè)片.這個(gè)片建好并運(yùn)行了以后,MongoDB就會(huì)把集合拆分成兩半,成為塊.每個(gè)塊中包含片鍵值在一定

范圍內(nèi)的所有文檔,假設(shè)其中一塊包含時(shí)間戳在2011.11.11前的文檔,則另一塊含有2011.11.11以后的文檔.其中

一塊會(huì)被移動(dòng)到新片上.如果新文檔的時(shí)間戳在2011.11.11之前,則添加到第一塊,否則添加到第二塊.

 5.遞增片鍵還是隨機(jī)片鍵

片鍵的選擇決定了插入操作在片之間的分布.

如果選擇了像"timestamp"這樣的鍵,這個(gè)值可能不斷增長(zhǎng),而且沒有太大的間斷,就會(huì)將所有數(shù)據(jù)發(fā)送到一個(gè)片上

(含有2011.11.11以后日期的那片).如果有添加了新片,再拆分?jǐn)?shù)據(jù),還是會(huì)都導(dǎo)入到一臺(tái)服務(wù)器上.添加了新片,

MongoDB肯能會(huì)將2011.11.11以后的拆分成2011.11.11-2021.11.11.如果文檔的時(shí)間大于2021.11.11以后,

所有的文檔還會(huì)以最后一片插入.這就不適合寫入負(fù)載很高情況,但按照片鍵查詢會(huì)非常高效.

如果寫入負(fù)載比較高,想均勻分散負(fù)載到各個(gè)片,就得選擇分布均勻的片鍵.日志例子中時(shí)間戳的散列值,沒有模式的"logMessage"

都是復(fù)合這個(gè)條件的.

不論片鍵隨機(jī)跳躍還是穩(wěn)定增加,片鍵的變化很重要.如,如果有個(gè)"logLevel"鍵的值只有3種值"DEBUG","WARN","ERROR",

MongoDB無論如何也不能把它作為片鍵將數(shù)據(jù)分成多于3片(因?yàn)橹挥?個(gè)值).如果鍵的變化太少,但又想讓其作為片鍵,

可以把這個(gè)鍵與一個(gè)變化較大的鍵組合起來,創(chuàng)建一個(gè)復(fù)合片鍵,如"logLevel"和"timestamp"組合.

選擇片鍵并創(chuàng)建片鍵很像索引,以為二者原理相似.事實(shí)上,片鍵也是最常用的索引.

 6.片鍵對(duì)操作的影響

最終用戶應(yīng)該無法區(qū)分是否分片,但是要了解選擇不同片鍵情況下的查詢有何不同.

假設(shè)還是那個(gè)表示人員的集合,按照"name"分片,有3個(gè)片,其名字首字母的范圍是A-Z.下面以不同的方式查詢:

db.people.find({"name":"Refactor"})

mongos會(huì)將這個(gè)查詢直接發(fā)送給Q-Z片,獲得響應(yīng)后,直接轉(zhuǎn)發(fā)給客戶端

db.people.find({"name":{"$lt":"L"}})

mongos會(huì)將其先發(fā)送給A-F和G-P片,然后將結(jié)果轉(zhuǎn)發(fā)給客戶端.

db.people.find().sort({"email":1})

mongos會(huì)在所有片上查詢,返回結(jié)果時(shí)還會(huì)做歸并排序,確保結(jié)果順序正確.

mongos用游標(biāo)從各個(gè)服務(wù)器上獲取數(shù)據(jù),所以不必等到全部數(shù)據(jù)都拿到才向客戶端發(fā)送批量結(jié)果.

db.people.find({"email":re@msn.cn})

mongos并不追蹤"email"鍵,所以也不知道應(yīng)該將查詢發(fā)給那個(gè)片.所以他就向所有片順序發(fā)送查詢.

如果是插入文檔,mongos會(huì)依據(jù)"name"鍵的值,將其發(fā)送到相應(yīng)的片上.

 7.建立分片

建立分片有兩步:啟動(dòng)實(shí)際的服務(wù)器,然后決定怎么切分?jǐn)?shù)據(jù).

分片一般會(huì)有3個(gè)組成部分:

a.片

片就是保存子集合數(shù)據(jù)的容器,片可是單個(gè)的mongod服務(wù)器(開發(fā)和測(cè)試用),也可以是副本集(生產(chǎn)用).所以一片

有多臺(tái)服務(wù)器,也只能有一個(gè)主服務(wù)器,其他的服務(wù)器保存相同的數(shù)據(jù).

b.mongos

mongos就是MongoDB配的路由器進(jìn)程.它路由所有的請(qǐng)求,然后將結(jié)果聚合.它本身并不存儲(chǔ)數(shù)據(jù)或者配置信息

但會(huì)緩存配置服務(wù)器的信息.

c.配置服務(wù)器

配置服務(wù)器存儲(chǔ)了集群的配置信息:數(shù)據(jù)和片的對(duì)應(yīng)關(guān)系.mongos不永久存房數(shù)據(jù),所以需要個(gè)地方存放分片的配置.

它會(huì)從配置服務(wù)器獲取同步數(shù)據(jù).

 8.啟動(dòng)服務(wù)器

首先要啟動(dòng)配置服務(wù)器和mongos.配置服務(wù)器需要先啟動(dòng).因?yàn)閙ongos會(huì)用到其上的配置信息.

配置服務(wù)器的啟動(dòng)就像普通的mongod一樣

mongod --dbpath "F:\mongo\dbs\config" --port 20000 --logpath "F:\mongo\logs\config\MongoDB.txt" --rest

配置服務(wù)器不需要很多的空間和資源(200M實(shí)際數(shù)據(jù)大約占用1kB的配置空間)

 建立mongos進(jìn)程,一共應(yīng)用程序連接.這種路由服務(wù)器連接數(shù)據(jù)目錄都不需要,但一定要指明配置服務(wù)器的位置:

mongos --port 30000 --configdb 127.0.0.1:20000 --logpath "F:\mongo\logs\mongos\MongoDB.txt"

分片管理通常是通過mongos完成的.

添加片

片就是普通的mongod實(shí)例(或副本集)

mongod --dbpath "F:\mongo\dbs\shard" --port 10000 --logpath "F:\mongo\logs\shard\MongoDB.txt" --rest

mongod --dbpath "F:\mongo\dbs\shard1" --port 10001 --logpath "F:\mongo\logs\shard1\MongoDB.txt" --rest

連接剛才啟動(dòng)的mongos,為集群添加一個(gè)片.啟動(dòng)shell,連接mongos:

確定連接的是mongos而不是mongod,通過addshard命令添加片:

>mongo 127.0.0.1:30000

mongos> db.runCommand(
... {
... "addshard":"127.0.0.1:10000",
... "allowLocal":true
... }
... )
Sat Jul 21 10:46:38 uncaught exception: error { "$err" : "can't find a shard to
put new db on", "code" : 10185 }
mongos> use admin
switched to db admin
mongos> db.runCommand(
... {
... "addshard":"127.0.0.1:10000",
... "allowLocal":1
... }
... )
{ "shardAdded" : "shard0000", "ok" : 1 }
mongos> db.runCommand(
... {
... "addshard":"127.0.0.1:10001",
... "allowLocal":1
... }
... )
{ "shardAdded" : "shard0001", "ok" : 1 }

當(dāng)在本機(jī)運(yùn)行片的時(shí)候,得設(shè)定allowLocal鍵為1.MongoDB盡量避免由于錯(cuò)誤的配置,將集群配置到本地,

所以得讓它知道這僅僅是開發(fā),而且我們很清楚自己在做什么.如果是生產(chǎn)環(huán)境中,則要將其部署在不同的機(jī)器上.

想添加片的時(shí)候,就運(yùn)行addshard.MongoDB會(huì)負(fù)責(zé)將片集成到集群.

切分?jǐn)?shù)據(jù)

MongoDB不會(huì)將存儲(chǔ)的每一條數(shù)據(jù)都直接發(fā)布,得先在數(shù)據(jù)庫(kù)和集合的級(jí)別將分片功能打開.

如果是連接配置服務(wù)器,

E:\mongo\bin>mongo 127.0.0.1:20000
MongoDB shell version: 2.0.6
connecting to: 127.0.0.1:20000/test
> use admin
switched to db admin
> db.runCommand({"enablesharding":"test"})
{
"errmsg" : "no such cmd: enablesharding",
"bad cmd" : {
"enablesharding" : "test"
},
"ok" : 0
}

應(yīng)該是連接 路由服務(wù)器:

db.runCommand({"enablesharding":"test"})//將test數(shù)據(jù)庫(kù)啟用分片功能.

對(duì)數(shù)據(jù)庫(kù)分片后,其內(nèi)部的集合便會(huì)存儲(chǔ)到不同的片上,同時(shí)也是對(duì)這些集合分片的前置條件.

在數(shù)據(jù)庫(kù)級(jí)別啟用了分片以后,就可以使用shardcollection命令堆積和進(jìn)行分片:

db.runCommand({"shardcollection":"test.refactor","key":{"name":1}})//對(duì)test數(shù)據(jù)庫(kù)的refactor集合進(jìn)行分片,片鍵是name

如果現(xiàn)在對(duì)refactor集合添加數(shù)據(jù),就會(huì)依據(jù)"name"的值自動(dòng)分散到各個(gè)片上.

9.生產(chǎn)配置

進(jìn)入生產(chǎn)環(huán)境后,需要更健壯的分片方案,成功的構(gòu)建分片需要如下條件:

多個(gè)配置服務(wù)器

多個(gè)mongos服務(wù)器

每個(gè)片都是副本集

正確的設(shè)置w

健壯的配置

設(shè)置多個(gè)配置服務(wù)器是很簡(jiǎn)單的.

設(shè)置多個(gè)配置服務(wù)器和設(shè)置一個(gè)配置服務(wù)器一樣

mongod --dbpath "F:\mongo\dbs\config" --port 20000 --logpath "F:\mongo\logs\config\MongoDB.txt" --rest

mongod --dbpath "F:\mongo\dbs\config1" --port 20001 --logpath "F:\mongo\logs\config1\MongoDB.txt" --rest

mongod --dbpath "F:\mongo\dbs\config2" --port 20002 --logpath "F:\mongo\logs\config2\MongoDB.txt" --rest

啟動(dòng)mongos的時(shí)候應(yīng)將其連接到3個(gè)配置服務(wù)器上:

mongos --port 30000 --configdb 127.0.0.1:20000,127.0.0.1:20001,127.0.0.1:20002 --logpath "F:\mongo\logs\mongos\MongoDB.txt"

配置服務(wù)器使用的是兩步提交機(jī)制,而不是普通的MongoDB的異步復(fù)制,來維護(hù)集群配置的不同副本.這樣能保證集群的狀態(tài)

的一致性.這意味著,某臺(tái)配置服務(wù)器宕機(jī)后,集群的配置信息是只讀的.客戶端還是能夠讀寫,但是只有所有配置服務(wù)器備份了

以后才能重新均衡數(shù)據(jù).

多個(gè)mongos

mongos的數(shù)量不受限制,建議針對(duì)一個(gè)應(yīng)用服務(wù)器只運(yùn)行一個(gè)mongos進(jìn)程.這樣每個(gè)應(yīng)用服務(wù)器就可以與mongos進(jìn)行

本地回話,如果服務(wù)器不工作了,就不會(huì)有應(yīng)用試圖與不存的mongos通話了

健壯的片

生產(chǎn)環(huán)境中,每個(gè)片都應(yīng)是副本集,這樣單個(gè)服務(wù)器壞了,就不會(huì)導(dǎo)致整個(gè)片失效.用addshard命令就可以將副本集作為片添加,

添加時(shí),只要指定副本集的名稱和種子就行了.

如要添加副本集refactor,其中包含一個(gè)服務(wù)器127.0.0.1:10000(還有別的服務(wù)器),就可以用下列命令將其添加到集群中:

db.runCommand({"addshard":"refactor/127.0.0.1:10000"})

如果127.0.0.1:10000服務(wù)器掛了,mongos會(huì)知道它所連接的是一個(gè)副本集,并會(huì)使用新的主節(jié)點(diǎn).

10.管理分片

分片信息主要存放在config數(shù)據(jù)庫(kù)上,這樣就能被任何連接到mongos的進(jìn)程訪問到了.

配置集合

在shell中連接了mongos,并使用了use config數(shù)據(jù)庫(kù)

a.片

可以在shareds集合中查到所有的片

db.shards.find()

b.數(shù)據(jù)庫(kù)

databases集合含有已經(jīng)包含在片上的數(shù)據(jù)庫(kù)列表和一些相關(guān)信息

db.databases.find()

返回的文檔解釋:

"_id"

表示數(shù)據(jù)庫(kù)名

"partitioned"

表示是否啟用了分片功能

"primary"

這個(gè)值與"_id"相對(duì)應(yīng),表名這個(gè)數(shù)據(jù)的"大本營(yíng)"在哪里.不論分片與否,數(shù)據(jù)庫(kù)總會(huì)有個(gè)大本營(yíng).要是分片的話,創(chuàng)建數(shù)據(jù)庫(kù)時(shí)會(huì)

隨機(jī)選擇一個(gè)片.也就是說,大本營(yíng)是開始創(chuàng)建數(shù)據(jù)庫(kù)文檔的位置.雖然分片時(shí)數(shù)據(jù)庫(kù)也會(huì)用到很多別的服務(wù)器,但會(huì)從這個(gè)片開始.

c.塊

塊信息存儲(chǔ)在chunks集合中.這可以看到數(shù)據(jù)到底是怎么切分到集群中的

db.chunks.find()

分片命令

獲得概要

db.printShardingStatus()

刪除片

用removeshard就能從集群中刪除片.removeshard會(huì)把給定片上的所有塊的數(shù)據(jù)都挪到其他片上

db.runCommand({"removeshard":"127.0.0.1:10001"})

在挪動(dòng)過程中,removeshard會(huì)顯示進(jìn)程

 MongoDB中怎么實(shí)現(xiàn)分片操作

上述內(nèi)容就是MongoDB中怎么實(shí)現(xiàn)分片操作,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

本文題目:MongoDB中怎么實(shí)現(xiàn)分片操作-創(chuàng)新互聯(lián)
網(wǎng)頁鏈接:http://muchs.cn/article44/dscpee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、網(wǎng)站設(shè)計(jì)網(wǎng)站建設(shè)、建站公司、全網(wǎng)營(yíng)銷推廣、服務(wù)器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司