1. 程式人生 > 資料庫 >初探 MongoDB 分片叢集

初探 MongoDB 分片叢集

MongoDB 是一個非關係型資料庫(NoSQL),也稱文件型資料庫。由於其良好的效能以及易用性在業內很是流行。在如今隨處可見高併發讀寫,海量資料儲存需求的背景下。資料庫的容量越來越是個問題。提高容量一般有兩個途徑:1.垂直擴容、2.水平擴容。垂直擴容就是提高單機的容量(增加記憶體,CPU,磁碟空間)。水平擴容就是利用分散式使用多臺伺服器構建服務叢集。MongoDB 就是通過 shard(分片)來構建分散式的資料庫叢集從而提高資料庫系統的吞吐量和儲存容量。今天就簡單介紹下 MongoDB 的 shard 叢集。

 

一、MongoDB 分片叢集基本介紹

 MongoDB shard 叢集中有三個角色:

  • shard: Each shard contains a subset of the sharded data. Each shard can be deployed as a replica set.

  • mongos: The mongos acts as a query router, providing an interface between client applications and the sharded cluster. Starting in MongoDB 4.4, mongos can support hedged reads to minimize latencies.

  • config servers: Config servers store metadata and configuration settings for the cluster.

    以上來自官方文件。翻譯過來就是:

    shard: 每個 shard 包含一個分片資料的子集,每個 shard 可以以副本集的方式部署。

    mongos: mongos 作為查詢的路由,在客戶端應用和分片叢集之間提供一個介面。

    config servers: config servers 儲存元資料和叢集的配置資訊。

 

shard cluster 架構圖(來自官方文件)

  

一個數據庫可以同時包含分片的集合和未分片的集合。分片的集合資料分佈在不同的分片上,未分片的集合資料儲存在一個主分片上。每個資料庫都有它的主分片。

  

必須通過 mongos 路由器跟分片叢集中的集合(分片的集合和未分片的集合)互動。客戶端絕不應該連線一個單獨的分片進行讀寫。

  

分片策略。

    MongoDB在分片叢集中有兩種分片策略:

    1.hashed sharding: 計算分片鍵欄位值的雜湊值。然後,根據雜湊的分片鍵值為每個塊分配一個範圍。

    2. ranged sharding: 根據分片鍵值將資料劃分為多個範圍。然後,根據分片鍵值為每個塊分配一個範圍。

 

    以上就是對 MongoDB 分片叢集的簡單介紹。由於篇幅所致,介紹的過於簡單,更詳細的可以參考官方文件:

 

二、手動搭建一個分片叢集

 

這裡準備了三臺機器。

OS主機名IP
Ubuntu 18.04 mongodb-01.ninejy.io 192.168.0.21
Ubuntu 18.04 mongodb-02.ninejy.io 192.168.0.22
Ubuntu 18.04 mongodb-03.ninejy.io 192.168.0.23

 

1. 下載安裝包並解壓,複製可執行檔案到 PATH 路徑下

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1804-4.4.0.tgz
# 工具包
# wget https://fastdl.mongodb.org/tools/db/mongodb-database-tools-ubuntu1804-x86_64-100.2.1.tgz
tar zxf mongodb-linux-x86_64-ubuntu1804-4.4.0.tgz
cp mongodb-linux-x86_64-ubuntu1804-4.4.0/bin/* /usr/local/bin/

 

2. 安裝依賴包

apt-get update && apt-get install -y apt-transport-https libcurl4 openssl liblzma5

 

3. 建立資料目錄和日誌目錄

mkdir -p /data/{mongodb/data/configdb,mongodb/data/sharddb,mongodb/conf,mongodb/run,mongodb/logs}
cd /data/mongodb

 

4. 建立 config server 副本集

    4.1 準備 config server 配置檔案

# conf/config-server.conf
systemLog:
  quiet: false
  path: /data/mongodb/logs/mongod-config-server.log
  logAppend: false
  destination: file
processManagement:
  fork: true
  pidFilePath: /data/mongodb/run/mongod-config-server.pid
sharding:
  clusterRole: configsvr
replication:
  replSetName: config_rs
net:
  port: 27019
  bindIp: localhost,192.168.0.21 # 不同節點不同的IP。192.168.0.22,192.168.0.23
storage:
  dbPath: /data/mongodb/data/configdb

 

    4.2 啟動每個 config server 副本集的每個成員

mongod --config conf/config-server.conf --fork

 

    4.3 連線到 config server 副本集的其中一個成員,初始化副本集

mongo --host 192.168.0.21 --port 27019

rs.initiate(
  {
    _id: "config_rs",
    configsvr: true,
    members: [
      { _id : 0, host : "192.168.0.21:27019" },
      { _id : 1, host : "192.168.0.22:27019" },
      { _id : 2, host : "192.168.0.23:27019" }
    ]
  }
)

# 檢視副本集狀態
rs.status()

 

5. 建立分片副本集

    5.1 準備 shard server 配置檔案

# conf/shard-server.conf
systemLog:
  quiet: false
  path: /data/mongodb/logs/mongod-shard-server.log
  logAppend: false
  destination: file
processManagement:
  fork: true
  pidFilePath: /data/mongodb/run/mongod-shard-server.pid
sharding:
  clusterRole: shardsvr
replication:
  replSetName: shard_rs
net:
  port: 27018
  bindIp: localhost,192.168.0.21 # 不同節點不同的IP。192.168.0.22,192.168.0.23
storage:
  dbPath: /data/mongodb/data/sharddb

 

    5.2 啟動 shard 副本集的每個成員

mongod --config conf/shard-server.conf --fork

 

    5.3 連線到 shard 副本集的其中一個成員,初始化 shard 副本集

mongo --host 192.168.0.21 --port 27018

rs.initiate(
  {
    _id : "shard_rs",
    members: [
      { _id : 0, host : "192.168.0.21:27018" },
      { _id : 1, host : "192.168.0.22:27018" },
      { _id : 2, host : "192.168.0.23:27018" }
    ]
  }
)

# 檢視分片狀態
sh.status()

 

6. 建立 mongos 服務

    6.1 準備 mongos 配置檔案

# conf/mongos-server.conf
systemLog:
  quiet: false
  path: /data/mongodb/logs/mongod-mongos-server.log
  logAppend: false
  destination: file
processManagement:
  fork: true
  pidFilePath: /data/mongodb/run/mongod-mongos-server.pid
sharding:
  configDB: config_rs/192.168.0.21:27019,192.168.0.22:27019,192.168.0.23:27019
net:
  port: 27017
  bindIp: localhost,192.168.0.21 # 不同節點不同的IP。192.168.0.22,192.168.0.23

 

    6.2 啟動 mongos 服務

mongos --config conf/mongos-server.conf --fork

 

7. 連線分片叢集,新增分片,建立庫,開啟分片

mongo --host 192.168.0.21 --port 27017

sh.addShard( "shard_rs/192.168.0.21:27018,192.168.0.22:27018,192.168.0.23:27018")

# 建立庫,存在就切換到該庫,不存在則建立
use test;

# test 庫開啟分片
sh.enableSharding("test");

 

    以上一個基本的 MongoDB 分片叢集就搭建好了。此時叢集中只有一個分片,當需要擴容的時候,按照步驟 5 建立 shard 副本集,然後按照步驟 7 把 shard 加入到叢集就實現了叢集擴容。

 

    本文只是簡單的介紹了 MongoDB 分片叢集的基本概念和搭建。mongo的官方文件很詳細。更多內容請參考官方文件。