[转载]Docker MongoDB v4.0.0 集群搭建

Docker MongoDB v4.0.0 集群搭建
简单地在Docker环境上搭建一个无认证的MongoDB集群。
本文基于CentOS 7.4,MongoDB版本为4.0.0,Docker版本为17.09.0-ce

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
1
3. Docker网络配置
为MongoDB集群创建独立的docker网桥

docker network create --subnet=10.1.1.0/24 mongodb0
 准备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 配置文件
路径:/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 配置文件
路径:/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:4.0.0 -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:4.0.0 -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:4.0.0 -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:4.0.0 -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:4.0.0 -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:4.0.0 -f /etc/mongodb/mongod.conf
1
2
3
4
进入其中一个容器配置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:4.0.0 -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:4.0.0 -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:4.0.0 -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:4.0.0 -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:4.0.0 -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:4.0.0 -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:4.0.0
docker run -d --name=mongos_2 --network=mongodb0 --ip=10.1.1.15 -v /home/dmc/mongos:/etc/mongodb mongo:4.0.0
docker run -d --name=mongos_3 --network=mongodb0 --ip=10.1.1.16 -v /home/dmc/mongos:/etc/mongodb mongo:4.0.0

进入每个容器中,启动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})

11
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()

 
Mongo Ops Manager对内存要求比较高,所以最终在虚拟机上没启动成功

mongodb-mms的安装与使用

服务器信息

ip系统配置目录版本
172.24.32.202 centos7.7 4c16g /opt/mongodb/mms/ 4.0.8

官网地址

https://docs.opsmanager.mongodb.com/v4.0/core/installation-checklist/

可以看到,对数据和快照的冗余性要求越高,即是对用于存储ops数据的db容灾性越高。
ops底层使用mongodb存储,所以使用多副本集加仲裁更好。

这里机器有限,使用单机版的mongodb作为底层存储

安装要求

虚拟机 配置 4c16
可以监控400台实例

1、安装mongodb,给mms存储数据

echo "[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mongodb/yum/el7-4.0/
gpgcheck=0
enabled=1" | sudo tee /etc/yum.repos.d/mongodb.repo
yum install -y mongodb-org mongodb-org-shell

创建application db的目录

mkdir -p /data/appdb
chown -R mongod:mongod /data/appdb

创建backup db的目录

mkdir -p /data/backup
chown -R mongod:mongod /data/backup
cp /etc/mongod.conf /etc/mongodapp.conf
cp /etc/mongod.conf /etc/mongodbackup.conf
cp /usr/lib/systemd/system/mongod.service /usr/lib/systemd/system/mongodapp.service
cp /usr/lib/systemd/system/mongod.service /usr/lib/systemd/system/mongodbackup.service

2、安装mms

下载ops安装包到/data目录

wget https://downloads.mongodb.com/on-prem-mms/rpm/mongodb-mms-4.0.18.50621.20200512T1431Z-1.x86_64.rpm

安装

rpm -ivh mongodb-mms-4.0.18.50621.20200512T1431Z-1.x86_64.rpm

启动

service mongodb-mms start

3、stmp安装

4、kmip

https://github.com/OpenKMIP/PyKMIP
pip install pykmip
git clone https://github.com/openkmip/pykmip.git
python pykmip/setup.py install

5、监控已经安装的集群

mms界面上点击添加已有服务的监控
在agent节点上执行

curl -OL http://172.24.32.202:8080/download/agent/automation/mongodb-mms-automation-agent-manager-5.4.24.5565-1.x86_64.rhel7.rpm
rpm -U mongodb-mms-automation-agent-manager-5.4.24.5565-1.x86_64.rhel7.rpm
vi /etc/mongodb-mms/automation-agent.config
mmsGroupId=5ec6338632ca5552d5595f73
mmsApiKey=5ec6570632ca5552d5596091f739ee7f079d460eb6eb3367ebd06b79
mmsBaseUrl=http://172.24.32.202:8080

启动和开机自启动

systemctl start mongodb-mms-automation-agent.service
systemctl enable mongodb-mms-automation-agent.service

自动发现创建用户

use admin
db.createUser({user: 'mms-automation', pwd: 'test123', roles: ['clusterAdmin', 'dbAdminAnyDatabase', 'readWriteAnyDatabase', 'restore', 'userAdminAnyDatabase']})

6、下载完整的 backup 镜像(分片模式取单一分片),并将其恢复到一个新的 mongod 实例中,并验证其中的数据.

mms开启备份,创建目录存放元数据

backup 
mkdir /data/backupDaemon
chown mongodb-mms:mongodb-mms /data/backupDaemon

在服务器172.24.32.202上新建一个mongo实例,mongodtest的数据存储
目录为

/data/mongorestore

去mms界面上面下载一个备份文件

