MongoDB 分片集群搭建

来源:https://www.cnblogs.com/chenmh/archive/2018/04/16/8832902.html
-Advertisement-
Play Games

一、概述 分片是一種在多台機器上分配數據的方法。MongoDB使用分片來支持具有非常大的數據集和高吞吐量操作。有兩種解決系統增長的方法:垂直擴展和水平擴展。 垂直擴展涉及增加單個伺服器的容量,例如使用更強大的CPU,增加更多RAM或增加存儲空間量等。介於硬體成本和硬體性能單機器能支持的併發訪問和存儲 ...


一、概述

分片是一種在多台機器上分配數據的方法。MongoDB使用分片來支持具有非常大的數據集和高吞吐量操作。有兩種解決系統增長的方法:垂直擴展和水平擴展。

垂直擴展涉及增加單個伺服器的容量,例如使用更強大的CPU,增加更多RAM或增加存儲空間量等。介於硬體成本和硬體性能單機器能支持的併發訪問和存儲容量是有限的因此,垂直擴展是存在最大上限的。

水平擴展包括將系統數據集和負載分配到多個伺服器上,添加額外的伺服器以根據需要增加容量。儘管單台機器的整體速度或容量可能並不高,但每台機器可處理整個工作負載的一部分,效率可能會高於單台高速大容量伺服器。而且很多時候可以選擇成本很低的普通PC電腦;與單台機器的高端硬體相比,總成本可能會更低,但是增加了維護的複雜性。

 

MongoDB版本:3.6 

二、分片集群架構

1).分片

分片的含義是指將數據拆分,將其分散存放在不同的機器上的過程,MongoDB的分片機制允許你創建一個包含許多台機器的集群,將數據子集分散在集群中,每一個分片維護著一個數據集合的子集。與單機伺服器和副本集相比,使用分片集群架構可以使應用程式具有更大的數據處理能力。

備註:每一個分片都是由一個副本集組成。從MongoDB 3.6版本之後,分片必須是副本集。

2).配置伺服器

配置伺服器是整個集群的大腦,保存著集群和分片的元資料庫,比如:分片信息、群集資料庫信息、分片集合信息、塊信息、平衡器信息、版本信息、群集操作日誌、相關設置信息等。因此配置伺服器數據必須保存在非易失性驅動器上。每個配置伺服器都應該位於單獨的物理機器上,最好是異地分佈,同時還需要啟用日誌功能。

備註:在Mongos3.4版本之後,配置伺服器也必須是副本集。

3).Mongos進程

Mongos提供客戶端應用程式和分片群集之間的介面。

部署多個mongos支持高可用性和可伸縮性;常見的模式是mongos在每個應用程式伺服器上部署一個 ,在每個應用程式伺服器上部署一個 可減少應用程式和之間的網路延遲。或者您可以專用的伺服器上部署mongos。大型部署一般使用此方法,因為它將客戶端應用程式伺服器與mongos分離 這可以更好地控制mongod實例的連接數量。

可以在主分片上部署mongos,mongos不會與mongod實例共用記憶體。需要註意記憶體爭用可能導致的問題。

理論上可以部署無數個mongos路由。但是由於mongos路由經常與配置伺服器進行通信,所以在增加mongos數量時應該密切監視配置伺服器的性能。如果您看到性能下降,應該現在mongos的數量

三、部署分片 

1).環境

192.168.137.10:rs-a-1:27010;rs-a-2:27011;rs-a-3:27012

192.168.137.20:rs-b-1:28010;rs-b-2:28011;rs-b-3:28012

192.168.137.30:config-1:29010,config-2:29011;config-3:29012;mongos:30000

rs-a分片副本集配置

--------------rs-a-1配置-------------------------
pidfilepath = /rs-a-1/mongod.pid
logpath = /rs-a-1/data/log/mongod.log
dbpath = /rs-a-1/data/db
logappend = true
bind_ip = 192.168.137.10,127.0.0.1
port = 27010
fork = true
auth = true
replSet = rs-a
shardsvr = true
keyFile = /rs-a-1/autokey

