MongoDB分區配置

來源:互聯網
上載者:User
簡單註解: mongos 路由進程, 應用程式接入mongos再查詢到具體分區,監聽連接埠預設27017 config server 路由表格服務, 每一台都具有全部chunk的路由資訊  shard為資料存放區分區, 每一片都可以是複製集(replica set)

部署分區叢集
#配置mongoDB shareding時,使用hosts網域名稱代替IP地址好處非常多,可以在很多遷移的地方,直接更換遷移伺服器,IP地址變了也沒關係 #例如在遷移config伺服器時,只需要在mongos伺服器裡面把配置的config伺服器的hosts綁定修改一下即可
step 1 啟動config server /usr/bin/mongod --configsvr --dbpath /data/mongodb/config/  --logpath/data/mongodb/config/log/configdb.log --port 20000 #正式生產環境一般啟動3個config server,啟動3個是為了做熱備,三個config server中有一個失敗則三個config server叢集變成唯讀群集
step 2 啟動mongos /usr/bin/mongos --configdb 192.168.10.1:20000,192.168.10.2:20000,192.168.10.3:20000 --logpath/data/mongodb/mongos/mongos.log #把所有要加入到分區的mongo設定檔都加入進來 step3 啟動分區mongod /usr/bin/mongod --shardsvr --replSet rs1 --dbpath /data/mongodb/data/ --logpath /tmp/sharda.log  --port 10000 /usr/bin/mongod --shardsvr --replSet rs2 --dbpath /data/mongodb/data/ --logpath /tmp/sharda.log  --port 10000
/usr/bin/mongod --shardsvr --replSet rs3 --dbpath /data/mongodb/data/ --logpath /tmp/sharda.log  --port 10000  –directoryperdb
#分區是一個mongo複本集,--replSet rs1是複本集的名稱,生產環境即使分區是單台伺服器,也建議這麼設定,方便以後擴充 #上面是在3台不同的伺服器上啟動的三個複本集,名稱分別上rs1,rs2,rs3 #可以啟用這個命令, –directoryperdb
/usr/bin/mongod --shardsvr --dbpath /data/mongodb/data/ --logpath /tmp/sharda.log  --port 10000
#分區是一個普通的mongo伺服器  
step4 在mongos添加分區 mongo 127.0.0.1/admin #用mongo 串連上mongos,切換到admin庫 sh.addShard("rs1/192.168.10.1:20000") 
sh.addShard("rs2/192.168.10.2:20000") 
sh.addShard("rs3/192.168.10.3:20000") 
sh.addShard("rs3/192.168.10.3:20000","allowLocal :1") 
sh.addShard("shared4/10.26.79.89:27017,10.26.165.157:27017,10.26.165.112:27017")  db.runCommand( { addshard : "127.0.0.1:27020", allowLocal :1} ) #添加一個 replica set複本集作為一個分區 #上面是添加了三個複本集,每個複本集目前只有一個成員,做了三個分區 #實際上在分區情況下在一個複本集中可以只有一個或者兩個成員,不一定至少三個 #添加本地的分區時可能需要參數“allowLocal :1” sh.addShard("192.168.10.1:20000") #添加非replica set作為分區: 

step5 對某個資料庫啟用分區 sh.enableSharding("test") #這裡只是標識這個test資料庫可以啟用分區,但實際上還並沒有進行分區。   step6 對collection進行分區 sh.shardCollection("records.people", { "zipcode": 1, "name": 1 } ) sh.shardCollection("people.addresses", { "state": 1, "_id": 1 } ) sh.shardCollection("assets.chairs", { "type": 1, "_id": 1 } )  #對某個庫的某個表進行分區,分區的key可以使用單個欄位,也可以使用多個欄位 #這裡分區用的key,就自動變成該表的索引欄位 #至於具體哪一行分到哪一片了,只有config設定檔知道 #不像atlas可以明確的知道那行在哪個表裡面 #對一個已經有資料的表進行分區時需要先建立索引,再把索引欄位當作分區key來進行分區 db.alerts.ensureIndex( { _id : "hashed"} ) sh.shardCollection("events.alerts", { "_id": "hashed"} ) db.t3.ensureIndex({age:1} , {backgroud:true}) #對alerts表進行建立索引操作,增加一個_id索引欄位,並對該欄位產生隨機hash值,這樣就可以根據這個hash sharded key進行分區了 #hash sharded key是為瞭解決某些情況下sharded key的 write scaling的問題。 #_id欄位是mongodb預設每行都有的
分區的正確姿勢 sh.enableSharding("mexueGrowth") #先對資料庫啟用分區 db.growth_user_record.ensureIndex({ "userId" : 1, "recordId" : 1 }, { name : "_idx_userId_recordId" }, { "background" : true }) #對需要分區的空的collection建立分區索引 sh.shardCollection("mexueGrowth.growth_user_record", { "userId" : 1, "recordId" : 1 } ) #在空的collection上啟用分區 #最後將資料匯入 #這樣就可以保證分區一定成功,不論資料量有多大
如何選擇shard key
shard key需要有高的cardinality,也就是shard key需要擁有很多不同的值, 便於資料的切分和遷移。 盡量與應用程式融合,讓mongos面對查詢時可以直接定位到某個shard 具有隨機性,這是為了不會讓某段時間內的insert請求全部集中到某個單獨的分區上,造成單片的寫速度成為整個叢集的瓶頸 用objectId作為shard key時會發生隨機性差情況,ObjectId實際上由進程ID+TIMESTAMP + 其他因素組成, 所以一段時間內的timestamp會相對集中 不過隨機性高會有一個副作用,就是query isolation性比較差 可用hash key增加隨機性