lugotestrepl-1590130420-5ec7796d32ca5552d55da260.tar.gz

将文件传到172.24.32.202的/tmp目录下
解压并且赋权

tar zxf lugotestrepl-1590130420-5ec7796d32ca5552d55da260.tar.gz
chown -R mongod.mongod lugotestrepl-1590130420-5ec7796d32ca5552d55da260

将备份的数据覆盖进新的mongodtest实例

mv lugotestrepl-1590130420-5ec7796d32ca5552d55da260/* /data/mongorestore/

重启mongodtest实例

systemctl restart mongodtest

进入mongodtest实例,查看数据

mongo 127.0.0.1:23456

结果

> show dbs;
admin     0.000GB
config    0.000GB
local     0.000GB
lugotest  0.000GB
> use lugotest;
switched to db lugotest
> show dbs;
admin     0.000GB
config    0.000GB
local     0.000GB
lugotest  0.000GB
> show collections;
movie
test
> db.test.find();
{ "_id" : ObjectId("5ebe5eb9825f7f2e238543cf"), "id" : 9, "username" : "U" }
{ "_id" : ObjectId("5ebe5eb9825f7f2e238543d4"), "id" : 14, "username" : "U" }
{ "_id" : ObjectId("5ebe5eb9825f7f2e238543cd"), "id" : 7, "username" : "U" }
{ "_id" : ObjectId("5ebe5eb9825f7f2e238543c8"), "id" : 2, "username" : "U" }
{ "_id" : ObjectId("5ebe5eb9825f7f2e238543da"), "id" : 20, "username" : "U" }
{ "_id" : ObjectId("5ebe5eb9825f7f2e238543d7"), "id" : 17, "username" : "U" }
{ "_id" : ObjectId("5ebe5eb9825f7f2e238543cb"), "id" : 5, "username" : "U" }
{ "_id" : ObjectId("5ebe5eb9825f7f2e238543c9"), "id" : 3, "username" : "U" }
{ "_id" : ObjectId("5ebe5eb9825f7f2e238543d9"), "id" : 19, "username" : "U" }
{ "_id" : ObjectId("5ebe5eb9825f7f2e238543cc"), "id" : 6, "username" : "U" }
{ "_id" : ObjectId("5ebe5eb9825f7f2e238543d6"), "id" : 16, "username" : "U" }
{ "_id" : ObjectId("5ebe5eb9825f7f2e238543d0"), "id" : 10, "username" : "U" }
{ "_id" : ObjectId("5ebe5eb9825f7f2e238543c7"), "id" : 1, "username" : "U" }
{ "_id" : ObjectId("5ebe5eb9825f7f2e238543ce"), "id" : 8, "username" : "U" }
{ "_id" : ObjectId("5ebe5eb9825f7f2e238543ca"), "id" : 4, "username" : "U" }
{ "_id" : ObjectId("5ebe5eb9825f7f2e238543d2"), "id" : 12, "username" : "U" }
{ "_id" : ObjectId("5ebe5eb9825f7f2e238543d5"), "id" : 15, "username" : "U" }
{ "_id" : ObjectId("5ebe5eb9825f7f2e238543d1"), "id" : 11, "username" : "U" }
{ "_id" : ObjectId("5ebe5eb9825f7f2e238543d3"), "id" : 13, "username" : "U" }
{ "_id" : ObjectId("5ebe5eb9825f7f2e238543d8"), "id" : 18, "username" : "U" }
Type "it" for more
> it
{ "_id" : ObjectId("5ec65b424e9dd0a6b7d61d0c"), "id" : 1, "username" : "U" }
{ "_id" : ObjectId("5ec65b424e9dd0a6b7d61d0f"), "id" : 4, "username" : "U" }
{ "_id" : ObjectId("5ec65b424e9dd0a6b7d61d0d"), "id" : 2, "username" : "U" }
{ "_id" : ObjectId("5ec65b424e9dd0a6b7d61d0e"), "id" : 3, "username" : "U" }
{ "_id" : ObjectId("5ec65b424e9dd0a6b7d61d10"), "id" : 5, "username" : "U" }
{ "_id" : ObjectId("5ec66a9a2c5f4c03bf55e755"), "id" : 1, "username" : "U" }
{ "_id" : ObjectId("5ec66a9a2c5f4c03bf55e756"), "id" : 2, "username" : "U" }
{ "_id" : ObjectId("5ec66a9a2c5f4c03bf55e757"), "id" : 3, "username" : "U" }
{ "_id" : ObjectId("5ec66a9a2c5f4c03bf55e759"), "id" : 5, "username" : "U" }
{ "_id" : ObjectId("5ec66a9a2c5f4c03bf55e758"), "id" : 4, "username" : "U" }

发现数据一致



posted on 2021-12-28 18:07  白马酒凉  阅读(214)  评论(0编辑  收藏  举报

导航