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)

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)分布基本均勻。

分片鍵注意事項(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)分布基本均勻。