標籤:root 擴充 mes 環境 故障 man vim mongodb分區 status
MongoDB 分區
分區的目的
高資料量和輸送量的資料庫應用會對單機的效能造成較大壓力,大的查詢量會將單機的CPU耗盡,大的資料量對單機的儲存壓力較大,最終會耗盡系統的記憶體而將壓力轉移到磁碟IO上。
解決方案 :有兩個基本的方法: 垂直擴充和水平擴充。
垂直擴充:增加更多的CPU和儲存資源來擴充容量。
- 水平擴充:將資料集分布在多個伺服器上。水平擴充即分區
分區結構圖(圖片來源於網路) :
MongoDB 分區群集的組成(圖片來源於網路) :MongoDB分區群集的三個主要組件:
Shard:
用於儲存實際的資料區塊,實際生產環境中一個shard server角色可由幾台機器組個一個replica set承擔,防止主機單點故障
Config Server:
mongod執行個體,儲存了整個 ClusterMetadata,其中包括 chunk資訊。
Query Routers:
前端路由,用戶端由此接入,且讓整個叢集看上去像單一資料庫,前端應用可以透明使用。
分區群集的簡單部署 :實驗環境 :1台路由執行個體(連接埠27017)。1台配置執行個體(連接埠37017)。2台shard執行個體(連接埠47017、47018)。1.配置設定管理員 :
vim mongodb1.confport=37017dbpath=/data/mongodb/mongodb1logpath=/data/logs/mongodb1.loglogappend=truefork=truemaxConns=5000storageEngine=mmapv1configsvr=true #開啟佈建服務mongod -f /usr/local/mongodb/bin/mongodb1.conf #開啟配置執行個體
2.配置分區伺服器 :
vim mongodb2.confport=47017dbpath=/data/mongodb/mongodb2logpath=/data/logs/mongodb2.loglogappend=truefork=truemaxConns=5000storageEngine=mmapv1shardsvr=true #開啟分區服務vim mongodb3.confport=47018dbpath=/data/mongodb/mongodb3logpath=/data/logs/mongodb3.loglogappend=truefork=truemaxConns=5000storageEngine=mmapv1shardsvr=true #開啟分區服務mongod -f /usr/local/mongodb/bin/mongodb2.conf #開啟分區執行個體mongod -f /usr/local/mongodb/bin/mongodb3.conf
3.啟動路由伺服器 :
[[email protected] bin]# ./mongos --port 27017 --fork --logpath=/usr/local/mongodb/bin/route.log --configdb 192.168.217.134:37017 --chunkSize 12018-07-23T14:15:28.185+0800 W SHARDING [main] Running a sharded cluster with fewer than 3 config servers should only be done for testing purposes and is not recommended for production.about to fork child process, waiting until server is ready for connections.forked process: 15337child process started successfully, parent exiting
4.添加分區伺服器 :
[[email protected] bin]# mongoMongoDB shell version: 3.2.1......mongos> show dbsconfig 0.031GBmongos> sh.status() #查看分區狀態--- Sharding Status --- sharding version: { "_id" : 1, "minCompatibleVersion" : 5, "currentVersion" : 6, "clusterId" : ObjectId("5b557280f9effb757fd31cdb")} shards: #分區為空白 active mongoses: "3.2.1" : 1 balancer: Currently enabled: yes Currently running: no Failed balancer rounds in last 5 attempts: 0 Migration Results for the last 24 hours: No recent migrations databases:mongos> sh.addShard("192.168.217.134:47017") #添加分區{ "shardAdded" : "shard0000", "ok" : 1 }mongos> sh.addShard("192.168.217.134:47018"){ "shardAdded" : "shard0001", "ok" : 1 }mongos> sh.status() #查看分區狀態--- Sharding Status --- sharding version: { "_id" : 1, "minCompatibleVersion" : 5, "currentVersion" : 6, "clusterId" : ObjectId("5b557280f9effb757fd31cdb")} shards: #分區資訊 { "_id" : "shard0000", "host" : "192.168.217.134:47017" } { "_id" : "shard0001", "host" : "192.168.217.134:47018" } active mongoses: "3.2.1" : 1 balancer: Currently enabled: yes Currently running: no Failed balancer rounds in last 5 attempts: 0 Migration Results for the last 24 hours: No recent migrations databases:
4.啟用分區伺服器 :
mongos> use testswitched to db testmongos> for(var i=1;i<=10000;i++)db.users.insert({"id":i,"name":"tom"+i}) #添加資料WriteResult({ "nInserted" : 1 })mongos> sh.status() ....... databases: { "_id" : "test", "primary" : "shard0000", "partitioned" : false } #partitioned 值為false 表示資料庫尚未分區。mongos> sh.enableSharding("test") #啟用資料庫分區mongos> db.users.createIndex({"id":1}) #建立索引mongos> sh.shardCollection("test.users",{"id":1}) #表分區{ "collectionsharded" : "test.users", "ok" : 1 }mongos> sh.status()...... { "id" : { "$minKey" : 1 } } -->> { "id" : 2341 } on : shard0001 Timestamp(5, 1) { "id" : 2341 } -->> { "id" : 4682 } on : shard0001 Timestamp(3, 0) { "id" : 4682 } -->> { "id" : 7023 } on : shard0000 Timestamp(6, 1) { "id" : 7023 } -->> { "id" : 9364 } on : shard0000 Timestamp(1, 3) { "id" : 9364 } -->> { "id" : 13407 } on : shard0000 Timestamp(3, 2) { "id" : 13407 } -->> { "id" : 21295 } on : shard0000 Timestamp(3, 3) { "id" : 21295 } -->> { "id" : 25976 } on : shard0001 Timestamp(4, 2) { "id" : 25976 } -->> { "id" : 33545 } on : shard0001 Timestamp(4, 3) { "id" : 33545 } -->> { "id" : 38226 } on : shard0000 Timestamp(5, 2) { "id" : 38226 } -->> { "id" : 45910 } on : shard0000 Timestamp(5, 3) { "id" : 45910 } -->> { "id" : { "$maxKey" : 1 } } on : shard0001 Timestamp(6, 0) #資料存放在兩個分區伺服器上即:shard0000、shard0001中。
5.給分區添加標籤 :
mongos> sh.status()...... shards: { "_id" : "shard0000", "host" : "192.168.217.134:47017" } { "_id" : "shard0001", "host" : "192.168.217.134:47018" }mongos> sh.addShardTag("shard0000","sales00") #添加標籤mongos> sh.addShardTag("shard0001","sales01")mongos> sh.status()...... shards: { "_id" : "shard0000", "host" : "192.168.217.134:47017", "tags" : [ "sales00" ] } { "_id" : "shard0001", "host" : "192.168.217.134:47018", "tags" : [ "sales01" ] }
6.刪除分區節點 :
mongos> use adminmongos> db.runCommand({"removeshard":"192.168.217.134:47018"}) #刪除分區節點
ps:MongoDB 4以上的版本做分區,需要先把執行個體做成複製集。
大資料 MongoDB 3.2.1 分區