mongo 3.4分片集群系列之一:淺談分片集群

来源:http://www.cnblogs.com/ddbear/archive/2017/10/28/7746076.html
-Advertisement-
Play Games

這篇為理論篇,稍後會有實踐篇 1、分片集群是個啥玩意兒 要回答這個問題,首先得知道它是由什麼東東組成的。 MongoDB分片集群由以下組件組成: mongos:mongos作為查詢路由器,提供客戶端應用程式和分片集群之間的介面。 配置伺服器:配置伺服器存儲集群的元數據和配置信息。從MongoDB 3 ...


這篇為理論篇,稍後會有實踐篇

1、分片集群是個啥玩意兒

要回答這個問題,首先得知道它是由什麼東東組成的。

MongoDB分片集群由以下組件組成:

  • mongos:mongos作為查詢路由器,提供客戶端應用程式和分片集群之間的介面。
  • 配置伺服器:配置伺服器存儲集群的元數據和配置信息。從MongoDB 3.4開始,配置伺服器必須部署為副本集(CSRS)。
  • 分片:每個分片包含分片數據的一部分。每個分片可以部署為副本集。

   

MongoDB基於集合級別的數據分片,將集合數據分佈在集群的分片上。

2、 為啥要用分片集群(分片的好處)

  分片是一種在多台機器上存儲數據的方法。MongoDB使用分片來支持具有非常大的數據集和高吞吐量操作的部署。

1)工作負載

  MongoDB將讀寫工作負載分佈在分片集群的 分片上,從而允許每個分片處理集群操作的一個子集。通過添加更多的分片,可以在集群之間水平地縮放讀取和寫入的工作負載。

2)存儲容量

  分片用來存儲數據,當數據集增大,可以通過添加分片來擴展分片集群的容量。因此,理論上,分片集群的容量可以無限水平擴展。

3)高可用

  分片集群可以繼續執行部分讀/寫操作,即使一個或多個分片不可用。雖然在停機期間無法訪問不可用的分片上的數據子集,但是可用分片上的讀取或寫入仍然可以成功。

3、分片集群要知道的名詞(分片鍵,塊)

1)分片鍵

  分片鍵就是由集合中每個文檔中存在的欄位或不可變欄位組成。

  分片鍵的作用:MongoDB 使用分片鍵對集合進行分片。

  註意:分片後的分片鍵的選擇不能改變,也就是說欄位不能更改為其他欄位,並且欄位的值不能修改。分片集合只能有一個分片鍵。

  要分割非空集合,集合必須具有 以分片鍵開頭的索引。對於空集合,如果集合尚未具有指定分片鍵的適當索引,則MongoDB將創建索引。

  分片鍵的選擇會影響分片集群的性能,效率和可擴展性。

2)塊

MongoDB將分片數據分割成塊。基於分片鍵,每個塊都有一個包含下限,但不包含上限的範圍。

MongoDB使用分片集群平衡器在分片集群的分片之間遷移塊。平衡器試圖實現在群集中的所有分片的塊均勻分佈。

4、分片前考慮事項

  為確保集群性能和效率,必須認真考慮選擇分片鍵。分片後您不能更改分片鍵,也不能取消集合分片。如果查詢包含分片鍵或複合分片鍵的首碼 ,則mongos執行廣播操作,查詢分片集群中的所有分片。這可能需要長時間運行的操作。

分片具有一定的操作要求和限制。

1)在分片中不可用的操作

  不起作用:group, db.eval(), $where不允許引用db對象,$isolated, $snapshot, geoSearch命令。

2)在分片中單個文檔的修改操作

  所有的updateOne(),removeOne()以及deleteOne()用於分片集合操作必須包括分片鍵 _id在查詢欄位中。否則,會返回一個錯誤。

3)分片集合的唯一索引

  MongoDB不支持分片上的唯一索引,除非唯一索引包含完整的分片鍵作為索引的首碼。在這些情況下,MongoDB將強制執行完整鍵的唯一性,而不是單個欄位。

  即可以有唯一索引,但這個唯一索引必須包含分片鍵的全部。

5、分片策略

MongoDB支持兩種分片策略,哈希分片和範圍分片。

