天天看點

【超詳細】手把手教你搭建MongoDB叢集

【超詳細】手把手教你搭建MongoDB叢集

MongoDB叢集搭建

MongoDB叢集簡介

mongodb 叢集搭建的方式有三種:
  1. 主從備份(Master - Slave)模式,或者叫主從複制模式。
  2. 副本集(Replica Set)模式
  3. 分片(Sharding)模式
其中,第一種方式基本沒什麼意義,官方也不推薦這種方式搭建。另外兩種分别就是副本集和分片的方式。

Mongo分片高可用叢集搭建

概述

為解決mongodb在replica set每個從節點上面的資料庫均是對資料庫的全量拷貝,從節點壓力在高并發大資料量的場景下存在很大挑戰,同時考慮到後期mongodb叢集的在資料壓力巨大時的擴充性,應對海量資料引出了分片機制。

什麼是分片

分片是将資料庫進行拆分,将其分散在不同的機器上的過程,無需功能強大的伺服器就可以存儲更多的資料,處理更大的負載,在總資料中,将集合切成小塊,将這些塊分散到若幹片中,每個片隻負載總資料的一部分,通過一個知道資料與分片對應關系的元件mongos的路由程序進行操作。

基礎元件
其利用到了四個元件:mongos,config server,shard,replica set

mongos

資料庫叢集請求的入口,所有請求需要經過mongos進行協調,無需在應用層面利用程式來進行路由選擇,mongos其自身是一個請求分發中心,負責将外部的請求分發到對應的shard伺服器上,mongos作為統一的請求入口,為防止mongos單節點故障,一般需要對其做HA(高可用,Highly Available縮寫)。

config server

配置伺服器,存儲所有資料庫中繼資料(分片,路由)的配置。mongos本身沒有實體存儲分片伺服器和資料路由資訊,隻是緩存在記憶體中來讀取資料,mongos在第一次啟動或後期重新開機時候,就會從config server中加載配置資訊,如果配置伺服器資訊發生更新會通知所有的mongos來更新自己的狀态,進而保證準确的請求路由,生産環境中通常也需要多個config server,防止配置檔案存在單節點丢失問題。

shard

在傳統意義上來講,如果存在海量資料,單台伺服器存儲1T壓力非常大,考慮到資料庫的硬碟,網絡IO,還有CPU,記憶體的瓶頸,如果多台進行分攤1T的資料,到每台上就是可估量的較小資料,在mongodb叢集隻要設定好分片規則,通過mongos操作資料庫,就可以自動把對應的操作請求轉發到對應的後端分片伺服器上。

replica set

在總體mongodb叢集架構中,對應的分片節點,如果單台機器下線,對應整個叢集的資料就會出現部分缺失,這是不能發生的,是以對于shard節點需要replica set來保證資料的可靠性,生産環境通常為2個副本+1個仲裁。

整體架構

整體架構涉及到15個節點,我們這裡使用Docker容器進行部署

那麼我們先來總結一下我們搭建一個高可用叢集需要多少個Mongo

  • mongos: 3台
  • configserver : 3台
  • shard : 3片; 每個分片由三個節點構成
容器部署情況
角色 端口 暴漏端口 描述 角色
config-server1 27017 -- 配置節點1 --
config-server2 27017 -- 配置節點2 --
config-server3 27017 -- 配置節點3 --
mongos-server1 27017 30001 路由節點1 --
mongos-server2 27017 30002 路由節點2 --
mongos-server3 27017 30003 路由節點3 --
shard1-server1 27017 -- 分片1節點1 Primary
shard1-server2 27017 -- 分片1節點2 Secondry
shard1-server3 27017 -- 分片1節點3 Arbiter
shard2-server1 27017 -- 分片2節點1 Primary
shard2-server2 27017 -- 分片2節點2 Secondry
shard2-server3 27017 -- 分片2節點3 Arbiter
shard3-server1 27017 -- 分片3節點1 Primary
shard3-server2 27017 -- 分片3節點2 Secondry
shard3-server3 27017 -- 分片3節點3 Arbiter
整體架構預覽
【超詳細】手把手教你搭建MongoDB叢集

基礎環境準備

安裝Docker
本次使用Docker環境進行搭建,需要提前準備好Docker環境
建立Docker網絡
因為需要使用Docker搭建MongoDB叢集,是以先建立Docker網絡
docker network create mongo-cluster
docker network ls      
【超詳細】手把手教你搭建MongoDB叢集

搭建ConfigServer副本集