--------------rs-a-2配置-------------------------
pidfilepath = /rs-a-2/mongod.pid
logpath = /rs-a-2/data/log/mongod.log
dbpath = /rs-a-2/data/db
logappend = true
bind_ip = 192.168.137.10,127.0.0.1
port = 27011
fork = true
auth = true
replSet = rs-a
shardsvr = true
keyFile = /rs-a-2/autokey

--------------rs-a-3配置-------------------------
logpath = /rs-a-3/data/log/mongod.log
dbpath = /rs-a-3/data/db
logappend = true
bind_ip = 192.168.137.10,127.0.0.1
port = 27012
fork = true
auth = true
replSet = rs-a
shardsvr = true
keyFile = /rs-a-3/autokey

rs-b分片副本集配置

--------------rs-b-1配置-------------------------
pidfilepath = /rs-b-1/mongod.pid
logpath = /rs-b-1/data/log/mongod.log
dbpath = /rs-b-1/data/db
logappend = true
bind_ip = 192.168.137.20,127.0.0.1
port = 28010
fork = true
auth = true
replSet = rs-b
shardsvr = true
keyFile = /rs-b-1/autokey

--------------rs-b-2配置-------------------------
pidfilepath = /rs-b-2/mongod.pid
logpath = /rs-b-2/data/log/mongod.log
dbpath = /rs-b-2/data/db
logappend = true
bind_ip = 192.168.137.20,127.0.0.1
port = 28011
fork = true
auth = true
replSet = rs-b
shardsvr = true
keyFile = /rs-b-2/autokey

--------------rs-b-3配置-------------------------
pidfilepath = /rs-b-3/mongod.pid
logpath = /rs-b-3/data/log/mongod.log
dbpath = /rs-b-3/data/db
logappend = true
bind_ip = 192.168.137.20,127.0.0.1
port = 28012
fork = true
auth = true
replSet = rs-b
shardsvr = true
keyFile = /rs-b-3/autokey

config配置伺服器配置

--------------config-1配置-------------------------
pidfilepath = /config-1/mongod.pid
logpath = /config-1/data/log/mongod.log
dbpath = /config-1/data/db
logappend = true
bind_ip = 192.168.137.30,127.0.0.1
port = 29010
fork = true
auth = true
configsvr = true
replSet = config
keyFile = /config-1/autokey

--------------config-2配置-------------------------
pidfilepath = /config-2/mongod.pid
logpath = /config-2/data/log/mongod.log
dbpath = /config-2/data/db
logappend = true
bind_ip = 192.168.137.30,127.0.0.1
port = 29011
fork = true
auth = true
configsvr = true
replSet = config
keyFile = /config-2/autokey

--------------config-3配置-------------------------
logpath = /config-3/data/log/mongod.log
dbpath = /config-3/data/db
logappend = true
bind_ip = 192.168.137.30,127.0.0.1
port = 29012
fork = true
auth = true
configsvr = true
replSet = config
keyFile = /config-3/autokey

Mongos路由配置

configdb = config/192.168.137.30:29010,192.168.137.30:29011,192.168.137.30:29012
port = 30000
logpath = /mongos/log/route.log
bind_ip = 192.168.137.30,127.0.0.1
logappend = true
fork = true
keyFile = /mongos/autokey
maxConns=20000

備註:當前為了便於理解所以節點的分佈不合理,如果是真實的生成環境每個數據節點都應該分開。

2).分片配置

1.啟動所有分片副本集(rs-a,rs-b)和配置伺服器(config)

具體方法可以參考我前面寫的搭建副本集的文章。

MongoDB 搭建可複製群集:http://www.cnblogs.com/chenmh/p/8484049.html

2.啟動mongos路由

mongos --config /mongos/mongos.conf

3.分片配置

登入驗證

mongo --port 30000
use admin
db.auth("dba","dba")

添加分片

sh.addShard("rs-a/192.168.137.10:27010,192.168.137.10:27011,192.168.137.10:27012");
sh.addShard("rs-b/192.168.137.20:28010,192.168.137.20:28011,192.168.137.20:28012");

文檔分片

