主頁(yè) > 知識(shí)庫(kù) > MongoDB的分片集群基本配置教程

MongoDB的分片集群基本配置教程

熱門標(biāo)簽:地方門戶網(wǎng)站 呼叫中心市場(chǎng)需求 網(wǎng)站排名優(yōu)化 鐵路電話系統(tǒng) AI電銷 百度競(jìng)價(jià)排名 服務(wù)外包 Linux服務(wù)器

為何要分片
1.減少單機(jī)請(qǐng)求數(shù),降低單機(jī)負(fù)載,提高總負(fù)載
2.減少單機(jī)的存儲(chǔ)空間,提高總存空間。

常見(jiàn)的mongodb sharding 服務(wù)器架構(gòu)

要構(gòu)建一個(gè) MongoDB Sharding Cluster,需要三種角色:
1.Shard Server
即存儲(chǔ)實(shí)際數(shù)據(jù)的分片,每個(gè)Shard可以是一個(gè)mongod實(shí)例,也可以是一組mongod實(shí)例構(gòu)成的Replication Set。為了實(shí)現(xiàn)每個(gè)Shard內(nèi)部的auto-failover(自動(dòng)故障切換),MongoDB官方建議每個(gè)Shard為一組Replica Set。
2.Config Server
為了將一個(gè)特定的collection存儲(chǔ)在多個(gè)shard中,需要為該collection指定一個(gè)shard key(片鍵),例如{age: 1} ,shard key可以決定該條記錄屬于哪個(gè)chunk(分片是以chunk為單位,后續(xù)會(huì)介紹)。Config Servers就是用來(lái)存儲(chǔ):所有shard節(jié)點(diǎn)的配置信息、每個(gè)chunk的shard key范圍、chunk在各shard的分布情況、該集群中所有DB和collection的sharding配置信息。
3.Route Process
這是一個(gè)前端路由,客戶端由此接入,然后詢問(wèn)Config Servers需要到哪個(gè)Shard上查詢或保存記錄,再連接相應(yīng)的Shard進(jìn)行操作,最后將結(jié)果返回給客戶端??蛻舳酥恍枰獙⒃景l(fā)給mongod的查詢或更新請(qǐng)求原封不動(dòng)地發(fā)給Routing Process,而不必關(guān)心所操作的記錄存儲(chǔ)在哪個(gè)Shard上。(所有操作在mongos上操作即可)

配置分片服務(wù)器
下面我們?cè)谕慌_(tái)物理機(jī)器上構(gòu)建一個(gè)簡(jiǎn)單的 Sharding Cluster:

Shard Server 1:27017
Shard Server 2:27018
Config Server :27027
Route Process:40000

1.步驟一: 啟動(dòng)Shard Server

mkdir -p ./data/shard/s0 ./data/shard/s1 #創(chuàng)建數(shù)據(jù)目錄
mkdir -p ./data/shard/log # 創(chuàng)建日志目錄
./bin/mongod --port 27017 --dbpath /usr/local/mongodb/data/shard/s0 --fork --logpath /usr/local/mongodb/data/shard/log/s0.log # 啟動(dòng)Shard Server實(shí)例1
./bin/mongod --port 27018 --dbpath /usr/local/mongodb/data/shard/s1 --fork --logpath /usr/local/mongodb/data/shard/log/s1.log # 啟動(dòng)Shard Server實(shí)例2

步2.驟二: 啟動(dòng)Config Server

mkdir -p ./data/shard/config #創(chuàng)建數(shù)據(jù)目錄
./bin/mongod --port 27027 --dbpath /usr/local/mongodb/data/shard/config --fork --logpath /usr/local/mongodb/data/shard/log/config.log #啟動(dòng)Config Server實(shí)例

注意,這里我們完全可以像啟動(dòng)普通mongodb服務(wù)一樣啟動(dòng),不需要添加—shardsvr和configsvr參數(shù)。因?yàn)檫@兩個(gè)參數(shù)的作用就是改變啟動(dòng)端口的,所以我們自行指定了端口就可以
3.步驟三: 啟動(dòng)Route Process
./bin/mongos --port 4000 --configdb localhost:27027 --fork --logpath /usr/local/mongodb/data/shard/log/route.log --chunkSize=1 # 啟動(dòng)Route Server實(shí)例
mongos啟動(dòng)參數(shù)中,chunkSize這一項(xiàng)是用來(lái)指定chunk的大小的,單位是MB,默認(rèn)大小為200MB,為了方便測(cè)試Sharding效果,我們把chunkSize指定為 1MB。意思是當(dāng)這個(gè)分片中插入的數(shù)據(jù)大于1M時(shí)開(kāi)始進(jìn)行數(shù)據(jù)轉(zhuǎn)移
4.步驟四: 配置Sharding

