Docker MongoDB 集群搭建


簡單地在Docker環境上搭建一個無認證的MongoDB集群。
1.本文使用的容器
集群角色  ContainerName     IP:port
Config Server   cfg_1        10.1.1.2:27019
Config Server   cfg_2        10.1.1.3:27019
Config Server   cfg_3        10.1.1.4:27019
Shard Server   shard1_1     10.1.1.5:27018
Shard Server   shard1_2     10.1.1.6:27018
Shard Server   shard1_3     10.1.1.7:27018
Shard Server   shard2_1     10.1.1.8:27018
Shard Server   shard2_2     10.1.1.9:27018
Shard Server   shard2_3     10.1.1.10:27018
Shard Server   shard3_1     10.1.1.11:27018
Shard Server   shard3_2     10.1.1.12:27018
Shard Server   shard3_3     10.1.1.13:27018
Mongos       mongos_1     10.1.1.14:27020
Mongos      mongos_2      10.1.1.15:27020
Mongos       mongos_3     10.1.1.16:27020

2. 從Docker Hub上拉取MongoDB鏡像
docker pull mongo:4.0.0

3. Docker網絡配置 為MongoDB集群創建獨立的docker網橋
docker network create --subnet=10.1.1.0/24 mongodb0

4. 准備MongoDB集群配置文件
准備Docker掛載的目錄
mkdir -p /home/dmc/configsvr
mkdir -p /home/dmc/shard1
mkdir -p /home/dmc/shard2
mkdir -p /home/dmc/shard3
mkdir -p /home/dmc/mongos

Config-Server 配置文件
路徑:vim /home/dmc/configsvr/mongod.conf
說明:MongoDB v3.4 之后要求Config-Server也需要組成副本集形式
storage:
dbPath: /data/db
journal:
enabled: true
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
net:
bindIp: 127.0.0.1
processManagement:
timeZoneInfo: /usr/share/zoneinfo
replication:
replSetName: cfg
sharding:
clusterRole: configsvr

Shard-Server 配置文件
路徑:vim /home/dmc/shard1/mongod.conf
說明:此處配置3個分片為shard1,shard2,shard3;每個分片都需要組成副本集。
shard2,shard3目錄下配置文件同名,修改replSetName字段的值分別為’shard2’和’shard3’
storage:
dbPath: /data/db
journal:
enabled: true
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
net:
bindIp: 127.0.0.1
processManagement:
timeZoneInfo: /usr/share/zoneinfo
replication:
replSetName: shard1
sharding:
clusterRole: shardsvr

Mongos 配置文件
路徑:/home/dmc/mongos/mongos.conf
說明:mongos不需要存儲因此去掉storage字段;可任意配置net.port字段,
需要指定processManagement.fork為true以–fork方式啟動;
sharding.configDB字段用於指定Config-Server集群地址,
格式為[replSetName]/[config-server1:port],[config-server2:port],[config-server3:port]…
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongos.log
net:
port: 27020
bindIp: 127.0.0.1
processManagement:
fork: true
timeZoneInfo: /usr/share/zoneinfo
sharding:
configDB: cfg/10.1.1.2:27019,10.1.1.3:27019,10.1.1.4:27019

5. 啟動Docker容器 啟動3個Config-Server容器:
docker run -d --name=cfg_1 --network=mongodb0 --ip=10.1.1.2 -v /home/dmc/configsvr:/etc/mongodb mongo:latest -f /etc/mongodb/mongod.conf
docker run -d --name=cfg_2 --network=mongodb0 --ip=10.1.1.3 -v /home/dmc/configsvr:/etc/mongodb mongo:latest -f /etc/mongodb/mongod.conf
docker run -d --name=cfg_3 --network=mongodb0 --ip=10.1.1.4 -v /home/dmc/configsvr:/etc/mongodb mongo:latest -f /etc/mongodb/mongod.conf

進入其中一個容器配置Config-Server副本集:
# 宿主機
docker exec -it cfg_1 bash
# 容器中
mongo --port 27019
# Mongo Shell中
rs.initiate({
"_id":"cfg",
"members":[
{
"_id":0,
"host":"10.1.1.2:27019"
},
{
"_id":1,
"host":"10.1.1.3:27019"
},
{
"_id":2,
"host":"10.1.1.4:27019"
}
]
})

啟動3*3個Shard-Server容器:說明:分片服務器啟動后默認是以27018作為端口。
# 啟動第一個分片 - shard1
docker run -d --name=shard1_1 --network=mongodb0 --ip=10.1.1.5 -v /home/dmc/shard1:/etc/mongodb mongo:latest -f /etc/mongodb/mongod.conf
docker run -d --name=shard1_2 --network=mongodb0 --ip=10.1.1.6 -v /home/dmc/shard1:/etc/mongodb mongo:latest -f /etc/mongodb/mongod.conf
docker run -d --name=shard1_3 --network=mongodb0 --ip=10.1.1.7 -v /home/dmc/shard1:/etc/mongodb mongo:latest -f /etc/mongodb/mongod.conf