我們先來搭建ConfigServer的副本集,這裡面涉及到三個節點,我們需要建立配置檔案以及啟動容器
建立挂載目錄
我們需要建立對應的挂載目錄來存儲配置檔案以及日志檔案
# 建立配置檔案目錄
mkdir -p /tmp/mongo-cluster/config-server/conf
# 建立資料檔案目錄
mkdir -p /tmp/mongo-cluster/config-server/data/{1..3}
# 建立日志檔案目錄
mkdir -p /tmp/mongo-cluster/config-server/logs/{1..3}      
【超詳細】手把手教你搭建MongoDB叢集
建立密鑰檔案
因為我們知道搭建的話一定要高可用,而且一定要權限,這裡mongo之間通信采用秘鑰檔案,是以我們先進行生成密鑰檔案
# 建立密鑰檔案
openssl rand -base64 756 > /tmp/mongo-cluster/config-server/conf/mongo.key
# 設定
chmod 600  /tmp/mongo-cluster/config-server/conf/mongo.key      
【超詳細】手把手教你搭建MongoDB叢集
建立配置檔案
因為由多個容器,配置檔案是一樣的,我們隻需要建立一個配置檔案,其他的容器統一讀取該配置檔案即可
echo "
# 日志檔案
storage:
  # mongod 程序存儲資料目錄,此配置僅對 mongod 程序有效
  dbPath: /data/db
systemLog:
  destination: file
  logAppend: true
  path: /data/logs/mongo.log

#  網絡設定
net:
  port: 27017  #端口号
#  bindIp: 127.0.0.1    #綁定ip
replication:
  replSetName: configsvr #副本集名稱
sharding:
  clusterRole: configsvr # 叢集角色,這裡配置的角色是配置節點
security:
  authorization: enabled #是否開啟認證
  keyFile: /data/configdb/conf/mongo.key #keyFile路徑
"  > /tmp/mongo-cluster/config-server/conf/mongo.conf      
【超詳細】手把手教你搭建MongoDB叢集
啟動容器

啟動config-server1

docker run --name config-server1 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/config-server:/data/configdb \
-v /tmp/mongo-cluster/config-server/data/1:/data/db \
-v /tmp/mongo-cluster/config-server/logs/1:/data/logs \
mongo --config /data/configdb/conf/mongo.conf      
【超詳細】手把手教你搭建MongoDB叢集

啟動config-server2

docker run --name config-server2 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/config-server:/data/configdb \
-v /tmp/mongo-cluster/config-server/data/2:/data/db \
-v /tmp/mongo-cluster/config-server/logs/2:/data/logs \
mongo --config /data/configdb/conf/mongo.conf      
【超詳細】手把手教你搭建MongoDB叢集

啟動config-server3

docker run --name config-server3 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/config-server:/data/configdb \
-v /tmp/mongo-cluster/config-server/data/3:/data/db \
-v /tmp/mongo-cluster/config-server/logs/3:/data/logs \
mongo --config /data/configdb/conf/mongo.conf      
【超詳細】手把手教你搭建MongoDB叢集
初始化config-server

登入容器

進入第一台容器
docker exec -it config-server1 bash
mongo -port 27017      
【超詳細】手把手教你搭建MongoDB叢集

執行指令

執行以下指令進行MongoDB容器的初始化
rs.initiate(
  {
    _id: "configsvr",
    members: [
      { _id : 1, host : "config-server1:27017" },
      { _id : 2, host : "config-server2:27017" },
      { _id : 3, host : "config-server3:27017" }
    ]
  }
)      
如果出現​

​OK​

​表示MongoDB配置伺服器已經初始化成功
【超詳細】手把手教你搭建MongoDB叢集

建立使用者

因為我們需要對使用者進行權限管理,我們需要建立使用者,這裡為了示範,我們建立超級使用者 權限是​

​root​

use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})      
這樣就在MongoDB的​

​admin​

​資料庫添加了一個使用者名為root 密碼是root的使用者
【超詳細】手把手教你搭建MongoDB叢集

搭建Shard分片組

由于mongos是用戶端,是以我們先搭建好config以及shard之後再搭建mongos。
建立挂載目錄
我們先建立挂載目錄
# 建立配置檔案目錄
mkdir -p /tmp/mongo-cluster/shard{1..3}-server/conf
# 建立資料檔案目錄
mkdir -p /tmp/mongo-cluster/shard{1..3}-server/data/{1..3}
# 建立日志檔案目錄
mkdir -p /tmp/mongo-cluster/shard{1..3}-server/logs/{1..3}      
【超詳細】手把手教你搭建MongoDB叢集
搭建shard1分片組
在同一台伺服器上初始化一組分片

建立密鑰檔案

因為叢集隻需要一個密鑰檔案,我們可以将​

​config-server​

​中的密鑰檔案複制過來
cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard1-server/conf/      
【超詳細】手把手教你搭建MongoDB叢集

配置配置檔案

因為有多個容器,配置檔案是一樣的,我們隻需要建立一個配置檔案,其他的容器統一讀取該配置檔案即可
echo "
# 日志檔案
storage:
  # mongod 程序存儲資料目錄,此配置僅對 mongod 程序有效
  dbPath: /data/db
systemLog:
  destination: file
  logAppend: true
  path: /data/logs/mongo.log

#  網絡設定
net:
  port: 27017  #端口号
#  bindIp: 127.0.0.1    #綁定ip
replication:
  replSetName: shard1 #複制集名稱是 shardsvr
sharding:
  clusterRole: shardsvr # 叢集角色,這裡配置的角色是分片節點
