mongodb?數(shù)據(jù)塊的遷移流程分析
1. 基本概念
1.1 Chunk(數(shù)據(jù)塊)
表示特定服務(wù)器上面,連續(xù)范圍的分片鍵值所包含的一組數(shù)據(jù),是一個(gè)邏輯概念。
例如,某數(shù)據(jù)塊記錄如下:
{ "_id" : "chunk-a", // 數(shù)據(jù)塊Id "ns" : "user.address", // 該數(shù)據(jù)塊對應(yīng)的數(shù)據(jù)庫名和表名 "min" : { // 該數(shù)據(jù)塊對應(yīng)的分片鍵值的起始值(包含),是“Shi Jiazhuang” "city" : "Shi Jiazhuang" }, "max" : { // 該數(shù)據(jù)塊對應(yīng)的分片鍵值的結(jié)束值(不包含),是“Nanjjing” "city" : "Nan Jing" }, "shard" : "repa" // 該數(shù)據(jù)塊存儲(chǔ)在repa分片服務(wù)器 } // 即該數(shù)據(jù)塊記錄表示,數(shù)據(jù)庫user中的表address中的“city”字段中,其值從“Shi Jiazhuang”(包含)到“Nan Jing”(不包含)這段連續(xù)區(qū)間的數(shù)據(jù),都存儲(chǔ)在名為repa的分片服務(wù)器。
1.2 Chunk Size(數(shù)據(jù)塊大?。?/h3>
數(shù)據(jù)塊所對應(yīng)的數(shù)據(jù),如果超過64M(默認(rèn)值),則會(huì)被系統(tǒng)自動(dòng)切分為兩個(gè)數(shù)據(jù),即數(shù)據(jù)塊會(huì)從1塊切分為2塊,圖示如下:
1.3 Migration(數(shù)據(jù)塊遷移)
mongodb有一個(gè)后臺(tái)的平衡器進(jìn)程,它會(huì)監(jiān)控各個(gè)分片服務(wù)器上面的數(shù)據(jù)塊的數(shù)量,如果發(fā)現(xiàn)不同的分片服務(wù)器上面數(shù)據(jù)塊的數(shù)量差異,超過閾值,則會(huì)啟動(dòng)數(shù)據(jù)塊遷移任務(wù),
直至不同的分片服務(wù)器之間的數(shù)據(jù)塊的數(shù)量差異落在閾值之內(nèi),圖示如下:
1.4 Migration Thresholds(遷移閾值)
數(shù)據(jù)塊的遷移閾值,是和該表的數(shù)據(jù)塊總數(shù)相關(guān)的,具體如下:
數(shù)據(jù)塊總數(shù)量 | 閾值 |
小于20 | 2 |
20-79 | 4 |
大于等于80 | 8 |
2. 遷移流程
數(shù)據(jù)塊的遷移對于用戶和應(yīng)用層來說是透明的,當(dāng)然可能會(huì)有些性能的損失,整個(gè)遷移流程有7個(gè)步驟,圖示如下
各個(gè)步驟的內(nèi)容如下:
1. 平衡器發(fā)送遷移命令給源節(jié)點(diǎn)。
2. 源節(jié)點(diǎn)啟動(dòng)了一個(gè)內(nèi)部的數(shù)據(jù)塊遷移命令給目標(biāo)節(jié)點(diǎn),同時(shí)在數(shù)據(jù)塊遷移期間,對于該數(shù)據(jù)塊的請求依然路由到源節(jié)點(diǎn)。
3. 目標(biāo)節(jié)點(diǎn)首先創(chuàng)建該數(shù)據(jù)塊上缺失的索引(如果需要的話)。
4. 目標(biāo)節(jié)點(diǎn)到源節(jié)點(diǎn)拉取數(shù)據(jù)。
5. 目標(biāo)節(jié)點(diǎn)需要到源節(jié)點(diǎn)再請求在步驟4執(zhí)行期間的增量變更數(shù)據(jù)(新增、更新和刪掉),如果有則跳轉(zhuǎn)到步驟4,直到?jīng)]有增量數(shù)據(jù)。
6. 數(shù)據(jù)全部遷移成功后,源節(jié)點(diǎn)會(huì)向配置服務(wù)器(config server)發(fā)送請求,更新該數(shù)據(jù)塊的元數(shù)據(jù)中的"分片服務(wù)器(shard)"的值為目標(biāo)節(jié)點(diǎn)。
7. 源節(jié)點(diǎn)刪除本地的該數(shù)據(jù)塊對應(yīng)的數(shù)據(jù)。
3. 最佳實(shí)踐
以上分享了數(shù)據(jù)塊和數(shù)據(jù)塊遷移的一些基本概念和流程,下面是一些最佳實(shí)踐。
3.1 關(guān)于數(shù)據(jù)塊大小的選擇
數(shù)據(jù)塊的大小,默認(rèn)是64M,通常情況下是不需要修改它的,但是有時(shí)候該值的大小根據(jù)不同的業(yè)務(wù)場景會(huì)帶來不同的影響,需要綜合多方面的因素來設(shè)置該值。
數(shù)據(jù)塊大小太?。和ǔG闆r下,較小的數(shù)據(jù)塊大小,會(huì)帶來更頻繁的數(shù)據(jù)塊遷移,數(shù)據(jù)在集群間的分布會(huì)更加均衡,但是如果分片鍵設(shè)置的不夠合理,則會(huì)產(chǎn)生很多無法切分(split)的大數(shù)據(jù)塊,太大的數(shù)據(jù)塊無法在分片之間遷移,從而導(dǎo)致數(shù)據(jù)分布的不均衡性,此時(shí)需要把數(shù)據(jù)塊大小調(diào)大。
數(shù)據(jù)塊大小太大:較大的數(shù)據(jù)塊,意味著更少的數(shù)據(jù)塊遷移,數(shù)據(jù)在集群間的分布容易出現(xiàn)不平衡,同時(shí)也容易產(chǎn)生讀寫熱點(diǎn)(可手動(dòng)切分),此時(shí)需要把數(shù)據(jù)塊大小調(diào)小。
3.2 關(guān)于數(shù)據(jù)塊遷移對集群性能的影響
數(shù)據(jù)塊遷移除了占用目標(biāo)節(jié)點(diǎn)和源節(jié)點(diǎn)的帶寬和磁盤讀寫資源外,在遷移流程中的步驟6會(huì)短暫阻塞對該數(shù)據(jù)塊的訪問,影響應(yīng)用的訪問,因此建議設(shè)置平衡器的活躍時(shí)間窗口,設(shè)置為業(yè)務(wù)低估時(shí)進(jìn)行,步驟如下:
1. 連接到mongos。
2. 切換到config數(shù)據(jù)庫
use config
3. 啟動(dòng)平衡器
如果平衡器是關(guān)閉狀態(tài),則設(shè)置活躍時(shí)間窗口也是不會(huì)做數(shù)據(jù)遷移的,命令如下:
sh.startBalancer()
4. 修改活躍時(shí)間窗口
db.settings.updateOne( { _id: "balancer" }, { $set: { activeWindow : { start : "01:00", stop : "06:00" } } }, // start和stop的格式為"HH:MM",其中HH的取值范圍是0到23,MM的取值范圍是00到59 { upsert: true } )
到此這篇關(guān)于mongodb 數(shù)據(jù)塊的遷移流程介紹的文章就介紹到這了,更多相關(guān)mongodb 數(shù)據(jù)遷移內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mongodb 數(shù)據(jù)類型及Mongoose常用CURD
MongoDB 是一個(gè)開源的 NoSQL 數(shù)據(jù)庫,相比 MySQL 那樣的關(guān)系型數(shù)據(jù)庫,它更為輕巧、靈活,非常適合在數(shù)據(jù)規(guī)模很大、事務(wù)性不強(qiáng)的場合下使用,本文給大家介紹Mongodb 數(shù)據(jù)類型及Mongoose常用CURD,感興趣的朋友一起學(xué)習(xí)吧2016-01-01MongoDB學(xué)習(xí)筆記之MapReduce使用示例
這篇文章主要介紹了MongoDB學(xué)習(xí)筆記之MapReduce使用示例,本文直接給出實(shí)例代碼,需要的朋友可以參考下2015-07-07MongoDB如何對數(shù)組中的元素進(jìn)行查詢詳解
MongoDB在文檔上支持?jǐn)?shù)組,其次數(shù)組上可以實(shí)現(xiàn)嵌套,以及數(shù)組元素也可以文檔。所以下面這篇文章主要給大家介紹了關(guān)于MongoDB如何對數(shù)組中元素進(jìn)行查詢的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-10-10解決MongoDB?位置查詢報(bào)錯(cuò)planner?returned?error:?unable?to?find
這篇文章主要介紹了MongoDB位置查詢報(bào)錯(cuò)planner?returned?error:?unable?to?find?index?for?$geoNear?query的解決方案,需要的朋友可以參考下2023-08-08mongodb 修改器($inc/$set/$unset/$push/$pop/upsert)
對于文檔的更新除替換外,針對某個(gè)或多個(gè)文檔只需要部分更新可使用原子的更新修改器,能夠高效的進(jìn)行文檔更新。更新修改器是中特殊的鍵2017-04-04mongodb增量備份腳本的實(shí)現(xiàn)和原理詳解
MongoDB本身不支持增量備份,所以這里介紹我找到的方法,下面這篇文章主要給大家介紹了關(guān)于mongodb增量備份腳本的實(shí)現(xiàn)和原理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-09-09mongodb增刪改查詳解_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了mongodb增刪改查詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08MongoDB使用自帶的命令行工具進(jìn)行備份和恢復(fù)的教程
這篇文章主要介紹了MongoDB使用自帶的命令行工具進(jìn)行備份和恢復(fù)的教程,我們只需要在命令行界面中用簡單的命令操作mongorestore和mongodump工具就可以實(shí)現(xiàn),需要的朋友可以參考下2016-06-06NoSQL優(yōu)缺點(diǎn)與MongoDB數(shù)據(jù)庫簡介
這篇文章介紹了NoSQL的優(yōu)缺點(diǎn)與MongoDB數(shù)據(jù)庫,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06