동일한 shard에 존재하면서 shard key가 연속적인 chunk들은 merge가 가능하므로 mergeable chunk 라고 함.

다음은 mongosh 에서 선언해놓고 사용가능한 mergeable chunk list 확인 함수.

원리만 이용하면 어떤 언어로든 사용 가능.

 

function findMergeableChunks(ns, shard)
{
    // config.collections에서 namespace에 해당하는 collection의 uuid 확보
    const config = db.getSiblingDB('config');
    const col = config.collections.findOne({
        _id: ns
    });
    const uuid = col.uuid;
 
    // config.chunks에서 ns:shard에 해당하는 chunk 리스트 확보
    const chunkList = [];
    config.chunks.find({
        uuid: uuid,
        shard: shard
    }).forEach((chunk) => {
        chunkList.push(chunk);
    });
 
    // chunk 리스트 전체에서 연속된 chunk들 체크
    for (let i = 0; i < chunkList.length; i++) {
        const chunk1 = chunkList[i];
        const max = chunk1.max;
 
        for (let j = 0; j < chunkList.length; j++) {
            if (i === j) continue;
 
            const chunk2 = chunkList[j];
            const min = chunk2.min;
 
            let isMergeable = true;
            for (let k in max) {
                if (max[k] !== min[k]) {
                    isMergeable = false;
                    break;
                }
            }
 
            if (isMergeable) {
                chunk1.next = j;
                chunk2.prev = i;
            }
        }
    }
 
    // 전체 mergeable chunk list
    const totalMergeableChunkList = [];
    for (let i = 0; i < chunkList.length; i++) {
        const chunk = chunkList[i];
 
        // first chunk found
        if ('next' in chunk && !('prev' in chunk)) {
            const mergeableChunkList = [];
            mergeableChunkList.push(chunk);
 
            let nextChunk = chunkList[chunk.next];
            while (nextChunk) {
                mergeableChunkList.push(nextChunk);
 
                if (!('next' in nextChunk)) break;
 
                nextChunk = chunkList[nextChunk.next];
            }
 
            totalMergeableChunkList.push(mergeableChunkList);
        }
    }
 
    // 출력
    print(totalMergeableChunkList);
}
 
 
 
// 이런 식으로 사용가능
findMergeableChunks('DB_NAME.COLLECTION_NAME', 'SHARD_NAME');

 

 

 

 

 

'DataBase' 카테고리의 다른 글

[MongoDB] chunk의 min~max 범위 내에서 query 하기  (0) 2024.08.12
[MongoDB] AutoMerger  (0) 2024.08.07
[MongoDB] Range deletion  (0) 2024.07.23
[MongoDB] BSON  (0) 2024.07.19
[MongoDB] chunk/range size 변경  (0) 2024.07.11
Posted by bloodguy
,