security:
  authorization: enabled #是否開啟認證
  keyFile: /data/configdb/conf/mongo.key #keyFile路徑
"  > /tmp/mongo-cluster/shard1-server/conf/mongo.conf      
【超詳細】手把手教你搭建MongoDB叢集

啟動shard1-server1

docker run --name shard1-server1 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/shard1-server:/data/configdb \
-v /tmp/mongo-cluster/shard1-server/data/1:/data/db \
-v /tmp/mongo-cluster/shard1-server/logs/1:/data/logs \
mongo --config /data/configdb/conf/mongo.conf      
【超詳細】手把手教你搭建MongoDB叢集

啟動shard1-server2

docker run --name shard1-server2 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/shard1-server:/data/configdb \
-v /tmp/mongo-cluster/shard1-server/data/2:/data/db \
-v /tmp/mongo-cluster/shard1-server/logs/2:/data/logs \
mongo --config /data/configdb/conf/mongo.conf      
【超詳細】手把手教你搭建MongoDB叢集

啟動shard1-server3

docker run --name shard1-server3 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/shard1-server:/data/configdb \
-v /tmp/mongo-cluster/shard1-server/data/3:/data/db \
-v /tmp/mongo-cluster/shard1-server/logs/3:/data/logs \
mongo --config /data/configdb/conf/mongo.conf      
【超詳細】手把手教你搭建MongoDB叢集

初始化shard1分片組

并且制定第三個副本集為仲裁節點
docker exec  -it shard1-server1 bin/bash
 mongo -port 27017      
【超詳細】手把手教你搭建MongoDB叢集
登入後進行初始化節點,這裡面​

​arbiterOnly:true​

​是設定為仲裁節點
#進行副本集配置
rs.initiate(
     {
         _id : "shard1",
         members: [
             { _id : 0, host : "shard1-server1:27017" },
             { _id : 1, host : "shard1-server2:27017" },
             { _id : 2, host : "shard1-server3:27017",arbiterOnly:true }
        ]
    }
);      
顯示OK即副本集建立成功
【超詳細】手把手教你搭建MongoDB叢集

建立使用者

因為我們需要對使用者進行權限管理,我們需要建立使用者,這裡為了示範,我們建立超級使用者 權限是​

​root​

use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})      
【超詳細】手把手教你搭建MongoDB叢集

檢視節點資訊

rs.isMaster()      
【超詳細】手把手教你搭建MongoDB叢集
搭建shard2分片組

建立密鑰檔案

因為叢集隻需要一個密鑰檔案,我們可以将​

​config-server​

​中的密鑰檔案複制過來
cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard2-server/conf/      
【超詳細】手把手教你搭建MongoDB叢集

配置配置檔案

因為有多個容器,配置檔案是一樣的,我們隻需要建立一個配置檔案,其他的容器統一讀取該配置檔案即可
echo "
# 日志檔案
storage:
  # mongod 程序存儲資料目錄,此配置僅對 mongod 程序有效
  dbPath: /data/db
systemLog:
  destination: file
  logAppend: true
  path: /data/logs/mongo.log

#  網絡設定
net:
  port: 27017  #端口号
#  bindIp: 127.0.0.1    #綁定ip
replication:
  replSetName: shard2 #複制集名稱是 shard2
sharding:
  clusterRole: shardsvr # 叢集角色,這裡配置的角色是分片節點
security:
  authorization: enabled #是否開啟認證
  keyFile: /data/configdb/conf/mongo.key #keyFile路徑
"  > /tmp/mongo-cluster/shard2-server/conf/mongo.conf      
【超詳細】手把手教你搭建MongoDB叢集

啟動shard2-server1

docker run --name shard2-server1 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/shard2-server:/data/configdb \
-v /tmp/mongo-cluster/shard2-server/data/1:/data/db \
-v /tmp/mongo-cluster/shard2-server/logs/1:/data/logs \
mongo --config /data/configdb/conf/mongo.conf      
【超詳細】手把手教你搭建MongoDB叢集

啟動shard2-server2

docker run --name shard2-server2 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/shard2-server:/data/configdb \
-v /tmp/mongo-cluster/shard2-server/data/2:/data/db \
-v /tmp/mongo-cluster/shard2-server/logs/2:/data/logs \
mongo --config /data/configdb/conf/mongo.conf      
【超詳細】手把手教你搭建MongoDB叢集

啟動shard2-server3

docker run --name shard2-server3 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/shard2-server:/data/configdb \
-v /tmp/mongo-cluster/shard2-server/data/3:/data/db \
-v /tmp/mongo-cluster/shard2-server/logs/3:/data/logs \
mongo --config /data/configdb/conf/mongo.conf      
【超詳細】手把手教你搭建MongoDB叢集

初始化shard2分片組

登入節點後進行初始化分片2
docker exec -it shard2-server1 bin/bash
 mongo -port 27017      
【超詳細】手把手教你搭建MongoDB叢集
執行下面的指令進行初始化分片2,​

​arbiterOnly:true​