# 我們使用MongoDB Shell登錄到mongos,添加Shard節(jié)點(diǎn)
./bin/mongo admin --port 40000 #此操作需要連接admin庫(kù)
> db.runCommand({ addshard:"localhost:27017" }) #添加 Shard Server 或者用 sh.addshard()命令來(lái)添加,下同;
{ "shardAdded" : "shard0000", "ok" : 1 }
> db.runCommand({ addshard:"localhost:27018" })
{ "shardAdded" : "shard0001", "ok" : 1 }
> db.runCommand({ enablesharding:"test" }) #設(shè)置分片存儲(chǔ)的數(shù)據(jù)庫(kù)
{ "ok" : 1 }
> db.runCommand({ shardcollection: "test.users", key: { id:1 }}) # 設(shè)置分片的集合名稱。且必須指定Shard Key,系統(tǒng)會(huì)自動(dòng)創(chuàng)建索引,然后根據(jù)這個(gè)shard Key來(lái)計(jì)算
{ "collectionsharded" : "test.users", "ok" : 1 }
 > sh.status(); #查看片的狀態(tài)
 > printShardingStatus(db.getSisterDB("config"),1); # 查看片狀態(tài)(完整版);
 > db.stats(); # 查看所有的分片服務(wù)器狀態(tài)

注意這里我們要注意片鍵的選擇,選擇片鍵時(shí)需要根據(jù)具體業(yè)務(wù)的數(shù)據(jù)形態(tài)來(lái)選擇,切不可隨意選擇,實(shí)際中尤其不要輕易選擇自增_id作為片鍵,除非你很清楚你這么做的目的,具體原因我不在此分析,根據(jù)經(jīng)驗(yàn)推薦一種較合理的片鍵方式,“自增字段+查詢字段”,沒(méi)錯(cuò),片鍵可以是多個(gè)字段的組合。
另外這里說(shuō)明一點(diǎn),分片的機(jī)制:mongodb不是從單篇文檔的級(jí)別,絕對(duì)平均的散落在各個(gè)片上, 而是N篇文檔,形成一個(gè)塊"chunk",優(yōu)先放在某個(gè)片上, 當(dāng)這片上的chunk,比另一個(gè)片的chunk區(qū)別比較大時(shí)(>=3) ,會(huì)把本片上的chunk,移到另一個(gè)片上, 以chunk為單位,維護(hù)片之間的數(shù)據(jù)均衡。
也就是說(shuō),一開(kāi)始插入數(shù)據(jù)時(shí),數(shù)據(jù)是只插入到其中一塊分片上的,插入完畢后,mongodb內(nèi)部開(kāi)始在各片之間進(jìn)行數(shù)據(jù)的移動(dòng),這個(gè)過(guò)程可能不是立即的,mongodb足夠智能會(huì)根據(jù)當(dāng)前負(fù)載決定是立即進(jìn)行移動(dòng)還是稍后移動(dòng)。
在插入數(shù)據(jù)后,立馬執(zhí)行db.users.stats();兩次可以驗(yàn)證如上所說(shuō)。
這種分片機(jī)制,節(jié)省了人工維護(hù)成本,但是由于其是優(yōu)先往某個(gè)片上插入,等到chunk失衡時(shí),再移動(dòng)chunk,并且隨著數(shù)據(jù)的增多,shard的實(shí)例之間,有chunk來(lái)回移動(dòng)的現(xiàn)象,這將會(huì)為服務(wù)器帶來(lái)很大的IO開(kāi)銷,解決這種開(kāi)銷的方法,就是手動(dòng)預(yù)先分片;

手動(dòng)預(yù)先分片
以shop.user表為例:

