MongoDB 分片管理

Mongodb版本:3.6 mongodb

1、分片概念

1.數據塊

塊也叫區間,可能存在一分片一區間和一分片多區間兩種狀況。數據庫

一分片一區間:數據不會在片之間自動移動來保持分片的數據的均勻性,須要手動拆分分片來移動數據。緩存

而一分片多區間狀況:一個數據塊默認64MB,當數據塊達到64MB時就會建立新的塊,固然前提是當前的粒度還容許再拆分,平衡器會保證每一個分片數據塊的均勻。可是移動塊也遵循分片的原則,塊之間的數據集不能有交集。服務器

好比一個塊[50-100)如今拆分紅兩個塊,那麼默認會拆分紅[50-75)[75-100)兩個塊,若是當前分片塊比其它分片的塊大於9那麼可能[75-100)改塊會被移動到新的分片當中。網絡

2.平衡器

平衡器(balancer)負責數據的遷移。它會週期性地檢查分片間是否存在不平衡,若是存在,則會開啓塊的遷移。不平衡的表現指,一個分片明顯比其餘分片擁有更多的塊。假若有一些集合達到了閾值,平衡器則會開始作塊遷移。它會從負載比較比較大的分片中選擇一個塊,並詢問該分片是否須要在遷移以前對塊進行拆分。完成必要的拆分後,就會將塊遷移至數量比較少的機器上。併發

2、分片查詢

1.查詢羣集狀態

sh.status

須要顯示隱藏的分片信息執行分佈式

sh.status(true)

2.檢查配置信息

全部的配置信息都保存在配置服務器的config數據庫中。ide

use config

show tables

actionlogspa

記錄平衡器的相關操做日誌。操作系統

changelog

跟蹤記錄集羣的操做,包括集合分片操做、塊拆分和遷移、添加刪除分片等。例如塊拆分信息:

db.getCollection('changelog').find({"what":/split/}).sort({"time":-1}).limit(2)

每次數據庫塊移動都會建立插入4條記錄到changelog文檔總,分別是start、commit、from、to

{

    "_id" : "backup-2018-04-09T15:52:26.656+0800-5acb1bbaebfa528b3521327c",

    "server" : "backup",

    "clientAddr" : "192.168.137.30:53996",

    "time" : ISODate("2018-04-09T07:52:26.656Z"),

    "what" : "moveChunk.start",

    "ns" : "test.person",

    "details" : {

        "min" : {

            "_id" : { "$minKey" : 1 }

        },

        "max" : {

            "_id" : 1.0

        },

        "from" : "rs-b",

        "to" : "rs-a"

    }

}

 

/* 2 */

{

    "_id" : "backup-2018-04-09T15:52:29.289+0800-5acb1bbdebfa528b35213335",

    "server" : "backup",

    "clientAddr" : "192.168.137.30:53996",

    "time" : ISODate("2018-04-09T07:52:29.289Z"),

    "what" : "moveChunk.commit",

    "ns" : "test.person",

    "details" : {

        "min" : {

            "_id" : { "$minKey" : 1 }

        },

        "max" : {

            "_id" : 1.0

        },

        "from" : "rs-b",

        "to" : "rs-a"

    }

}

 

/* 3 */

{

    "_id" : "backup-2018-04-09T15:52:29.297+0800-5acb1bbdebfa528b3521333a",

    "server" : "backup",

    "clientAddr" : "192.168.137.30:53996",

    "time" : ISODate("2018-04-09T07:52:29.297Z"),

    "what" : "moveChunk.from",

    "ns" : "test.person",

    "details" : {

        "min" : {

            "_id" : { "$minKey" : 1 }

        },

        "max" : {

            "_id" : 1.0

        },

        "step 1 of 6" : 0,

        "step 2 of 6" : 10,

        "step 3 of 6" : 153,

        "step 4 of 6" : 2061,

        "step 5 of 6" : 402,

        "step 6 of 6" : 24,

        "to" : "rs-a",

        "from" : "rs-b",

        "note" : "success"

    }

}

 

/* 4 */

