分片(sharding)是MongoDB用來將大型集合分割到不一樣服務器(或者說一個集羣)上所採用的方法。儘管分片起源於關係型數據庫分區,但MongoDB分片徹底又是另外一回事。
和MySQL分區方案相比,MongoDB的最大區別在於它幾乎能自動完成全部事情,只要告訴MongoDB要分配數據,它就能自動維護數據在不一樣服務器之間的均衡。html
高數據量和吞吐量的數據庫應用會對單機的性能形成較大壓力,大的查詢量會將單機的CPU耗盡,大的數據量對單機的存儲壓力較大,最終會耗盡系統的內存而將壓力轉移到磁盤IO上。
爲了解決這些問題,有兩個基本的方法: 垂直擴展和水平擴展。mongodb
各類概念由小到大;數據庫
重點說一下Chunk,在一個shard server內部,MongoDB仍是會把數據分爲chunks,每一個chunk表明這個shard server內部一部分數據。chunk的產生,會有如下兩個用途:服務器
組件 | 說明 |
---|---|
Config Server | 存儲集羣全部節點、分片數據路由信息。默認須要配置3個Config Server節點。 |
Mongos | 提供對外應用訪問,全部操做均經過mongos執行。通常有多個mongos節點。數據遷移和數據自動平衡。 |
Mongod | 存儲應用數據記錄。通常有多個Mongod節點,達到數據分片目的。 |
官方架構圖以下:
架構
10個實例,端口號:38017-38026ide
router(mongos)節點
一個router節點:38017 性能
mkdir -p /mongodb/38021/conf /mongodb/38021/log /mongodb/38021/data mkdir -p /mongodb/38022/conf /mongodb/38022/log /mongodb/38022/data mkdir -p /mongodb/38023/conf /mongodb/38023/log /mongodb/38023/data mkdir -p /mongodb/38024/conf /mongodb/38024/log /mongodb/38024/data mkdir -p /mongodb/38025/conf /mongodb/38025/log /mongodb/38025/data mkdir -p /mongodb/38026/conf /mongodb/38026/log /mongodb/38026/data
修改配置文件
sh1: 測試
cat > /mongodb/38021/conf/mongodb.conf<<EOF systemLog: destination: file path: /mongodb/38021/log/mongodb.log logAppend: true storage: journal: enabled: true dbPath: /mongodb/38021/data directoryPerDB: true #engine: wiredTiger wiredTiger: engineConfig: cacheSizeGB: 1 directoryForIndexes: true collectionConfig: blockCompressor: zlib indexConfig: prefixCompression: true net: bindIp: 11.111.24.4,127.0.0.1 port: 38021 replication: oplogSizeMB: 2048 replSetName: sh1 #replica set名稱 sharding: clusterRole: shardsvr #固定寫法 processManagement: fork: true EOF cp /mongodb/38021/conf/mongodb.conf /mongodb/38022/conf/ cp /mongodb/38021/conf/mongodb.conf /mongodb/38023/conf/ sed 's#38021#38022#g' /mongodb/38022/conf/mongodb.conf -i sed 's#38021#38023#g' /mongodb/38023/conf/mongodb.conf -i
sh2:code
cat > /mongodb/38024/conf/mongodb.conf<<EOF systemLog: destination: file path: /mongodb/38024/log/mongodb.log logAppend: true storage: journal: enabled: true dbPath: /mongodb/38024/data directoryPerDB: true wiredTiger: engineConfig: cacheSizeGB: 1 directoryForIndexes: true collectionConfig: blockCompressor: zlib indexConfig: prefixCompression: true net: bindIp: 11.111.24.4,127.0.0.1 port: 38024 replication: oplogSizeMB: 2048 replSetName: sh2 sharding: clusterRole: shardsvr processManagement: fork: true EOF cp /mongodb/38024/conf/mongodb.conf /mongodb/38025/conf/ cp /mongodb/38024/conf/mongodb.conf /mongodb/38026/conf/ sed 's#38024#38025#g' /mongodb/38025/conf/mongodb.conf -i sed 's#38024#38026#g' /mongodb/38026/conf/mongodb.conf -i
啓動全部節點,並搭建複製集:router
#啓動節點 mongod -f /mongodb/38021/conf/mongodb.conf mongod -f /mongodb/38022/conf/mongodb.conf mongod -f /mongodb/38023/conf/mongodb.conf mongod -f /mongodb/38024/conf/mongodb.conf mongod -f /mongodb/38025/conf/mongodb.conf mongod -f /mongodb/38026/conf/mongodb.conf #配置複製集sh1 mongo --port 38021 admin config = {_id: 'sh1', members: [ {_id: 0, host: '11.111.24.4:38021'}, {_id: 1, host: '11.111.24.4:38022'}, {_id: 2, host: '11.111.24.4:38023',"arbiterOnly":true}] } rs.initiate(config) #配置複製集sh2 mongo --port 38024 admin config = {_id: 'sh2', members: [ {_id: 0, host: '11.111.24.4:38024'}, {_id: 1, host: '11.111.24.4:38025'}, {_id: 2, host: '11.111.24.4:38026',"arbiterOnly":true}] } rs.initiate(config)
mkdir -p /mongodb/38018/conf /mongodb/38018/log /mongodb/38018/data mkdir -p /mongodb/38019/conf /mongodb/38019/log /mongodb/38019/data mkdir -p /mongodb/38020/conf /mongodb/38020/log /mongodb/38020/data
修改配置文件
cat > /mongodb/38018/conf/mongodb.conf <<EOF systemLog: destination: file path: /mongodb/38018/log/mongodb.conf logAppend: true storage: journal: enabled: true dbPath: /mongodb/38018/data directoryPerDB: true #engine: wiredTiger wiredTiger: engineConfig: cacheSizeGB: 1 directoryForIndexes: true collectionConfig: blockCompressor: zlib indexConfig: prefixCompression: true net: bindIp: 11.111.24.4,127.0.0.1 port: 38018 replication: oplogSizeMB: 2048 replSetName: configReplSet sharding: clusterRole: configsvr #固定寫法 processManagement: fork: true EOF cp /mongodb/38018/conf/mongodb.conf /mongodb/38019/conf/ cp /mongodb/38018/conf/mongodb.conf /mongodb/38020/conf/ sed 's#38018#38019#g' /mongodb/38019/conf/mongodb.conf -i sed 's#38018#38020#g' /mongodb/38020/conf/mongodb.conf -i
啓動節點,並配置複製集
mongod -f /mongodb/38018/conf/mongodb.conf mongod -f /mongodb/38019/conf/mongodb.conf mongod -f /mongodb/38020/conf/mongodb.conf mongo --port 38018 admin config = {_id: 'configReplSet', members: [ {_id: 0, host: '11.111.24.4:38018'}, {_id: 1, host: '11.111.24.4:38019'}, {_id: 2, host: '11.111.24.4:38020'}] } rs.initiate(config)
mkdir -p /mongodb/38017/conf /mongodb/38017/log
cat >/mongodb/38017/conf/mongos.conf<<EOF systemLog: destination: file path: /mongodb/38017/log/mongos.log logAppend: true net: bindIp: 11.111.24.4,127.0.0.1 port: 38017 sharding: configDB: configReplSet/11.111.24.4:38018,11.111.24.4:38019,11.111.24.4:38020 processManagement: fork: true EOF
mongos -f /mongodb/38017/conf/mongos.conf
生產上建議使用多個router,防止出現單點問題,全部節點的router配置一致
鏈接到其中一個mongos(11.111.24.4),作如下配置
(1)鏈接到mongs的admin數據庫
# su - mongod $ mongo 11.111.24.4:38017/admin
(2)添加分片
db.runCommand( { addshard : "sh1/11.111.24.4:38021,11.111.24.4:38022,11.111.24.4:38023",name:"shard1"} ) db.runCommand( { addshard : "sh2/11.111.24.4:38024,11.111.24.4:38025,11.111.24.4:38026",name:"shard2"} )
(3)列出分片
mongos> db.runCommand( { listshards : 1 } )
(4)總體狀態查看
mongos> sh.status();
到此MongoDB Sharding Cluster配置完成
test庫下的vast大表進行手工分片
一、激活數據庫分片功能
mongo --port 38017 admin admin> ( { enablesharding : "數據庫名稱" } ) eg: admin> db.runCommand( { enablesharding : "test" } )
二、指定分片建對集合分片
eg:範圍片鍵 --建立索引 use test > db.vast.ensureIndex( { id: 1 } ) --開啓分片 use admin > db.runCommand( { shardcollection : "test.vast",key : {id: 1} } )
三、集合分片驗證
admin> use test test> for(i=1;i<1000000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); } test> db.vast.stats()
四、分片結果測試
shard1: mongo --port 38021 db.vast.count(); shard2: mongo --port 38024 db.vast.count();
對test2庫下的vast大表進行hash
建立哈希索引
(1)對於test2開啓分片功能
mongo --port 38017 admin use admin admin> db.runCommand( { enablesharding : "test2" } )
(2)對於test2庫下的vast表創建hash索引
use test2 test2> db.vast.ensureIndex( { id: "hashed" } )
(3)開啓分片
use admin admin > sh.shardCollection( "test2.vast", { id: "hashed" } )
(4)錄入10w行數據測試
use test2 for(i=1;i<100000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }
(5)hash分片結果測試
mongo --port 38021 use test2 db.vast.count(); mongo --port 38024 use test2 db.vast.count();
判斷是否Shard集羣
admin> db.runCommand({ isdbgrid : 1})
列出全部分片信息
admin> db.runCommand({ listshards : 1})
列出開啓分片的數據庫
admin> use config
config> db.databases.find( { "partitioned": true } )
或者:
config> db.databases.find() //列出全部數據庫分片狀況
查看分片的片鍵
config> db.collections.find().pretty()
{
"_id" : "test.vast",
"lastmodEpoch" : ObjectId("58a599f19c898bbfb818b63c"),
"lastmod" : ISODate("1970-02-19T17:02:47.296Z"),
"dropped" : false,
"key" : {
"id" : 1
},
"unique" : false
}
查看分片的詳細信息
admin> db.printShardingStatus()
或
admin> sh.status() *****
引用:http://www.javashuo.com/article/p-xihlajaa-mb.html
官方文檔:https://docs.mongodb.com/manual/sharding/