(五)分片

1、什么是分片

? ? ? ?在Mongodb里面存在另一種集群,就是分片技術(shù),可以滿足MongoDB數(shù)據(jù)量大量增長(zhǎng)的需求。當(dāng)MongoDB存儲(chǔ)海量的數(shù)據(jù)時(shí),一臺(tái)機(jī)器可能不足以存儲(chǔ)數(shù)據(jù),也可能不足以提供可接受的讀寫吞吐量。這時(shí),我們就可以通過在多臺(tái)機(jī)器上分割數(shù)據(jù),使得數(shù)據(jù)庫系統(tǒng)能存儲(chǔ)和處理更多的數(shù)據(jù)。

2、架構(gòu)

分片架構(gòu)

Config Server:存儲(chǔ)集群所有節(jié)點(diǎn)、分片數(shù)據(jù)路由信息。默認(rèn)需要配置3個(gè)Config Server節(jié)點(diǎn)。

Mongos:提供對(duì)外應(yīng)用訪問,所有操作均通過mongos執(zhí)行。一般有多個(gè)mongos節(jié)點(diǎn)。數(shù)據(jù)遷移和數(shù)據(jù)自動(dòng)平衡。

Mongod:存儲(chǔ)應(yīng)用數(shù)據(jù)記錄。一般有多個(gè)Mongod節(jié)點(diǎn),達(dá)到數(shù)據(jù)分片目的。可以是集群。

3、配置

執(zhí)行命令 bash bash.sh

#創(chuàng)建db路徑

mkdir -p /Users/fyh13/fyh13/mongodb/shard/data/db/db27001

mkdir -p /Users/fyh13/fyh13/mongodb/shard/data/db/db27002

mkdir -p /Users/fyh13/fyh13/mongodb/shard/data/db/db27003

mkdir -p /Users/fyh13/fyh13/mongodb/shard/data/db/db27011

mkdir -p /Users/fyh13/fyh13/mongodb/shard/data/db/db27012

mkdir -p /Users/fyh13/fyh13/mongodb/shard/data/db/db27013

mkdir -p /Users/fyh13/fyh13/mongodb/shard/data/db/db27021

mkdir -p /Users/fyh13/fyh13/mongodb/shard/data/db/db27022

mkdir -p /Users/fyh13/fyh13/mongodb/shard/data/db/db27023

mkdir -p /Users/fyh13/fyh13/mongodb/shard/data/db/db27031

mkdir -p /Users/fyh13/fyh13/mongodb/shard/data/db/db27032

mkdir -p /Users/fyh13/fyh13/mongodb/shard/data/db/db27033

mkdir -p /Users/fyh13/fyh13/mongodb/shard/data/db/db40000

#創(chuàng)建日志路徑

mkdir -p /Users/fyh13/fyh13/mongodb/shard/data/logs/logs27001

mkdir -p /Users/fyh13/fyh13/mongodb/shard/data/logs/logs27002

mkdir -p /Users/fyh13/fyh13/mongodb/shard/data/logs/logs27003

mkdir -p /Users/fyh13/fyh13/mongodb/shard/data/logs/logs27011

mkdir -p /Users/fyh13/fyh13/mongodb/shard/data/logs/logs27012

mkdir -p /Users/fyh13/fyh13/mongodb/shard/data/logs/logs27013

mkdir -p /Users/fyh13/fyh13/mongodb/shard/data/logs/logs27021

mkdir -p /Users/fyh13/fyh13/mongodb/shard/data/logs/logs27022

mkdir -p /Users/fyh13/fyh13/mongodb/shard/data/logs/logs27023

mkdir -p /Users/fyh13/fyh13/mongodb/shard/data/logs/logs27031

mkdir -p /Users/fyh13/fyh13/mongodb/shard/data/logs/logs27032

mkdir -p /Users/fyh13/fyh13/mongodb/shard/data/logs/logs27033

mkdir -p /Users/fyh13/fyh13/mongodb/shard/data/logs/logs40000

#啟動(dòng)集群1

mongod --port 27011 --dbpath=/Users/fyh13/fyh13/mongodb/shard/data/db/db27011 --logpath=/Users/fyh13/fyh13/mongodb/shard/data/logs/logs27011/mongodb.log --fork --shardsvr --replSet=rs1

mongod --port 27012 --dbpath=/Users/fyh13/fyh13/mongodb/shard/data/db/db27012 --logpath=/Users/fyh13/fyh13/mongodb/shard/data/logs/logs27012/mongodb.log --fork --shardsvr --replSet=rs1

mongod --port 27013 --dbpath=/Users/fyh13/fyh13/mongodb/shard/data/db/db27013 --logpath=/Users/fyh13/fyh13/mongodb/shard/data/logs/logs27013/mongodb.log --fork --shardsvr --replSet=rs1

#啟動(dòng)集群2

mongod --port 27021 --dbpath=/Users/fyh13/fyh13/mongodb/shard/data/db/db27021 --logpath=/Users/fyh13/fyh13/mongodb/shard/data/logs/logs27021/mongodb.log --fork --shardsvr --replSet=rs2

mongod --port 27022 --dbpath=/Users/fyh13/fyh13/mongodb/shard/data/db/db27022 --logpath=/Users/fyh13/fyh13/mongodb/shard/data/logs/logs27022/mongodb.log --fork --shardsvr --replSet=rs2