{

    "_id" : "master-2018-04-09T15:52:29.307+0800-5acb1bbd7bc60438ea626411",

    "server" : "master",

    "clientAddr" : "",

    "time" : ISODate("2018-04-09T07:52:29.307Z"),

    "what" : "moveChunk.to",

    "ns" : "test.person",

    "details" : {

        "min" : {

            "_id" : { "$minKey" : 1 }

        },

        "max" : {

            "_id" : 1.0

        },

        "step 1 of 6" : 22,

        "step 2 of 6" : 11,

        "step 3 of 6" : 4,

        "step 4 of 6" : 0,

        "step 5 of 6" : 2042,

        "step 6 of 6" : 373,

        "note" : "success"

    }

}
View Code

details字段中的每一步表示的都是時間,"step N of 6"信息以毫秒爲單位顯示步驟耗時的長短。

當from分片收到mongos發來的moveChunks命令時,它會作以下操做:

(1).檢查命令參數;

(2)向配置服務器申請得到一個分佈鎖,以便進入遷移過程;

(3)嘗試鏈接到to分片;

(4)複製數據

(5)與to分片和配置服務器一塊兒確認遷移是否成功完成。

當to分片收到from分片發來的命令時,它會執行以下操做:

(1)遷移索引;

(2)刪除塊範圍內已經存在的任何數據;

(3)將塊中的全部文檔複製到to分片;

(4)在to分片上運行復制期間對這些文檔所執行過的操做;

(5)等待to分片將遷移過來的數據複製到副本集的大多數服務器上。

(6)標誌遷移是否執行成功。

chunks

存儲集合分片全部塊信息

collections

記錄全部分片集合信息,該記錄中的記錄不會由於分片集合被刪除而被清除。

databases

記錄集羣中數據庫的信息,無論數據庫有沒有分片。如數據庫開啓了分片,那麼"partitioned" :字段的值爲true。"primary"記錄數據庫所屬的主分片。全部新集合默認建立在數據庫主分片上。好比當前的集合在某個分片上面尚未數據那麼不會在該分片上建立集合。因此若是某個分片存在分片的集合,那麼必須將集合的數據移走或者將集合刪除,不然該分片沒法刪除。

lockpings

記錄分片運行是否正常的ping記錄信息

locks

記錄存儲分佈式鎖操做信息。

migrations

mongos

記錄mongos的相關信息,記錄每個mongos實例的信息。

settings

包含平衡器和塊的設置信息等。

shards

羣集分片信息

tags

記錄分片標籤信息

transactions

version

羣集版本信息

注意:若是須要修改配置信息,須要經過鏈接到mongos切換到config數據庫操做而不是直接鏈接到配置服務器中操做。

參考:https://docs.mongodb.com/manual/reference/config-database/

3.查看網絡鏈接

db.adminCommand({"connPoolStats":1})

4.限制鏈接數量

--maxConns 

mongos能夠接受的最大併發鏈接數。若是此設置高於操做系統配置的最大鏈接跟蹤閾值,則此設置無效。

注意:在版本2.6中MongoDB刪除了maxIncomingConnections 設置的上限。

3、分片管理

1.添加分片

use admin

db.auth("dba","dba")

sh.addShard("rs-a/192.168.137.10:27010,192.168.137.10:27011,192.168.137.10:27012");

sh.addShard("rs-b/192.168.137.20:28010,192.168.137.20:28011,192.168.137.20:28012");

sh.addShard("rs-c/192.168.137.30:26010,192.168.137.30:26011,192.168.137.30:26012");

sh.status();

2.刪除分片

先當前分片對應數據庫挪到其它的分片上。這裏的"products"指的是數據庫名

db.runCommand( { movePrimary: "products", to: "rs-b" })

而後再刪除分片

db.runCommand({"removeShard":"rs-c"});

 

注意:須要屢次執行db.runCommand({"removeShard":"rs-c"});命令來刪除分片,首先平衡器會將分片上的數據進行遷移,能夠經過sh.isBalancerRunning()命令查詢是否遷移完成,遷移完成以後再次執行刪除分片命令完全移除分片。

3.平衡器管理

3.1開啓平衡器

use admin
sh.startBalancer()
或者
sh.setBalancerState(true)

3.2關閉平衡器

use admin
sh.stopBalancer()
或者
sh.setBalancerState(false);

查看是否關閉,返回flase標識平衡器已關閉,還須要查詢均衡器正在運行狀況

