【超詳細】手把手教你搭建MongoDB叢集 原 薦
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")
本文由育博學谷狂野架構師釋出 如果本文對您有幫助,歡迎關注和點贊;如果您有任何建議也可留言評論或私信,您的支援是我堅持創作的動力 轉載請註明出處!
- 爆肝整理5000字!HTAP的關鍵技術有哪些?| StoneDB學術分享會#3
- Java併發程式設計解析 | 基於JDK原始碼解析Java領域中ReentrantLock鎖的設計思想與實現原理 (一)
- 【程式碼級】全鏈路壓測的整體架構設計,以及5種實現方案(流量染色、資料隔離、介面隔離、零侵入、服務監...
- 電商行業:全鏈路監測廣告投放效果,用資料驅動業務增長
- 如何給玩偶建模並讓它跳個舞?
- 原來 Rust 當然 Lint 是這樣工作的
- 基於 Zadig 的 GitOps 實踐
- What's new in dubbo-go-pixiu 0.5.1
- 負載均衡原理分析與原始碼解讀
- 利用 SonarScanner 靜態掃描 Rainbond 上的 Maven 專案
- 分散式鏈路追蹤Jaeger 微服務Pig在Rainbond上的實踐分享
- 收藏!0基礎開源資料視覺化平臺FlyFish大屏開發指南
- 從開源的視角,解析SAP經典ERP “三十年不用變”的架構設計 薦 轉
- 從碼農轉型大音樂家,你需要這些音樂製作處理工具
- 五分鐘給你的 gRPC 服務加上 HTTP 介面
- 【詳細教程】一文參透MongoDB聚合查詢 原 薦
- 【超詳細】手把手教你搭建MongoDB叢集 原 薦
- 從伺服器到雲託管,到底經歷了什麼?
- 敏捷需求管理篇|如何從0-1寫好一個使用者故事
- go-zero微服務實戰系列(四、CRUD熱熱身)