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

来源:https://www.cnblogs.com/jiagooushi/archive/2022/07/14/16477696.html
-Advertisement-
Play Games

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


file

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
整體架構預覽

file

基礎環境準備

安裝Docker

本次使用Docker環境進行搭建,需要提前準備好Docker環境

創建Docker網路

因為需要使用Docker搭建MongoDB集群,所以先創建Docker網路

docker network create mongo-cluster
docker network ls 

file

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

file

創建密鑰文件

因為我們知道搭建的話一定要高可用,而且一定要許可權,這裡mongo之間通信採用秘鑰文件,所以我們先進行生成密鑰文件

# 創建密鑰文件
openssl rand -base64 756 > /tmp/mongo-cluster/config-server/conf/mongo.key
# 設置
chmod 600  /tmp/mongo-cluster/config-server/conf/mongo.key

file

創建配置文件

因為由多個容器,配置文件是一樣的,我們只需要創建一個配置文件,其他的容器統一讀取該配置文件即可

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

file

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

file

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

file

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

file

初始化config-server
登錄容器

進入第一臺容器

docker exec -it config-server1 bash
mongo -port 27017

file

執行命令

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

file

創建用戶

因為我們需要對用戶進行許可權管理,我們需要創建用戶,這裡為了演示,我們創建超級用戶 許可權是root

use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})

這樣就在MongoDB的admin資料庫添加了一個用戶名為root 密碼是root的用戶

file

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

file

搭建shard1分片組

在同一臺伺服器上初始化一組分片

創建密鑰文件

因為集群只需要一個密鑰文件,我們可以將config-server中的密鑰文件複製過來

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

file

配置配置文件

因為有多個容器,配置文件是一樣的,我們只需要創建一個配置文件,其他的容器統一讀取該配置文件即可

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

file

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

file

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

file

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

file

初始化shard1分片組

並且制定第三個副本集為仲裁節點

 docker exec  -it shard1-server1 bin/bash
 mongo -port 27017

file

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

file

創建用戶

因為我們需要對用戶進行許可權管理,我們需要創建用戶,這裡為了演示,我們創建超級用戶 許可權是root

use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})

file

查看節點信息
rs.isMaster()

file

搭建shard2分片組
創建密鑰文件

因為集群只需要一個密鑰文件,我們可以將config-server中的密鑰文件複製過來

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

file

配置配置文件

因為有多個容器,配置文件是一樣的,我們只需要創建一個配置文件,其他的容器統一讀取該配置文件即可

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

file

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

file

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

file

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

file

初始化shard2分片組

登錄節點後進行初始化分片2

 docker exec -it shard2-server1 bin/bash
 mongo -port 27017

file

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

file

創建用戶

因為我們需要對用戶進行許可權管理,我們需要創建用戶,這裡為了演示,我們創建超級用戶 許可權是root

use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})

file

搭建shard3分片組
創建密鑰文件

因為集群只需要一個密鑰文件,我們可以將config-server中的密鑰文件複製過來

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

file

配置配置文件

因為有多個容器,配置文件是一樣的,我們只需要創建一個配置文件,其他的容器統一讀取該配置文件即可

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

file

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

file

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

file

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

file

初始化shard3分片組

登錄節點後進行初始化分片2

 docker exec -it shard3-server1 bin/bash
 mongo -port 27017

file

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

file

創建用戶

因為我們需要對用戶進行許可權管理,我們需要創建用戶,這裡為了演示,我們創建超級用戶 許可權是root

use admin
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})

file

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

file

創建密鑰文件

因為集群只需要一個密鑰文件,我們可以將config-server中的密鑰文件複製過來

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

file

創建配置文件

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

file

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

file

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

file

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

file

配置mongos-server1

因為mongos是無中心的配置,所有需要每一臺都需要進行分片配置

進入容器
docker exec -it mongos-server1 /bin/bash
mongo -port 27017

file

登錄Mongos

使用前面設置的root用戶密碼

use admin;
db.auth("root","root");

file