mongod --port 27023 --dbpath=/Users/fyh13/fyh13/mongodb/shard/data/db/db27023 --logpath=/Users/fyh13/fyh13/mongodb/shard/data/logs/logs27023/mongodb.log --fork --shardsvr --replSet=rs2

#啟動(dòng)集群3

mongod --port 27031 --dbpath=/Users/fyh13/fyh13/mongodb/shard/data/db/db27031 --logpath=/Users/fyh13/fyh13/mongodb/shard/data/logs/logs27031/mongodb.log --fork --shardsvr --replSet=rs3

mongod --port 27032 --dbpath=/Users/fyh13/fyh13/mongodb/shard/data/db/db27032 --logpath=/Users/fyh13/fyh13/mongodb/shard/data/logs/logs27032/mongodb.log --fork --shardsvr --replSet=rs3

mongod --port 27033 --dbpath=/Users/fyh13/fyh13/mongodb/shard/data/db/db27033 --logpath=/Users/fyh13/fyh13/mongodb/shard/data/logs/logs27033/mongodb.log --fork --shardsvr --replSet=rs3

#啟動(dòng)配置服務(wù)器集群

mongod --port 27001 --dbpath=/Users/fyh13/fyh13/mongodb/shard/data/db/db27001 --logpath=/Users/fyh13/fyh13/mongodb/shard/data/logs/logs27001/mongodb.log --fork --configsvr --replSet=rs0

mongod --port 27002 --dbpath=/Users/fyh13/fyh13/mongodb/shard/data/db/db27002 --logpath=/Users/fyh13/fyh13/mongodb/shard/data/logs/logs27002/mongodb.log --fork --configsvr --replSet=rs0

mongod --port 27003 --dbpath=/Users/fyh13/fyh13/mongodb/shard/data/db/db27003 --logpath=/Users/fyh13/fyh13/mongodb/shard/data/logs/logs27003/mongodb.log --fork --configsvr --replSet=rs0

#配置集群

mongo localhost:27011

rs.initiate({_id: 'rs1', members: [{_id: 0, host: 'localhost:27011'}, {_id: 1, host: 'localhost:27012'},{_id: 2, host: 'localhost:27013'}]})

exit

mongo localhost:27021

rs.initiate({_id: 'rs2', members: [{_id: 0, host: 'localhost:27021'}, {_id: 1, host: 'localhost:27022'},{_id: 2, host: 'localhost:27023'}]})

exit

mongo localhost:27031

rs.initiate({_id: 'rs3', members: [{_id: 0, host: 'localhost:27031'}, {_id: 1, host: 'localhost:27032'},{_id: 2, host: 'localhost:27033'}]})

exit

mongo localhost:27001

rs.initiate({_id: 'rs0', members: [{_id: 0, host: 'localhost:27001'}, {_id: 1, host: 'localhost:27002'},{_id: 2, host: 'localhost:27003'}]})

exit

#啟動(dòng)路由服務(wù)器

mongos --port 40000 --configdb rs0/localhost:27001,localhost:27002,localhost:27003 --fork --logpath=/Users/fyh13/fyh13/mongodb/shard/data/logs/logs40000/mongodb.log --logappend

mongo localhost:40000

use admin

db.runCommand({ addshard: 'rs1/localhost:27011,localhost:27012,localhost:27013'})

db.runCommand({ addshard: 'rs2/localhost:27021,localhost:27022,localhost:27023'})

db.runCommand({ addshard: 'rs3/localhost:27031,localhost:27032,localhost:27033'})

db.runCommand({ enablesharding: 'order'})

db.runCommand({ shardcollection: 'order.orderAttr', key: {orderId: 1}})

sh.status()

#將分片key設(shè)置為索引

use?order

db.orderAttr.ensureIndex({"orderId": 1})

4、sharding key

1)按照范圍

用戶可以指定根據(jù)集合內(nèi)文檔的某個(gè)字段即shard key來進(jìn)行范圍分片(range sharding)

按照鍵值范圍

2)hash

分片過程中利用哈希索引作為分片的單個(gè)鍵,且哈希分片的片鍵只能使用一個(gè)字段,而基于哈希片鍵最大的好處就是保證數(shù)據(jù)在各個(gè)節(jié)點(diǎn)分布基本均勻。

基于hash分片

分片鍵注意事項(xiàng):

分片鍵是不可變。

分片鍵必須有索引。

分片鍵大小限制512bytes。

分片鍵用于路由查詢。

MongoDB不接受已進(jìn)行collection級(jí)分片的collection上插入無分片

鍵的文檔(也不支持空值插入)

5、客戶端連接

mongos> use order

switched to db order

mongos> db.orderAttr.insert({orderId: "1234567", name: "大米"})

WriteResult({ "nInserted" : 1 })

mongos> db.orderAttr.findOne()

{

"_id" : ObjectId("5ae3f94d8460d77fd5ae2d4f"),

"orderId" : "1234567",

"name" : "大米"

}

分片過程中利用哈希索引作為分片的單個(gè)鍵,且哈希分片的片鍵只能使用一個(gè)字段,而基于哈希片鍵最大的好處就是保證數(shù)據(jù)在各個(gè)節(jié)點(diǎn)分布基本均勻。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容