如何查看shard資訊 登上mongos sh.status() sh.status({verbose:true}) #需要看的詳細一點 Sharding Status --- sharding version: { "_id": 1, "version": 3 } shards: {  "_id": "shard0000",  "host": " m0.example.net:30001"} {  "_id": "shard0001",  "host": " m3.example2.net:50000"} databases: {  "_id": "admin",  "partitioned": false,  "primary": "config"} {  "_id": "contacts",  "partitioned": true,  "primary": "shard0000"} foo.contacts shard key: { "zip": 1 } chunks: shard0001    2 shard0002    3 shard0000    2 { "zip": { "$minKey": 1 } } -->> { "zip": 56000 } on : shard0001 { "t": 2, "i": 0 } { "zip": 56000 } -->> { "zip": 56800 } on : shard0002 { "t": 3, "i": 4 } { "zip": 56800 } -->> { "zip": 57088 } on : shard0002 { "t": 4, "i": 2 } { "zip": 57088 } -->> { "zip": 57500 } on : shard0002 { "t": 4, "i": 3 } { "zip": 57500 } -->> { "zip": 58140 } on : shard0001 { "t": 4, "i": 0 } { "zip": 58140 } -->> { "zip": 59000 } on : shard0000 { "t": 4, "i": 1 } { "zip": 59000 } -->> { "zip": { "$maxKey": 1 } } on : shard0000 { "t": 3, "i": 3 } {  "_id": "test",  "partitioned": false,  "primary": "shard0000"}
     
備份cluster meta information #mongoDB的Balance是指分區資料時儲存在config資料庫裡的資料同步 #就是每個config server之間的資料同步 Step1 disable balance process.      sh.getBalancerState()     #查看分區的Balancer複製狀態     sh.setBalancerState(false)     #停止分區的Balancer複製

Step2 關閉config server 

Step3 備份資料檔案夾 

Step4 重啟config server  Step5 enable balance process.     sh.setBalancerState(true)     #啟動分區的Balancer複製


查看balance 狀態
可以通過下面的命令來查看當前的balance進程狀態。先串連到任意一台mongos use config db.locks.find( { _id : "balancer" } ).pretty() {   "_id" : "balancer", "process" : " mongos0.example.net:1292810611:1804289383",   "state" : 2,      "ts" : ObjectId("4d0f872630c42d1978be8a2e"),    "when" : "Mon Dec 20 2010 11:41:10 GMT-0500 (EST)",     "who" : " mongos0.example.net:1292810611:1804289383:Balancer:846930886",     "why" : "doing balance round" }   state=2 表示進行中balance, 在2.0版本之前這個值是1 配置balance時間視窗
可以通過balance時間視窗指定在一天之內的某段時間之內可以進行balance, 其他時間不得進行balance。 先串連到任意一台mongos use config db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "23:00", stop : "6:00" } } }, true ) 這個設定讓只有從23:00到6:00之間可以進行balance
也可以取消時間視窗設定: use config db.settings.update({ _id : "balancer" }, { $unset : { activeWindow : true } })
修改chunk size
這是一個全域的參數。 預設是64MB。 小的chunk會讓不同的shard資料量更均衡。 但會導致更多的Migration。 大的chunk會減少migration。不同的shard資料量不均衡。 這樣修改chunk size。先串連上任意mongos db.settings.save( { _id:"chunksize", value: "256" } ) 單位是MB
何時會自動balance
每個mongos進程都可能發動balance。 一次只會有一個balance跑。 這是因為需要競爭這個鎖: db.locks.find( { _id : "balancer" } ) balance一次只會遷移一個chunk。  
設定分區上最大的儲存容量
有兩種方式,第一種在添加分區時候用maxSize參數指定: db.runCommand( { addshard : " example.net:34008", maxSize : 125 } )
第二種方式可以在運行中修改設定: use config db.shards.update( { _id : "shard0000" }, { $set : { maxSize : 250 } } )
刪除分區
串連上任意一台mongos STEP1 確認balancer已經開啟
STEP2 運行命令: db.runCommand( { removeShard: "mongodb0" } ) #mongodb0是需要刪除的分區的名字。這時balancer進程會開始把要刪除掉的分區上的資料往別的分區上遷移。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.