​參數是設定為仲裁節點
#進行副本集配置
rs.initiate(
     {
         _id : "shard2",
         members: [
             { _id : 0, host : "shard2-server1:27017" },
             { _id : 1, host : "shard2-server2:27017" },
             { _id : 2, host : "shard2-server3:27017",arbiterOnly:true }
        ]
    }
);      
傳回​

​ok​

​就表示
【超詳細】手把手教你搭建MongoDB叢集

建立使用者

因為我們需要對使用者進行權限管理,我們需要建立使用者,這裡為了示範,我們建立超級使用者 權限是​

​root​

use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})      
【超詳細】手把手教你搭建MongoDB叢集
搭建shard3分片組

建立密鑰檔案

因為叢集隻需要一個密鑰檔案,我們可以将​

​config-server​

​中的密鑰檔案複制過來
cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard3-server/conf/      
【超詳細】手把手教你搭建MongoDB叢集

配置配置檔案

因為有多個容器,配置檔案是一樣的,我們隻需要建立一個配置檔案,其他的容器統一讀取該配置檔案即可
echo "
# 日志檔案
storage:
  # mongod 程序存儲資料目錄,此配置僅對 mongod 程序有效
  dbPath: /data/db
systemLog:
  destination: file
  logAppend: true
  path: /data/logs/mongo.log

#  網絡設定
net:
  port: 27017  #端口号
#  bindIp: 127.0.0.1    #綁定ip
replication:
  replSetName: shard3 #複制集名稱是 shard3
sharding:
  clusterRole: shardsvr # 叢集角色,這裡配置的角色是分片節點
security:
  authorization: enabled #是否開啟認證
  keyFile: /data/configdb/conf/mongo.key #keyFile路徑
"  > /tmp/mongo-cluster/shard3-server/conf/mongo.conf      
【超詳細】手把手教你搭建MongoDB叢集

啟動shard3-server1

docker run --name shard3-server1 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/shard3-server:/data/configdb \
-v /tmp/mongo-cluster/shard3-server/data/1:/data/db \
-v /tmp/mongo-cluster/shard3-server/logs/1:/data/logs \
mongo --config /data/configdb/conf/mongo.conf      
【超詳細】手把手教你搭建MongoDB叢集

啟動shard3-server2

docker run --name shard3-server2 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/shard3-server:/data/configdb \
-v /tmp/mongo-cluster/shard3-server/data/2:/data/db \
-v /tmp/mongo-cluster/shard3-server/logs/2:/data/logs \
mongo --config /data/configdb/conf/mongo.conf      
【超詳細】手把手教你搭建MongoDB叢集

啟動shard3-server3

docker run --name shard3-server3 -d \
--net=mongo-cluster \
--privileged=true \
-v /tmp/mongo-cluster/shard3-server:/data/configdb \
-v /tmp/mongo-cluster/shard3-server/data/3:/data/db \
-v /tmp/mongo-cluster/shard3-server/logs/3:/data/logs \
mongo --config /data/configdb/conf/mongo.conf      
【超詳細】手把手教你搭建MongoDB叢集

初始化shard3分片組

登入節點後進行初始化分片2
docker exec -it shard3-server1 bin/bash
 mongo -port 27017      
【超詳細】手把手教你搭建MongoDB叢集
執行下面的指令進行初始化分片3,​

​arbiterOnly:true​

​參數是設定為仲裁節點
#進行副本集配置
rs.initiate(
     {
         _id : "shard3",
         members: [
             { _id : 0, host : "shard3-server1:27017" },
             { _id : 1, host : "shard3-server2:27017" },
             { _id : 2, host : "shard3-server3:27017",arbiterOnly:true }
        ]
    }
);      
【超詳細】手把手教你搭建MongoDB叢集

建立使用者

因為我們需要對使用者進行權限管理,我們需要建立使用者,這裡為了示範,我們建立超級使用者 權限是​

​root​

use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})      
【超詳細】手把手教你搭建MongoDB叢集

搭建Mongos

mongos負責查詢與資料寫入的路由,是執行個體通路的統一入口,是一個無狀态的節點,每一個節點都可以從​

​config-server​

​節點擷取到配置資訊
建立挂載目錄
我們需要建立對應的挂載目錄來存儲配置檔案以及日志檔案
# 建立配置檔案目錄
mkdir -p /tmp/mongo-cluster/mongos-server/conf
# 建立資料檔案目錄
mkdir -p /tmp/mongo-cluster/mongos-server/data/{1..3}
# 建立日志檔案目錄
mkdir -p /tmp/mongo-cluster/mongos-server/logs/{1..3}      
【超詳細】手把手教你搭建MongoDB叢集
建立密鑰檔案
因為叢集隻需要一個密鑰檔案,我們可以将​

​config-server​

​中的密鑰檔案複制過來
cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/mongos-server/conf/      
【超詳細】手把手教你搭建MongoDB叢集
建立配置檔案
因為有多個容器,配置檔案是一樣的,我們隻需要建立一個配置檔案,其他的容器統一讀取該配置檔案即可,因為Mongos隻負責路由,就不需要資料檔案了,并且mongos服務是不負責認證的,需要将​

​authorization​

​配置項删除
echo "
# 日志檔案
systemLog:
  destination: file
  logAppend: true
  path: /data/logs/mongo.log

#  網絡設定
net:
  port: 27017  #端口号
#  bindIp: 127.0.0.1    #綁定ip
# 配置分片,這裡面配置的是需要讀取的配置節點的資訊
sharding:
  configDB: configsvr/config-server1:27017,config-server2:27017,config-server3:27017
security:
  keyFile: /data/configdb/conf/mongo.key #keyFile路徑
"  > /tmp/mongo-cluster/mongos-server/conf/mongo.conf      
【超詳細】手把手教你搭建MongoDB叢集
啟動mongos叢集

啟動mongos1

docker run --name mongos-server1 -d \
-p 30001:27017 \
--net=mongo-cluster \
--privileged=true \
--entrypoint "mongos" \
-v /tmp/mongo-cluster/mongos-server:/data/configdb \
-v /tmp/mongo-cluster/mongos-server/logs/1:/data/logs \
mongo --config /data/configdb/conf/mongo.conf      
【超詳細】手把手教你搭建MongoDB叢集

啟動mongos2

docker run --name mongos-server2 -d \
-p 30002:27017 \
--net=mongo-cluster \
--privileged=true \
--entrypoint "mongos" \
-v /tmp/mongo-cluster/mongos-server:/data/configdb \
-v /tmp/mongo-cluster/mongos-server/logs/2:/data/logs \
mongo --config /data/configdb/conf/mongo.conf      
【超詳細】手把手教你搭建MongoDB叢集

啟動mongos3

docker run --name mongos-server3 -d \
-p 30003:27017 \
--net=mongo-cluster \
--privileged=true \
--entrypoint "mongos" \
-v /tmp/mongo-cluster/mongos-server:/data/configdb \
-v /tmp/mongo-cluster/mongos-server/logs/3:/data/logs \
mongo --config /data/configdb/conf/mongo.conf      
【超詳細】手把手教你搭建MongoDB叢集
配置mongos-server1
因為​

​mongos​

​是無中心的配置,所有需要每一台都需要進行分片配置

進入容器

docker exec -it mongos-server1 /bin/bash
mongo -port 27017      
【超詳細】手把手教你搭建MongoDB叢集

登入Mongos

使用前面設定的root使用者密碼
use admin;
db.auth("root","root");      
【超詳細】手把手教你搭建MongoDB叢集

配置分片

進行配置分片資訊
sh.addShard("shard1/shard1-server1:27017,shard1-server2:27017,shard1-server3:27017")
sh.addShard("shard2/shard2-server1:27017,shard2-server2:27017,shard2-server3:27017")
sh.addShard("shard3/shard3-server1:27017,shard3-server2:27017,shard3-server3:27017")      
【超詳細】手把手教你搭建MongoDB叢集
配置mongos-server2
因為​

​mongos​

​是無中心的配置,所有需要每一台都需要進行分片配置

進入容器

docker exec -it mongos-server2 /bin/bash
mongo -port 27017      
【超詳細】手把手教你搭建MongoDB叢集

登入Mongos

使用前面設定的root使用者密碼
use admin;
db.auth("root","root");      
【超詳細】手把手教你搭建MongoDB叢集

配置分片

進行配置分片資訊
sh.addShard("shard1/shard1-server1:27017,shard1-server2:27017,shard1-server3:27017")
sh.addShard("shard2/shard2-server1:27017,shard2-server2:27017,shard2-server3:27017")
sh.addShard("shard3/shard3-server1:27017,shard3-server2:27017,shard3-server3:27017")      
【超詳細】手把手教你搭建MongoDB叢集
配置mongos-server3
因為​

​mongos​

​是無中心的配置,所有需要每一台都需要進行分片配置

進入容器

docker exec -it mongos-server3 /bin/bash
mongo -port 27017      
【超詳細】手把手教你搭建MongoDB叢集

登入Mongos

使用前面設定的root使用者密碼
use admin;
db.auth("root","root");      
【超詳細】手把手教你搭建MongoDB叢集

配置分片

進行配置分片資訊
sh.addShard("shard1/shard1-server1:27017,shard1-server2:27017,shard1-server3:27017")
sh.addShard("shard2/shard2-server1:27017,shard2-server2:27017,shard2-server3:27017")
sh.addShard("shard3/shard3-server1:27017,shard3-server2:27017,shard3-server3:27017")      
【超詳細】手把手教你搭建MongoDB叢集

Docker-compose方式搭建

環境準備

初始化目錄腳本
# 建立config-server 目錄
# 建立配置檔案目錄
mkdir -p /tmp/mongo-cluster/config-server/conf
# 建立資料檔案目錄
mkdir -p /tmp/mongo-cluster/config-server/data/{1..3}
# 建立日志檔案目錄
mkdir -p /tmp/mongo-cluster/config-server/logs/{1..3}

# 建立shard-server 目錄
# 建立配置檔案目錄
mkdir -p /tmp/mongo-cluster/shard{1..3}-server/conf
# 建立資料檔案目錄
mkdir -p /tmp/mongo-cluster/shard{1..3}-server/data/{1..3}
# 建立日志檔案目錄
mkdir -p /tmp/mongo-cluster/shard{1..3}-server/logs/{1..3}

# 建立mongos-server 目錄
# 建立配置檔案目錄
mkdir -p /tmp/mongo-cluster/mongos-server/conf
# 建立資料檔案目錄
mkdir -p /tmp/mongo-cluster/mongos-server/data/{1..3}
# 建立日志檔案目錄
mkdir -p /tmp/mongo-cluster/mongos-server/logs/{1..3}      
【超詳細】手把手教你搭建MongoDB叢集
生成密鑰檔案
# 建立密鑰檔案
openssl rand -base64 756 > /tmp/mongo-cluster/config-server/conf/mongo.key
# 設定
chmod 600  /tmp/mongo-cluster/config-server/conf/mongo.key

cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard1-server/conf/

cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard2-server/conf/

cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard3-server/conf/

cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/mongos-server/conf/      
【超詳細】手把手教你搭建MongoDB叢集
建立配置檔案
echo "
# 日志檔案
storage:
  # mongod 程序存儲資料目錄,此配置僅對 mongod 程序有效
  dbPath: /data/db
systemLog:
  destination: file
  logAppend: true
  path: /data/logs/mongo.log

#  網絡設定
net:
  port: 27017  #端口号
#  bindIp: 127.0.0.1    #綁定ip
replication:
  replSetName: configsvr #副本集名稱
sharding:
  clusterRole: configsvr # 叢集角色,這裡配置的角色是配置節點
security:
  authorization: enabled #是否開啟認證
  keyFile: /data/configdb/conf/mongo.key #keyFile路徑
"  > /tmp/mongo-cluster/config-server/conf/mongo.conf


echo "
# 日志檔案
storage:
  # mongod 程序存儲資料目錄,此配置僅對 mongod 程序有效
  dbPath: /data/db
systemLog:
  destination: file
  logAppend: true
  path: /data/logs/mongo.log

#  網絡設定
net:
  port: 27017  #端口号
#  bindIp: 127.0.0.1    #綁定ip
replication:
  replSetName: shard1 #複制集名稱是 shardsvr
sharding:
  clusterRole: shardsvr # 叢集角色,這裡配置的角色是分片節點
security:
  authorization: enabled #是否開啟認證
  keyFile: /data/configdb/conf/mongo.key #keyFile路徑
"  > /tmp/mongo-cluster/shard1-server/conf/mongo.conf


echo "
# 日志檔案
storage:
  # mongod 程序存儲資料目錄,此配置僅對 mongod 程序有效
  dbPath: /data/db
systemLog:
  destination: file
  logAppend: true
  path: /data/logs/mongo.log

#  網絡設定
net:
  port: 27017  #端口号
#  bindIp: 127.0.0.1    #綁定ip
replication:
  replSetName: shard2 #複制集名稱是 shard2
sharding:
  clusterRole: shardsvr # 叢集角色,這裡配置的角色是分片節點
security:
  authorization: enabled #是否開啟認證
  keyFile: /data/configdb/conf/mongo.key #keyFile路徑
"  > /tmp/mongo-cluster/shard2-server/conf/mongo.conf



echo "
# 日志檔案
storage:
  # mongod 程序存儲資料目錄,此配置僅對 mongod 程序有效
  dbPath: /data/db
systemLog:
  destination: file
  logAppend: true
  path: /data/logs/mongo.log

#  網絡設定
net:
  port: 27017  #端口号
#  bindIp: 127.0.0.1    #綁定ip
replication:
  replSetName: shard3 #複制集名稱是 shard3
sharding:
  clusterRole: shardsvr # 叢集角色,這裡配置的角色是分片節點
security:
  authorization: enabled #是否開啟認證
  keyFile: /data/configdb/conf/mongo.key #keyFile路徑
"  > /tmp/mongo-cluster/shard3-server/conf/mongo.conf


echo "
# 日志檔案
systemLog:
  destination: file
  logAppend: true
  path: /data/logs/mongo.log

#  網絡設定
net:
  port: 27017  #端口号
  bindIp: 0.0.0.0    #綁定ip
# 配置分片,這裡面配置的是需要讀取的配置節點的資訊
sharding:
  configDB: configsvr/config-server1:27017,config-server2:27017,config-server3:27017
security:
  keyFile: /data/configdb/conf/mongo.key #keyFile路徑
"  > /tmp/mongo-cluster/mongos-server/conf/mongo.conf      

啟動服務

docker-compos配置檔案
version: '2'
services:
  config-server1:
    image: mongo
    container_name: config-server1
    privileged: true
    networks:
      - mongo-cluster-network
    command: --config /data/configdb/conf/mongo.conf
    volumes:
      - /etc/localtime:/etc/localtime
      - /tmp/mongo-cluster/config-server:/data/configdb
      - /tmp/mongo-cluster/config-server/data/1:/data/db
      - /tmp/mongo-cluster/config-server/logs/1:/data/logs

  config-server2:
    image: mongo
    container_name: config-server2
    privileged: true
    networks:
      - mongo-cluster-network
    command: --config /data/configdb/conf/mongo.conf
    volumes:
      - /etc/localtime:/etc/localtime
      - /tmp/mongo-cluster/config-server:/data/configdb
      - /tmp/mongo-cluster/config-server/data/2:/data/db
      - /tmp/mongo-cluster/config-server/logs/2:/data/logs

  config-server3:
    image: mongo
    container_name: config-server3
    privileged: true
    networks:
      - mongo-cluster-network
    command: --config /data/configdb/conf/mongo.conf
    volumes:
      - /etc/localtime:/etc/localtime
      - /tmp/mongo-cluster/config-server:/data/configdb
      - /tmp/mongo-cluster/config-server/data/3:/data/db
      - /tmp/mongo-cluster/config-server/logs/3:/data/logs

  shard1-server1:
    image: mongo
    container_name: shard1-server1
    privileged: true
    networks:
      - mongo-cluster-network
    command: --config /data/configdb/conf/mongo.conf
    volumes:
      - /etc/localtime:/etc/localtime
      - /tmp/mongo-cluster/shard1-server:/data/configdb
      - /tmp/mongo-cluster/shard1-server/data/1:/data/db
      - /tmp/mongo-cluster/shard1-server/logs/1:/data/logs

  shard1-server2:
    image: mongo
    container_name: shard1-server2
    privileged: true
    networks:
      - mongo-cluster-network
    command: --config /data/configdb/conf/mongo.conf
    volumes:
      - /etc/localtime:/etc/localtime
      - /tmp/mongo-cluster/shard1-server:/data/configdb
      - /tmp/mongo-cluster/shard1-server/data/2:/data/db
      - /tmp/mongo-cluster/shard1-server/logs/2:/data/logs

  shard1-server3:
    image: mongo
    container_name: shard1-server3
    privileged: true
    networks:
      - mongo-cluster-network
    command: --config /data/configdb/conf/mongo.conf
    volumes:
      - /etc/localtime:/etc/localtime
      - /tmp/mongo-cluster/shard1-server:/data/configdb
      - /tmp/mongo-cluster/shard1-server/data/3:/data/db
      - /tmp/mongo-cluster/shard1-server/logs/3:/data/logs

  shard2-server1:
    image: mongo
    container_name: shard2-server1
    privileged: true
    networks:
      - mongo-cluster-network
    command: --config /data/configdb/conf/mongo.conf
    volumes:
      - /etc/localtime:/etc/localtime
      - /tmp/mongo-cluster/shard2-server:/data/configdb
      - /tmp/mongo-cluster/shard2-server/data/1:/data/db
      - /tmp/mongo-cluster/shard2-server/logs/1:/data/logs

  shard2-server2:
    image: mongo
    container_name: shard2-server2
    privileged: true
    networks:
      - mongo-cluster-network
    command: --config /data/configdb/conf/mongo.conf
    volumes:
      - /etc/localtime:/etc/localtime
      - /tmp/mongo-cluster/shard2-server:/data/configdb
      - /tmp/mongo-cluster/shard2-server/data/2:/data/db
      - /tmp/mongo-cluster/shard2-server/logs/2:/data/logs

  shard2-server3:
    image: mongo
    container_name: shard2-server3
    privileged: true
    networks:
      - mongo-cluster-network
    command: --config /data/configdb/conf/mongo.conf
    volumes:
      - /etc/localtime:/etc/localtime
      - /tmp/mongo-cluster/shard2-server:/data/configdb
      - /tmp/mongo-cluster/shard2-server/data/3:/data/db
      - /tmp/mongo-cluster/shard2-server/logs/3:/data/logs

  shard3-server1:
    image: mongo
    container_name: shard3-server1
    privileged: true
    networks:
      - mongo-cluster-network
    command: --config /data/configdb/conf/mongo.conf
    volumes:
      - /etc/localtime:/etc/localtime
      - /tmp/mongo-cluster/shard3-server:/data/configdb
      - /tmp/mongo-cluster/shard3-server/data/1:/data/db
      - /tmp/mongo-cluster/shard3-server/logs/1:/data/logs

  shard3-server2:
    image: mongo
    container_name: shard3-server2
    privileged: true
    networks:
      - mongo-cluster-network
    command: --config /data/configdb/conf/mongo.conf
    volumes:
      - /etc/localtime:/etc/localtime
      - /tmp/mongo-cluster/shard3-server:/data/configdb
      - /tmp/mongo-cluster/shard3-server/data/2:/data/db
      - /tmp/mongo-cluster/shard3-server/logs/2:/data/logs

  shard3-server3:
    image: mongo
    container_name: shard3-server3
    privileged: true
    networks:
      - mongo-cluster-network
    command: --config /data/configdb/conf/mongo.conf
    volumes:
      - /etc/localtime:/etc/localtime
      - /tmp/mongo-cluster/shard3-server:/data/configdb
      - /tmp/mongo-cluster/shard3-server/data/3:/data/db
      - /tmp/mongo-cluster/shard3-server/logs/3:/data/logs

  mongos-server1:
    image: mongo
    container_name: mongos-server1
    privileged: true
    entrypoint: "mongos"
    networks:
      - mongo-cluster-network
    command: --config /data/configdb/conf/mongo.conf
    ports:
      - "30001:27017"
    volumes:
      - /etc/localtime:/etc/localtime
      - /tmp/mongo-cluster/mongos-server:/data/configdb
      - /tmp/mongo-cluster/mongos-server/logs/1:/data/logs
    command: --config /data/configdb/conf/mongo.conf

  mongos-server2:
    image: mongo
    container_name: mongos-server2
    privileged: true
    entrypoint: "mongos"
    networks:
      - mongo-cluster-network
    ports:
      - "30002:27017"
    volumes:
      - /etc/localtime:/etc/localtime
      - /tmp/mongo-cluster/mongos-server:/data/configdb
      - /tmp/mongo-cluster/mongos-server/logs/2:/data/logs
    command: --config /data/configdb/conf/mongo.conf

  mongos-server3:
    image: mongo
    container_name: mongos-server3
    privileged: true
    entrypoint: "mongos"
    networks:
      - mongo-cluster-network
    ports:
      - "30003:27017"
    volumes:
      - /etc/localtime:/etc/localtime
      - /tmp/mongo-cluster/mongos-server:/data/configdb
      - /tmp/mongo-cluster/mongos-server/logs/3:/data/logs
    command: --config /data/configdb/conf/mongo.conf

networks:
  mongo-cluster-network:
    driver: bridge      
啟動服務
docker-compose up -d      
初始化檔案
docker exec -it config-server1 bash
mongo -port 27017
rs.initiate(
  {
    _id: "configsvr",
    members: [
      { _id : 1, host : "config-server1:27017" },
      { _id : 2, host : "config-server2:27017" },
      { _id : 3, host : "config-server3:27017" }
    ]
  }
)
use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})
db.auth("root","root")
db.createUser({user:"test",pwd:"test",roles:[{role:'readWrite',db:'test'}]})

docker exec  -it shard1-server1 bin/bash
mongo -port 27017
#進行副本集配置
rs.initiate(
     {
         _id : "shard1",
         members: [
             { _id : 0, host : "shard1-server1:27017" },
             { _id : 1, host : "shard1-server2:27017" },
             { _id : 2, host : "shard1-server3:27017",arbiterOnly:true }
        ]
    }
);
use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})
db.auth("root","root")
db.createUser({user:"test",pwd:"test",roles:[{role:'readWrite',db:'test'}]})

docker exec  -it shard2-server1 bin/bash
mongo -port 27017
#進行副本集配置
rs.initiate(
     {
         _id : "shard2",
         members: [
             { _id : 0, host : "shard2-server1:27017" },
             { _id : 1, host : "shard2-server2:27017" },
             { _id : 2, host : "shard2-server3:27017",arbiterOnly:true }
        ]
    }
);
use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})
db.auth("root","root")
db.createUser({user:"test",pwd:"test",roles:[{role:'readWrite',db:'test'}]})


docker exec  -it shard3-server1 bin/bash
mongo -port 27017
#進行副本集配置
rs.initiate(
     {
         _id : "shard3",
         members: [
             { _id : 0, host : "shard3-server1:27017" },
             { _id : 1, host : "shard3-server2:27017" },
             { _id : 2, host : "shard3-server3:27017",arbiterOnly:true }
        ]
    }
);
use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})
db.auth("root","root")
db.createUser({user:"test",pwd:"test",roles:[{role:'readWrite',db:'test'}]})      
初始化分片
docker exec -it mongos-server1 /bin/bash
mongo -port 27017
use admin;
db.auth("root","root");
sh.addShard("shard1/shard1-server1:27017,shard1-server2:27017,shard1-server3:27017")
sh.addShard("shard2/shard2-server1:27017,shard2-server2:27017,shard2-server3:27017")
sh.addShard("shard3/shard3-server1:27017,shard3-server2:27017,shard3-server3:27017")

docker exec -it mongos-server2 /bin/bash
mongo -port 27017
use admin;
db.auth("root","root");
sh.addShard("shard1/shard1-server1:27017,shard1-server2:27017,shard1-server3:27017")
sh.addShard("shard2/shard2-server1:27017,shard2-server2:27017,shard2-server3:27017")
sh.addShard("shard3/shard3-server1:27017,shard3-server2:27017,shard3-server3:27017")


docker exec -it mongos-server3 /bin/bash
mongo -port 27017
use admin;
db.auth("root","root");
sh.addShard("shard1/shard1-server1:27017,shard1-server2:27017,shard1-server3:27017")
sh.addShard("shard2/shard2-server1:27017,shard2-server2:27017,shard2-server3:27017")
sh.addShard("shard3/shard3-server1:27017,shard3-server2:27017,shard3-server3:27017")