MongoDB分片原理及架構詳解

来源:https://www.cnblogs.com/msjhw/archive/2023/03/20/17238129.html
-Advertisement-
Play Games

什麼是MongoDB分片 MongoDB分片是指將資料庫拆分成多份,把它們分散到不同的機器上,從而實現不需要功能強大的伺服器就可以存儲更多的數據和處理更多的請求。 MongoDB分片的基本思想就是將集合切分成小塊,這些塊分散到若幹分片裡面,每個分片只負責總數據的一部分。 對於應用程式來說,不必知道哪 ...


什麼是MongoDB分片


MongoDB分片是指將資料庫拆分成多份,把它們分散到不同的機器上,從而實現不需要功能強大的伺服器就可以存儲更多的數據和處理更多的請求。

MongoDB分片的基本思想就是將集合切分成小塊,這些塊分散到若幹分片裡面,每個分片只負責總數據的一部分。

對於應用程式來說,不必知道哪個分片對應哪些數據,甚至不需要知道數據已經被分片。當應用程式查詢數據時,只需要連接一個前置路由即可。這個前置路由通過查詢配置伺服器獲取數據所在的目標分片,從而獲取目標數據。

MongoDB分片的目的


高數據量和吞吐量的資料庫應用會對單機的性能造成較大壓力,大的查詢量會將單機的CPU耗盡,大的數據量對單機的存儲壓力較大,最終會耗盡系統的記憶體而將壓力轉移到磁碟IO上。

為瞭解決這些問題,有兩個基本的方法: 垂直擴展和水平擴展。

垂直擴展:增加更多的CPU和存儲資源來擴展容量。

水平擴展:將數據集分佈在多個伺服器上,水平擴展即分片。

分片為應對高吞吐量與大數據量提供了方法。使用分片減少了每個分片需要處理的請求數,因此,通過水平擴展,集群可以提高自己的存儲容量和吞吐量。舉例來說,當插入一條數據時,應用只需要訪問存儲這條數據的分片。

使用分片減少了每個分片存儲的數據。例如,如果資料庫1TB的數據集,並有4個分片,然後每個分片可能僅持有256 GB的數據。如果有40個分片,那麼每個切分可能只有25GB的數據。

MongoDB分片架構


MongoDB分片架構中,有三個角色:

  • Mongos :就是上面提到的路由器,是和客戶端打交道的模塊。Mongos本身沒有任何數據,它也不知道該怎麼處理這數據,而是通過Config Server來獲取;
  • Config Server:配置伺服器,所有Shard節點的信息、分片功能的一些配置信息都存儲在Config Server里,可以理解為真正數據的元數據;
  • Sh

ard:真正數據存儲的位置,以Chunk為單位存儲。

 

Mongos本身並不持久化數據,所有Shard集群的元數據都會存儲到Config Server里,而用戶的數據會分散存儲到各個Shard。Mongos啟動後,會從Config Server載入元數據,開始提供服務,將用戶的請求正確路由到對應的分片上。

Shard Key


可以說,Shard Key(中文翻譯成片鍵)是MongoDB實現分片的依仗!

MongoDB中數據的分片以集合為基本單位,集合中的數據通過Shard Key被分成多部分。其實Shard Key就是在集合中選了一個鍵,用該鍵的值作為數據拆分的依據。

舉個例子,假設有個存儲人員信息的文檔集合,如果選擇名字"name"作為Shard Key,那麼第一分片可能會存放名字以 A-F 開頭的文檔。第二分片存 G-P 開頭的文檔,第三分片存Q-Z的文檔。

一個好的Shard Key對分片至關重要。

有一點需要註意,一個自增的Shard Key對寫入和數據均勻分佈不是很友好,因為自增的Shard Key總會在一個分片上寫入,後續達到某個閥值才可能會寫到別的分片上。但是反過來講,按Shard Key查詢(讀取)會非常高效。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 操作系統 :CentOS 7.6.1810_x64 Python 版本 : 3.9.12 一、背景描述 使用python開發過程中,會遇到需要使用緩存加速應用的情況,比如下麵這些場景: 數據轉換加速 字元串時間轉換成int時間戳; 字元串時間轉換成datetime類型; ... 數據解析加速 byt ...
  • 上一節給大家從源碼級別分析了SNetClient網路客戶端的實現過程,詳見​C++/Qt網路通訊模塊設計與實現(二),並給大家留了一個疑問,即引入SNetClientRunning類是為瞭解決什麼問題? 我們從SNetClient的設計出發,即要求線上程里進行數據包的收發,連接,斷開處理等,這些處理 ...
  • 本文已經收錄到Github倉庫,該倉庫包含電腦基礎、Java基礎、多線程、JVM、資料庫、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分散式、微服務、設計模式、架構、校招社招分享等核心知識點,歡迎star~ Github地址:https://github.c ...
  • 大家好,我是沙漠盡頭的狼。 一. 問題描述 如下圖,定義兩個子類Student和Employ,都繼承自抽象類PersonBase: public abstract class PersonBase { public string Name { get; set; } protected Person ...
  • 前言 年初.NET工程師的求職者反饋不好找工作,尤其是B/S開發,C/S開發稍微好點。這種情況下有好多小伙伴都想轉行了,於是瞭解了一下JAVA,比.NET還捲,還是走.NET內部轉行吧,轉C/S桌面開發。本文介紹.NET幾種桌面開發技術的方向,大家可以參考一下,具體如下。 一、簡介 WinForms ...
  • 大家好,我是沙漠盡頭的狼,今天介紹一個WPF開源項目-NodeNetwork,它可以幫助我們快速構建和定製網路拓撲圖。 一、前言 在現代軟體開發中,數據可視化和可交互性越來越受到關註。為了實現這一點,通常需要使用各種圖表、表格、網路拓撲圖等控制項。然而,對於某些特殊的場景,這些控制項可能無法滿足需求,此 ...
  • 上篇文章我們介紹了 VUE+.NET應用系統的國際化-多語言詞條服務 系統國際化改造整體設計思路如下: 提供一個工具,識別前後端代碼中的中文,形成多語言詞條,按語言、界面、模塊統一管理多有的多語言詞條 提供一個翻譯服務,批量翻譯多語言詞條 提供一個詞條服務,支持後端代碼在運行時根據用戶登錄的語言,動 ...
  • 痞子衡嵌入式半月刊: 第 74 期 這裡分享嵌入式領域有用有趣的項目/工具以及一些熱點新聞,農曆年分二十四節氣,希望在每個交節之日準時發佈一期。 本期刊是開源項目(GitHub: JayHeng/pzh-mcu-bi-weekly),歡迎提交 issue,投稿或推薦你知道的嵌入式那些事兒。 上期回顧 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...