sh.shardCollection(‘shop.user',{userid:1}); # user表用userid做shard key
for(var i=1;i=40;i++) { sh.splitAt('shop.user',{userid:i*1000}) } # 預(yù)先在1K 2K...40K這樣的界限切好chunk(雖然chunk是空的), 這些chunk將會(huì)均勻移動(dòng)到各片上.

通過(guò)mongos添加user數(shù)據(jù). 數(shù)據(jù)會(huì)添加到預(yù)先分配好的chunk上, chunk就不會(huì)來(lái)回移動(dòng)了.

repliction set and shard
一般mongoDB如果真的到了分片的級(jí)別后,那片服務(wù)器避無(wú)可免的要用到復(fù)制集,部署的基本思路同上,只需要注意兩點(diǎn):
sh.addShard( host ) server:port OR setname/server:port # 如果是復(fù)制集的片服務(wù)器,我們應(yīng)該復(fù)制集的名稱寫在前面比如
sh.addShard('ras/192.168.42.168:27017'); # 27017也就是復(fù)制集中的primary
另外在啟動(dòng)本機(jī)的mongod服務(wù)的時(shí)候,最好把ip也給寫進(jìn)去,否則有可能會(huì)有不可預(yù)知的錯(cuò)誤。

查看分片配置的方法:

1.列舉使用分片的數(shù)據(jù)庫(kù)
為了列舉使用分片的數(shù)據(jù)庫(kù),需要查詢Config數(shù)據(jù)庫(kù)。如果partitioned域值為true,則這個(gè)庫(kù)使用了分片技術(shù)。
連接一個(gè)mongos實(shí)例,運(yùn)行命令獲取使用分片功能的數(shù)據(jù)庫(kù):

use config
db.databases.find( { "partitioned" : true} )

例如:使用以下命令返回集群中的所有數(shù)據(jù)庫(kù)

use config
db.databases.find()

如果返回結(jié)果:

{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "mydb", "partitioned" : true, "primary" : "firstset" }
{ "_id" : "test", "partitioned" : false, "primary" : "secondset" }

顯示只有mydb使用了分片。

2.列舉所有的分片
為了列舉當(dāng)前集合的所有分片,使用listShards命令:

use admin
db.runCommand( { listShards : 1 })

返回結(jié)果:

{
    "shards" : [
        {
            "_id" : "firstset",
            "host" : "firstset/mongo01:10001,mongo01:10002,mongo01:10003"
        },
        {
            "_id" : "secondset",
            "host" : "secondset/mongo01:30001,mongo01:30002,mongo01:30003"
        }
    ],
    "ok" : 1
}

3.查看集群的詳細(xì)信息
為了查看集群的詳細(xì)信息,可以使用db.printShardingStatus()或者sh.status()。所有的方法返回同樣的結(jié)果。
例如,使用

sh.status()

查看信息:

--- Sharding Status --- 
 sharding version: {
    "_id" : 1,
    "version" : 4,
    "minCompatibleVersion" : 4,
    "currentVersion" : 5,
    "clusterId" : ObjectId("535a2dab0063b308757e1b70")
}
 shards:
    { "_id" : "firstset", "host" : "firstset/mongo01:10001,mongo01:10002,mongo01:10003" }
    { "_id" : "secondset", "host" : "secondset/mongo01:30001,mongo01:30002,mongo01:30003" }
 databases:
    { "_id" : "admin", "partitioned" : false, "primary" : "config" }
    { "_id" : "mydb", "partitioned" : true, "primary" : "firstset" }
        mydb.test_collection
            shard key: { "name" : 1 }
            chunks:
                secondset    6
                firstset    6
            { "name" : { "$minKey" : 1 } } -->> { "name" : "cat" } on : secondset Timestamp(2, 0) 
            { "name" : "cat" } -->> { "name" : "cow" } on : secondset Timestamp(3, 0) 
            { "name" : "cow" } -->> { "name" : "dog" } on : secondset Timestamp(4, 0) 
            { "name" : "dog" } -->> { "name" : "dragon" } on : secondset Timestamp(5, 0) 
            { "name" : "dragon" } -->> { "name" : "elephant" } on : secondset Timestamp(6, 0) 
            { "name" : "elephant" } -->> { "name" : "horse" } on : secondset Timestamp(7, 0) 
            { "name" : "horse" } -->> { "name" : "lion" } on : firstset Timestamp(7, 1) 
            { "name" : "lion" } -->> { "name" : "pig" } on : firstset Timestamp(1, 7) 
            { "name" : "pig" } -->> { "name" : "rabbit" } on : firstset Timestamp(1, 8) 
            { "name" : "rabbit" } -->> { "name" : "snake" } on : firstset Timestamp(1, 9) 
            { "name" : "snake" } -->> { "name" : "tiger" } on : firstset Timestamp(1, 10) 
            { "name" : "tiger" } -->> { "name" : { "$maxKey" : 1 } } on : firstset Timestamp(1, 11) 
    { "_id" : "test", "partitioned" : false, "primary" : "secondset" }

(1)sharding version展示了分片元數(shù)據(jù)的版本號(hào)。
(2)shards展示了在集群中被作為分片的mongod實(shí)例。
(3)databases展示了集群中所有的數(shù)據(jù)庫(kù),包括沒(méi)有使用分片功能的庫(kù)。
(4)chunks信息展示了mydb庫(kù)的每個(gè)分片上有多少個(gè)塊和每個(gè)塊的范圍。

您可能感興趣的文章:
  • MongoDB分片集群部署詳解
  • 分布式文檔存儲(chǔ)數(shù)據(jù)庫(kù)之MongoDB分片集群的問(wèn)題

標(biāo)簽:湖南 銅川 蘭州 崇左 仙桃 衡水 黃山 湘潭

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MongoDB的分片集群基本配置教程》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266