use admin
sh.enableSharding("test");
sh.shardCollection("test.person",{_id:1});
sh.enableSharding("news");
sh.shardCollection("news.person",{"username":"hashed"});

備註:這裡的分片方式有1,-1,hashed三種;

1.如果分片集合是空集合那麼可以不需要提前創建索引,對集合分片預設會對分片欄位創建索引。

2.如果分片集合是非空集合那麼需要手動創建索引。

3.如果分片集合存在唯一索引,那麼分片必須是唯一索引上的鍵。

具體參考:https://docs.mongodb.com/manual/reference/method/sh.shardCollection/index.html

插入測試數據

use test;
for(var i=0;i<100000;i++){ db.person.insert({"_id":i,"username":"user"+i,"createdate":new Date()})}
use news;
for(var i=0;i<100000;i++){ db.person.insert({"_id":i,"username":"user"+i,"createdate":new Date()})}

3).查詢

sh.status();

備註:可以看到rs-a;rs-b兩個分片上的資料庫塊都是一樣的,分佈的很均勻,接下來看一下增加一個新分片之後資料庫塊的分佈情況。

4).添加新分片

 備註:添加新的分片之後,mongos再一次移動了數據塊,保證數據塊在每一個分片上都均勻的分佈。資料庫的移動是非同步的。

 四、總結

Mongos採取非同步的方式將數據塊移動到其它的分片,數據塊不能設的太小否則對於密集寫的系統所有的寫操作會集中到一個分片上,最後非同步移動數據塊到其它的分片。

 

 

 

 

 

 

備註:

    作者:pursuer.chen

    博客:http://www.cnblogs.com/chenmh

本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明鏈接,否則保留追究責任的權利。

《歡迎交流討論》

 


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

-Advertisement-
Play Games
更多相關文章
  • 為了便於描述,文中涉及到的代碼部分都是用Java語言編寫的,其實Java本身對常見的幾種數據結構,線性表、棧、隊列等都提供了較好的實現,就是我們經常用到的Java集合框架,有需要的可以閱讀這篇文章。Java - 集合框架完全解析 一、線性表 線性表是最常用且最簡單的一種數據結構,它是n個數據元素的有 ...
  • Linux-CentOS5/6啟動流程 ...
  • centos6.8 鏈接:https://pan.baidu.com/s/1TjCYXzijMzfpiZ9Z-D1Qhg 密碼:7mvn 2.1 新建虛擬機 1 1 2.2 選中稍後安裝操作系統(先把虛擬機建好先) 2 2 2.3 設置此虛擬機安裝哪種操作系統 3 3 2.4 設置虛擬機的名稱和位置 ...
  • 本文為mariadb官方手冊:CREATE TRIGGER的譯文。 原文:https://mariadb.com/kb/en/create-trigger/我提交到MariaDB官方手冊的譯文:https://mariadb.com/kb/zh-cn/create-trigger/ 回到Linux系 ...
  • Neo4j資料庫有兩個版本:社區版和商業版,社區版是開源並且免費的,社區版與商業版功能上沒有什麼區別,不同的是,社區版只能單機使用,商業版可以做分散式集群。單機版最大可以存儲10億個位元組。 Neo4j針對不同的操作系統,提供不同的安裝包,下載官網:https://neo4j.com/download ...
  • 空值操作: null表示空的意思。 一、情況: 1:表中的任何欄位預設情況下都可以為null值。 2:not null表示非空,是一種約束 設置為非空約束的欄位,必須有有效值,不能為空。 3:插入數據時 reg:insert into emp(ename,empno) values(2001,'張三 ...
  • 一次資料庫作業 題目如下: Consider the following SQL table definitions: 1. Define sensible key constraints for these tables in SQL. Note: An olympic event (such a ...
  • MySQL主從複製複製預設是非同步的,非同步複製可以提供最佳的性能, 主庫把binlog日誌發送給從庫,然後將結果返回給客戶端,並不會驗證從庫是否接收完畢。這也就意味著有可能出現當主庫或從庫發生故障的時候,從庫沒有接收到主庫發送過來的binlog日誌,導致主庫和從庫的數據不一致,甚至在恢復時造成數據的丟... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...