sh.getBalancerState();

while( sh.isBalancerRunning() ) {

          print("waiting...");

          sleep(1000);

}

在執行數據庫管理操做以前應該關閉平衡器,關閉平衡器以後,系統不會再進入平衡過程, 可是均衡器的關閉不是當即就完成,因此還須要查詢均衡器是否正在運行.

3.3查看平衡器開啓狀態

db.settings.find({"_id":"balancer"})
或者
sh.getBalancerState()

3.4查看平衡器是否在運行

sh.isBalancerRunning()

返回ture表明正在運行,false表明當前沒有在運行。

3.5指定平衡時間

必須先保證平衡器是開啓狀態

use config
sh.setBalancerState( true )

db.settings.update({"_id":"balancer"},
{"$set":{"activeWindow":{"start":"13:00","stop":"16:00"}}},
{upsert:true}
)
  • For HH values, use hour values ranging from 00 - 23.
  • For MM value, use minute values ranging from 00 - 59.

3.6關閉平衡時間

use config
db.settings.update({ _id : "balancer" }, { $unset : { activeWindow : true } })

 

3.7關閉開啓指定文檔的平衡器

關閉

sh.disableBalancing("test.aa")

開啓

sh.enableBalancing("test.aa")

查詢是否關閉文檔的平衡器,返回true表明關閉。沒有結果返回沒有關閉,返回報錯表明文檔不存在或者文檔沒有開啓分片

db.getSiblingDB("config").collections.findOne({_id : "test.aa"}).noBalance;

3.8.備份時注意事項

在執行備份前須要關閉平衡器,可是均衡器的關閉不是當即就完成,因此還須要查詢均衡器是否正在運行,不要在平衡器處於活動狀態時備份,能夠備份操做前執行如下查詢:

sh.getBalancerState()

sh.isBalancerRunning()

注意:保證平衡器處於關閉狀態同時sh.isBalancerRunning()返回的不是ture ;也能夠經過設置平衡器的平衡時間來維護備份。

參考:https://docs.mongodb.com/manual/tutorial/manage-sharded-cluster-balancer/

4.塊管理

1.修改數據塊大小

單位MB,默認塊大小爲64MB。塊越大遷移至分片的耗時就越長。

use config;
查詢當前塊大小
db.settings.find({"_id":"chunksize"})
修改塊大小
db.settings.save( { _id:"chunksize", value: 64 } );

2.手動移動數據塊

2.1查詢文檔塊信息

db.getCollection('chunks').find({"ns":"test.xxxx"})

2.2將塊"$minKey"移動到分片rs-c

移動塊只須要指定塊的返回內的隨便一個值便可,注意塊的範圍不包含上限。

sh.moveChunk("test.xxxx",{"username":"$minKey"},"rs-c")

 

2.3拆分塊

若是塊的大小超過setting設置的最大塊大小時,系統會禁止移動塊,這時候須要將塊進行拆分。這裏須要指定新的塊範圍,指定下限便可。

 

sh.splitAt("test.xxxx",{ "username" :"p" })

2.4查詢塊的大小

db.runCommand({ dataSize: "test.xxxx", keyPattern: { "username": 1 }, min: { "username" : "b" }, max: { "username" : "c" } })

單位字節,須要指定塊的範圍。

2.5沒法拆分的特大塊處理

假設使用year/month/day字段做爲分片,某一天業務遭受攻擊致使這天的數據量暴增,可是因爲分片的值已經的最小單位了沒法再拆分了,這個時候經過塊拆分已經沒法解決問題,能夠手動將塊移動到非熱點的分片上。

5.刷新配置信息

mongos有時沒法從配置服務器正確更新配置信息,可使用flushRouterConfig命令手動刷新緩存,若是刷新還沒法解決須要重啓mongos進程。

db.adminCommand({"flushRouterConfig":1})

6.刪除分片數據庫

use news

db.dropDatabase()

 

 

 

 

 

 

 

 

備註:

    做者:pursuer.chen

    博客:http://www.cnblogs.com/chenmh

本站點全部隨筆都是原創,歡迎你們轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明連接,不然保留追究責任的權利。

《歡迎交流討論》

相關文章
相關標籤/搜索