配置分片

進行配置分片信息

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")

file

配置mongos-server2

因為mongos是無中心的配置,所有需要每一臺都需要進行分片配置

進入容器
docker exec -it mongos-server2 /bin/bash
mongo -port 27017

file

登錄Mongos

使用前面設置的root用戶密碼

use admin;
db.auth("root","root");

file

配置分片

進行配置分片信息

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")

file

配置mongos-server3

因為mongos是無中心的配置,所有需要每一臺都需要進行分片配置

進入容器
docker exec -it mongos-server3 /bin/bash
mongo -port 27017

file

登錄Mongos

使用前面設置的root用戶密碼

use admin;
db.auth("root","root");

file

配置分片

進行配置分片信息

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")

file

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}

file

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

file

創建配置文件
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

file

初始化文件

執行下麵腳本進行容器初始化

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")

本文由傳智教育博學谷 - 狂野架構師教研團隊發佈
如果本文對您有幫助,歡迎關註和點贊;如果您有任何建議也可留言評論或私信,您的支持是我堅持創作的動力
轉載請註明出處!


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

-Advertisement-
Play Games
更多相關文章
  • 面向對象編程(基礎) 類與對象 ●使用現有技術解決 張老太養了兩隻貓貓:一隻名字叫小白,今年3歲,白色。還有一隻叫小花,今年100歲,花色。請編寫一個程式,當用戶輸入小貓的名字時,就顯示該貓的名字,年齡,顏色。如果用戶輸入的小貓名錯誤,則顯示張老太沒有這隻貓貓。 1)單獨的定義變數解決 2)使用數組 ...
  • MyDisruptor V5版本介紹 在v4版本的MyDisruptor實現多線程生產者後。按照計劃,v5版本的MyDisruptor需要支持更便於用戶使用的DSL風格的API。 由於該文屬於系列博客的一部分,需要先對之前的博客內容有所瞭解才能更好地理解本篇博客 v1版本博客:從零開始實現lmax- ...
  • 為了在命令行程式中實現和用戶的交互,我們編寫的程式的運行過程中往往涉及到對標準輸入/輸出流的多次讀寫。 在C語言中接受用戶輸入這一塊,有著一個老生常談的問題:“怎麼樣及時清空輸入流中的數據?” 這也是這篇小筆記的主題內容。 先從緩衝區說起。 緩衝區是記憶體中劃分出來的一部分。通常來說,緩衝區類型有三種 ...
  • day23今日內容概要: 1.絕對導入與相對導入 2.包的概念(package) 3.模塊化編程思想簡介 4.軟體開發目錄規範 5.常見內置函數:collections和time 6.作業(將員工管理系統用模塊化編程,結合軟體開發目錄規範來封裝) 今日內容詳解 1.絕對導入和相對導入 PS:只要存在 ...
  • 預設參數的坑 定義一個函數,傳入一個list,添加一個end再返回 def add_end(L=[]): L.append('END') return L 正常調用時,結果似乎不錯 print (add_end([1,2,3])) #[1, 2, 3, 'END'] 使用預設參數調用時,一開始結果也 ...
  • 作為JAVA開發中最典型的異常類型,甚至可能是很多程式員入行之後收到的第一份異常大禮包類型,NullPointException也似乎成為了一種魔咒,應該如何去打破呢?一起來探討下吧 ...
  • 總結:Java的Stack嚴格意義來說並不能說是Stack,因為它通過直接繼承Vector類,繼承了Vector所有的公有方法,它是一個擁有所有Vector容器方法的棧! @SuppressWarnings 該批註的作用是給編譯器一條指令,告訴它對被批註的代碼元素內部的某些警告保持靜默。 | all ...
  • 數組和結點這兩種數據結構之間的差異,決定了LinkedList相比ArrayList擁有更高的插入和刪除效率,而隨機訪問效率不如ArrayList。 transient transient只能用來修飾成員變數(field),被transient修飾的成員變數不參與序列化過程。 序列化: JVM中的J ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...