進入其中一個容器配置Shard-Server副本集:
# 宿主機
docker exec -it shard1_1 bash
# 容器中
mongo --port 27018
# Mongo Shell中
rs.initiate({
"_id":"shard1",
"members":[
{
"_id":0,
"host":"10.1.1.5:27018"
},
{
"_id":1,
"host":"10.1.1.6:27018"
},
{
"_id":2,
"host":"10.1.1.7:27018"
}
]
})

# 啟動第二個分片 - shard2
docker run -d --name=shard2_1 --network=mongodb0 --ip=10.1.1.8 -v /home/dmc/shard2:/etc/mongodb mongo:latest -f /etc/mongodb/mongod.conf
docker run -d --name=shard2_2 --network=mongodb0 --ip=10.1.1.9 -v /home/dmc/shard2:/etc/mongodb mongo:latest -f /etc/mongodb/mongod.conf
docker run -d --name=shard2_3 --network=mongodb0 --ip=10.1.1.10 -v /home/dmc/shard2:/etc/mongodb mongo:latest -f /etc/mongodb/mongod.conf

進入其中一個容器配置Shard-Server副本集:
# 宿主機
docker exec -it shard2_1 bash
# 容器中
mongo --port 27018
# Mongo Shell中
rs.initiate({
"_id":"shard2",
"members":[
{
"_id":0,
"host":"10.1.1.8:27018"
},
{
"_id":1,
"host":"10.1.1.9:27018"
},
{
"_id":2,
"host":"10.1.1.10:27018"
}
]
})

# 啟動第三個分片 - shard3
docker run -d --name=shard3_1 --network=mongodb0 --ip=10.1.1.11 -v /home/dmc/shard3:/etc/mongodb mongo:latest -f /etc/mongodb/mongod.conf
docker run -d --name=shard3_2 --network=mongodb0 --ip=10.1.1.12 -v /home/dmc/shard3:/etc/mongodb mongo:latest -f /etc/mongodb/mongod.conf
docker run -d --name=shard3_3 --network=mongodb0 --ip=10.1.1.13 -v /home/dmc/shard3:/etc/mongodb mongo:latest -f /etc/mongodb/mongod.conf

進入其中一個容器配置Shard-Server副本集:
# 宿主機
docker exec -it shard3_1 bash
# 容器中
mongo --port 27018
# Mongo Shell中
rs.initiate({
"_id":"shard3",
"members":[
{
"_id":0,
"host":"10.1.1.11:27018"
},
{
"_id":1,
"host":"10.1.1.12:27018"
},
{
"_id":2,
"host":"10.1.1.13:27018"
}
]
})

啟動3個mongos服務器 說明:這里也使用了mongo鏡像,但是需要開啟mongos進程,mongod進程並不需要用到。
docker run -d --name=mongos_1 --network=mongodb0 --ip=10.1.1.14 -v /home/dmc/mongos:/etc/mongodb mongo:latest
docker run -d --name=mongos_2 --network=mongodb0 --ip=10.1.1.15 -v /home/dmc/mongos:/etc/mongodb mongo:latest
docker run -d --name=mongos_3 --network=mongodb0 --ip=10.1.1.16 -v /home/dmc/mongos:/etc/mongodb mongo:latest

進入每個容器中,啟動mongos進程(此處可以改進一下,自動運行mongos進程)
# 宿主機
docker exec -it mongos_1 bash
# 容器中
mongos -f /etc/mongodb/mongos.conf

可以就在其中一個mongos容器中使用mongo shell連接mongos進程配置分片集群
# 連接mongos,端口號與mongos配置文件中設定一致
mongo -port 27020
# 將分片加入集群
sh.addShard("shard1/10.1.1.5:27018,10.1.1.6:27018,10.1.1.7:27018")
sh.addShard("shard2/10.1.1.8:27018,10.1.1.9:27018,10.1.1.10:27018")
sh.addShard("shard3/10.1.1.11:27018,10.1.1.12:27018,10.1.1.13:27018")

# 對數據庫開啟分片功能
sh.enableSharding("[dbName]")
# 對數據庫中集合開啟分片,並指定片鍵
sh.shardCollection("[dbName.collectionName]",{[keyName]:1})

6. 嘗試寫入數據觀察數據分塊
# 插入5百萬個簡單的文檔,耐心等待插入結束
for(var i=1;i<=5000000;i++){
db.coll1.insert({
name:i,
age:Math.round(Math.random() * 100),
score1:Math.round(Math.random() * 100),
score2:Math.round(Math.random() * 100),
score3:Math.round(Math.random() * 100),
score4:Math.round(Math.random() * 100),
score5:Math.round(Math.random() * 100)
});
}

# 查看分片狀態
sh.status()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM