
MongoDB集群搭建
MongoDB集群簡介
mongodb 集群搭建的方式有三種:
- 主從備份(Master - Slave)模式,或者叫主從復制模式,
- 副本集(Replica Set)模式
- 分片(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 |
整體架構預覽

基礎環境準備
安裝Docker
本次使用Docker環境進行搭建,需要提前準備好Docker環境
創建Docker網路
因為需要使用Docker搭建MongoDB集群,所以先創建Docker網路
docker network create mongo-cluster
docker network ls

搭建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}

創建密鑰檔案
因為我們知道搭建的話一定要高可用,而且一定要權限,這里mongo之間通信采用秘鑰檔案,所以我們先進行生成密鑰檔案
# 創建密鑰檔案
openssl rand -base64 756 > /tmp/mongo-cluster/config-server/conf/mongo.key
# 設定
chmod 600 /tmp/mongo-cluster/config-server/conf/mongo.key

創建組態檔
因為由多個容器,組態檔是一樣的,我們只需要創建一個組態檔,其他的容器統一讀取該組態檔即可
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

啟動容器
啟動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

啟動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

啟動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

初始化config-server
登錄容器
進入第一臺容器
docker exec -it config-server1 bash
mongo -port 27017

執行命令
執行以下命令進行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配置服務器已經初始化成功

創建用戶
因為我們需要對用戶進行權限管理,我們需要創建用戶,這里為了演示,我們創建超級用戶 權限是
root
use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})
這樣就在MongoDB的
admin資料庫添加了一個用戶名為root 密碼是root的用戶

搭建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}

搭建shard1分片組
在同一臺服務器上初始化一組分片
創建密鑰檔案
因為集群只需要一個密鑰檔案,我們可以將
config-server中的密鑰檔案復制過來
cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard1-server/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

啟動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

啟動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

啟動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

初始化shard1分片組
并且制定第三個副本集為仲裁節點
docker exec -it shard1-server1 bin/bash
mongo -port 27017

登錄后進行初始化節點,這里面
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即副本集創建成功

創建用戶
因為我們需要對用戶進行權限管理,我們需要創建用戶,這里為了演示,我們創建超級用戶 權限是
root
use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})

查看節點資訊
rs.isMaster()

搭建shard2分片組
創建密鑰檔案
因為集群只需要一個密鑰檔案,我們可以將
config-server中的密鑰檔案復制過來
cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard2-server/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

啟動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

啟動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

啟動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

初始化shard2分片組
登錄節點后進行初始化分片2
docker exec -it shard2-server1 bin/bash
mongo -port 27017

執行下面的命令進行初始化分片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就表示

創建用戶
因為我們需要對用戶進行權限管理,我們需要創建用戶,這里為了演示,我們創建超級用戶 權限是
root
use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})

搭建shard3分片組
創建密鑰檔案
因為集群只需要一個密鑰檔案,我們可以將
config-server中的密鑰檔案復制過來
cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/shard3-server/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

啟動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

啟動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

啟動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

初始化shard3分片組
登錄節點后進行初始化分片2
docker exec -it shard3-server1 bin/bash
mongo -port 27017

執行下面的命令進行初始化分片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 }
]
}
);

創建用戶
因為我們需要對用戶進行權限管理,我們需要創建用戶,這里為了演示,我們創建超級用戶 權限是
root
use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})

搭建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}

創建密鑰檔案
因為集群只需要一個密鑰檔案,我們可以將
config-server中的密鑰檔案復制過來
cp /tmp/mongo-cluster/config-server/conf/mongo.key /tmp/mongo-cluster/mongos-server/conf/

創建組態檔
因為有多個容器,組態檔是一樣的,我們只需要創建一個組態檔,其他的容器統一讀取該組態檔即可,因為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

啟動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

啟動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

啟動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

配置mongos-server1
因為
mongos是無中心的配置,所有需要每一臺都需要進行分片配置
進入容器
docker exec -it mongos-server1 /bin/bash
mongo -port 27017

登錄Mongos
使用前面設定的root用戶密碼
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")

配置mongos-server2
因為
mongos是無中心的配置,所有需要每一臺都需要進行分片配置
進入容器
docker exec -it mongos-server2 /bin/bash
mongo -port 27017

登錄Mongos
使用前面設定的root用戶密碼
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")

配置mongos-server3
因為
mongos是無中心的配置,所有需要每一臺都需要進行分片配置
進入容器
docker exec -it mongos-server3 /bin/bash
mongo -port 27017

登錄Mongos
使用前面設定的root用戶密碼
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-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}

生成密鑰檔案
# 創建密鑰檔案
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/

創建組態檔
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組態檔
使用docker-compos方式啟動Docker容器
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")
本文由傳智教育博學谷 - 狂野架構師教研團隊發布
如果本文對您有幫助,歡迎關注和點贊;如果您有任何建議也可留言評論或私信,您的支持是我堅持創作的動力
轉載請注明出處!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/499323.html
標籤:其他
上一篇:竟然有一半的人不知道 for 與 foreach 的區別???
下一篇:LinkedList原始碼刨析
