首頁 > 軟體

mongodb 資料塊的遷移流程分析

2022-04-18 16:01:07

1. 基本概念

1.1 Chunk(資料塊)

表示特定伺服器上面,連續範圍的分片鍵值所包含的一組資料,是一個邏輯概念。

例如,某資料塊記錄如下:

{
    "_id" : "chunk-a",  // 資料塊Id
    "ns" : "user.address",  // 該資料塊對應的資料庫名和表名
    "min" : {               // 該資料塊對應的分片鍵值的起始值(包含),是「Shi Jiazhuang」
        "city" : "Shi Jiazhuang"
    },
    "max" : {               // 該資料塊對應的分片鍵值的結束值(不包含),是「Nanjjing」
        "city" : "Nan Jing"
    },
    "shard" : "repa"        // 該資料塊儲存在repa分片伺服器               
}
// 即該資料塊記錄表示,資料庫user中的表address中的「city」欄位中,其值從「Shi Jiazhuang」(包含)到「Nan Jing」(不包含)這段連續區間的資料,都儲存在名為repa的分片伺服器。

1.2 Chunk Size(資料塊大小)

資料塊所對應的資料,如果超過64M(預設值),則會被系統自動切分為兩個資料,即資料塊會從1塊切分為2塊,圖示如下:

1.3 Migration(資料塊遷移)

mongodb有一個後臺的平衡器程序,它會監控各個分片伺服器上面的資料塊的數量,如果發現不同的分片伺服器上面資料塊的數量差異,超過閾值,則會啟動資料塊遷移任務,

直至不同的分片伺服器之間的資料塊的數量差異落在閾值之內,圖示如下:

1.4 Migration Thresholds(遷移閾值)

資料塊的遷移閾值,是和該表的資料塊總數相關的,具體如下:

資料塊總數量閾值
小於202
20-794
大於等於808

2. 遷移流程

資料塊的遷移對於使用者和應用層來說是透明的,當然可能會有些效能的損失,整個遷移流程有7個步驟,圖示如下

各個步驟的內容如下:

1. 平衡器傳送遷移命令給源節點。

2. 源節點啟動了一個內部的資料塊遷移命令給目標節點,同時在資料塊遷移期間,對於該資料塊的請求依然路由到源節點。

3. 目標節點首先建立該資料塊上缺失的索引(如果需要的話)。

4. 目標節點到源節點拉取資料。

5. 目標節點需要到源節點再請求在步驟4執行期間的增量變更資料(新增、更新和刪掉),如果有則跳轉到步驟4,直到沒有增量資料。

6. 資料全部遷移成功後,源節點會向設定伺服器(config server)傳送請求,更新該資料塊的後設資料中的"分片伺服器(shard)"的值為目標節點。

7. 源節點刪除原生的該資料塊對應的資料。

3. 最佳實踐

以上分享了資料塊和資料塊遷移的一些基本概念和流程,下面是一些最佳實踐。

3.1 關於資料塊大小的選擇

資料塊的大小,預設是64M,通常情況下是不需要修改它的,但是有時候該值的大小根據不同的業務場景會帶來不同的影響,需要綜合多方面的因素來設定該值。

資料塊大小太小:通常情況下,較小的資料塊大小,會帶來更頻繁的資料塊遷移,資料在叢集間的分佈會更加均衡,但是如果分片鍵設定的不夠合理,則會產生很多無法切分(split)的巨量資料塊,太大的資料塊無法在分片之間遷移,從而導致資料分佈的不均衡性,此時需要把資料塊大小調大。

資料塊大小太大:較大的資料塊,意味著更少的資料塊遷移,資料在叢集間的分佈容易出現不平衡,同時也容易產生讀寫熱點(可手動切分),此時需要把資料塊大小調小。

3.2 關於資料塊遷移對叢集效能的影響

資料塊遷移除了佔用目標節點和源節點的頻寬和磁碟讀寫資源外,在遷移流程中的步驟6會短暫阻塞對該資料塊的存取,影響應用的存取,因此建議設定平衡器的活躍時間視窗,設定為業務低估時進行,步驟如下:

1. 連線到mongos。

2. 切換到config資料庫

use config

3. 啟動平衡器

如果平衡器是關閉狀態,則設定活躍時間視窗也是不會做資料遷移的,命令如下:

sh.startBalancer()

4. 修改活躍時間視窗

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 }
)

https://github.com/tomliugen

到此這篇關於mongodb 資料塊的遷移流程介紹的文章就介紹到這了,更多相關mongodb 資料遷移內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com