MongoDB 分片sharding概述

2021-09-11 01:32:16 字數 2245 閱讀 3764

當mongodb由於儲存的資料越來越多, 由於效能原因, 或者單個主機資源限制, 垂直擴容沒有辦法進一步的時候, 我們就需要開始考慮水平擴容了。

與垂直擴容不同的是, 水平擴容不需要新新增的機器有多麼強大的功能,它的設計理念是將業務資料盡可能平均的劃分成一段一段的, 每一段分布在一台機器上, 這樣, 當系統需要進一步擴容的時候,只需要新增機器, 將現有資料的一部分遷移到新新增的機器上, 舊的系統就有能力繼續處理業務。

sharding 的架構:

shardregistry是 乙個管理集群shard的類, 它主要有如下的功能:

該類記錄了集合的metadata, 尤其是集合的遷移相關的資訊。

catalogmanager及其子類主要是用來enable sharding集合, 以及新增、刪除shard等操作, 與副本集的catalog類相似, 主要是用來管理cluster的相關操作;

catalogcache用來快取集合的metadata, 主要是對唯讀的集合metadata。 對於sharding的集合, 很多操作都需要metadata, 通過cache, 可以方便程式的metadata讀取。

balancer是乙個後台程序的類, 它負責將cluster裡面各個shard的chunks的個數的均勻分布, 它通過chunkmanager, 收集到各個shard的chunk 資訊, 當2個shard的chunk數差異超過一定的門檻, 就會觸發movechunk 命令, 進行chunk的遷移。

chunkmanager用來記錄shard的chunk資訊, 以及查詢的時候, 將查詢命令裝換成shard key的索引資訊;

這個類是db layer非常重要的一各, 負責記錄任務執行過程中, 集群的狀態。比如, movechunk遷移過程中, migrationsourcemanager呼叫源端介面, 記錄需要遷移的chunks, migrationdestinationmanager表示在目的shard轉入資料, 以及相應的遷入過程;另外, splitchunk, mergechunk以及movechunk過程, 都會涉及chunk的改變, 需要更改metadata以及chunk的分布資訊等等。

該類記錄了move chunk過程中, runtime的狀態, 並且進行持久化;它記錄了從源shard 到目的shard, 以及相應的connectionstring。

operationcontext* const _txn = nullptr;

const namespacestring _nss;

// the source and recipient shard ids

std::string _fromshard;

std::string _toshard;

// resolved shard connection strings for the above shards

connectionstring _fromshardcs;

connectionstring _toshardcs;

// chunkversion for the collection sent along with the command

chunkversion _collectionversion;

// chunk的最大最小key

bsonobj _minkey;

bsonobj _maxkey;

// 分布式鎖, 保護同樣的集合進行別的遷移任務

boost::optional> _distlockstatus;

// _collmetadata記錄了該集合的metadata, 以及遷移的時候_shardversion

chunkversion _shardversion;

std::shared_ptr_collmetadata;

// 記錄了該集合是不是處於遷移過程中

bool _isrunning = false;

分布式鎖的介面類, 通常和catalogmanager搭配使用, 為了獲得某個資源, 比如config庫里某個集合的修改, 需要分布式鎖, 阻止其他節點獲得相應的修改許可權。

類之間的關係如下圖:

搭建mongodb分片

這是一種將海量的資料水平擴充套件的資料庫集群系統,資料分表儲存在sharding的各個節點上,使用者通過簡單的配置就可以很方便地構建乙個分布式mongodb集群。mongodb 的資料分塊稱為 chunk。每個 chunk 都是 collection中一段連續的資料記錄,通常最大尺寸是 200mb,...

MongoDB分片技術

在mongodb裡面存在另一種集群,就是分片技術,跟sql server的表分割槽類似,我們知道當資料量達到t級別的時候,我們的磁碟,記憶體 就吃不消了,針對這樣的場景我們該如何應對。一 分片 mongodb採用將集合進行拆分,然後將拆分的資料均攤到幾個片上的一種解決方案。下面我對這張 釋一下 人臉...

mongodb分片技術

在mongodb裡面存在另一種集群,就是分片技術,跟sql server的表分割槽類似,我們知道當資料量達到t級別的時候,我們的磁碟,記憶體 就吃不消了,針對這樣的場景我們該如何應對。一 分片 mongodb採用將集合進行拆分,然後將拆分的資料均攤到幾個片上的一種解決方案。下面我對這張 釋一下 人臉...