初探 MongoDB 分片集羣

MongoDB 是一個非關係型數據庫(NoSQL),也稱文檔型數據庫。因爲其良好的性能以及易用性在業內非常流行。在現在隨處可見高併發讀寫,海量數據存儲需求的背景下。數據庫的容量愈來愈是個問題。提升容量通常有兩個途徑:1.垂直擴容、2.水平擴容。垂直擴容就是提升單機的容量(增長內存,CPU,磁盤空間)。水平擴容就是利用分佈式使用多臺服務器構建服務集羣。MongoDB 就是經過 shard(分片)來構建分佈式的數據庫集羣從而提升數據庫系統的吞吐量和存儲容量。今天就簡單介紹下 MongoDB 的 shard 集羣。linux

 

1、MongoDB 分片集羣基本介紹mongodb

 MongoDB shard 集羣中有三個角色:數據庫

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

  • 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.bash

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

    以上來自官方文檔。翻譯過來就是:架構

    shard: 每一個 shard 包含一個分片數據的子集,每一個 shard 能夠以副本集的方式部署。併發

    mongos: mongos 做爲查詢的路由,在客戶端應用和分片集羣之間提供一個接口。app

    config servers: config servers 存儲元數據和集羣的配置信息。curl

 

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

  

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

  

必須經過 mongos 路由器跟分片集羣中的集合(分片的集合和未分片的集合)交互。客戶端毫不應該鏈接一個單獨的分片進行讀寫。

  

分片策略。

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

    1.hashed sharding: 計算分片鍵字段值的哈希值。而後,根據散列的分片鍵值爲每一個塊分配一個範圍。

    2. ranged sharding: 根據分片鍵值將數據劃分爲多個範圍。而後,根據分片鍵值爲每一個塊分配一個範圍。

 

    以上就是對 MongoDB 分片集羣的簡單介紹。因爲篇幅所致,介紹的過於簡單,更詳細的能夠參考官方文檔:https://docs.mongodb.com/manual/sharding/

 

2、手動搭建一個分片集羣

 

這裏準備了三臺機器。

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的官方文檔很詳細。更多內容請參考官方文檔。https://docs.mongodb.com/manual/

相關文章
相關標籤/搜索