1) 哈希分片

  哈希分片,Mongo自動計算分片鍵欄位值的哈希值。然後,基於哈希的分片鍵值為每個塊分配一個範圍。

  當使用哈希索引解析查詢時,Mongo會自動計算哈希值。應用程式需要計算哈希值。

     

       示例是用“X” 作為分片鍵,採用哈希分片策略,它們的哈希值可能不在同一塊,基於哈希值有助於更均勻的數據分佈,特別是在分片鍵單調變化的數據集中。

2)範圍分片

範圍分片,基於分片鍵值將數據劃分為範圍。每個塊被分配基於所述分片鍵值的範圍內。

   

值為“X”的分片鍵的範圍更可能存儲在相同的塊上。這允許目標操作,因為mongos可以將操作路由到僅包含所需數據的分片。

3)哈希分片 VS 範圍分片

給定使用單調遞增值的集合,X作為分片鍵,使用範圍分片可以得到類似於以下內容的插入分佈:

   

由於X的值總是在增加,所以具有上限maxKey的塊接收到大部分的寫入。這將限制對包含此塊的單個分片的插入操作,從而減少或消除分散式寫入在分片集群中的優勢。

通過使用哈希索引,X作為分片鍵,插入的分佈類似於以下內容:

   

由於數據現在更均勻地分佈,所以插入在整個集群中有效地分佈。

 

以上資料,大部分是參考官網的資料,在此表示感謝。

https://docs.mongodb.com/manual/sharding/

 


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

-Advertisement-
Play Games
更多相關文章
  • 相比新的網路請求框架Volley真的很落後,一無是處嗎,要知道Volley是由google官方推出的,雖然推出的時間很久了,但是其中依然有值得學習的地方。 從命名我們就能看出一些端倪,volley中文意為群射,齊射,官方解釋說它適合通信頻繁但是數據量不大的網路請求操作( a burst or emi ...
  • Response Headers(從伺服器得到的回覆的頭) Example 1: Retry-After: 120 Example 2: Retry-After: Fri, 07 Nov 2014 23:59:59 GMT Permanent Common non-standard response ...
  • 我們在使用App時,一次登錄後App如果不主動退出登錄或者清除數據,App會在很長一段時間內保持登錄狀態,或者讓用戶感覺到登錄一次就不用每次都輸入用戶密碼才能進行登錄。銀行、金融涉及到支付類的App一般不支持這種長時間的登錄狀態保持。對於保持長期登錄的技術實現方式,除了和前端技術有關,還涉及到前後臺 ...
  • 因為偶爾關註QQ運動, 看到QQ運動的積分抽獎界面比較有意思,所以就嘗試用自定義View實現了下,原本想通過開發者選項查看下界面的一些信息,後來發現積分抽獎界面是在WebView中展示的,應該是在H5頁面中用js代碼實現的,暫時不去管它了。 這裡的自定義View針對的是繼承自View的情況,你可以將 ...
  • 移動互聯網近幾年發展尤為迅速,越來越多的企業也開始將目光聚集到了移動互聯網,這意味著移動互聯網時代到來,而移動APP應用是競爭的一個因素。在移動互聯網時代,移動APP開發已經不再是什麼新鮮事了,許多的企業都知道,專屬的獨立品牌APP開發是企業在移動互聯網未來生存發展的重要選擇。 那開發一款APP要多 ...
  • 一直不明白,hdfs管理的可視化工具不算難寫,為什麼找不到一個能用的,我知道的其實也就是eclipse的hadoop插件。 插件還算好用,但是和eclipse綁定的,加入用其他工具開發呢?找到了一個c#版的源碼,不過,學的是java,c#編譯完後實在是不會打包, 所以就自己寫一個java版的吧! 花 ...
  • CentOS6.9安裝Mysql5.7 一、上傳安裝包 二、建立用戶以及mysql的目錄 1、建立一個mysql的組 輸入命令: groupadd mysql 2、建立mysql用戶,並放到mysql組 輸入命令:useradd -r -g mysql mysql 3、給mysql用戶設置密碼 輸入 ...
  • oracle PROCEDURE 關鍵字: oracle 存儲過程 1.基本結構 CREATE OR REPLACE PROCEDURE 存儲過程名字 ( 參數1 IN NUMBER, 參數2 IN NUMBER ) IS 變數1 INTEGER :=0; 變數2 DATE; BEGIN END 存 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...