Docker-mongodb副本集

本文最后更新于:2022年6月12日 晚上

Docker-mongodb副本集

注: 已经过实测,如果启动失败,注意权限问题。

虽然是创建mongodb副本集,其实第一步就是mongodb的docker安装。

副本集创建-配置

一台作为主库,其他两台作为副本。

宿主机创建待映射目录

1
2
3
mkdir -p /mnt/environment/mongodb/2701{7,8,9}/data
mkdir -p /mnt/environment/mongodb/2701{7,8,9}/conf
mkdir -p /mnt/environment/mongodb/2701{7,8,9}/log

宿主机新建配置文件

1
2
3
vim /mnt/environment/mongodb/27017/conf/mongodb.conf
vim /mnt/environment/mongodb/27018/conf/mongodb.conf
vim /mnt/environment/mongodb/27019/conf/mongodb.conf

各配置文件新增如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#端口
port=27017
#数据库文件存放目录
dbpath=/data/db
#日志文件存放路径,******日志切记设置权限,权限,权限,不然会一直启动失败(正常是不需要的因为我宿主机所有文件放在了etc目录,所以会出现各种权限问题)******
logpath=/var/log/mongodb/mongod.log
#使用追加方式写日志
logappend=true
#以守护线程的方式运行,创建服务器进程,******以守护线程运行日志,导致主进程退出,暂未找到原因******
#fork=true
#最大同时连接数
maxConns=100
#每次写入会记录一条操作日志
journal=true
#存储引擎有mmapv1、wiredTiger、mongorocks
storageEngine=wiredTiger
#访问IP
bind_ip=0.0.0.0
# 副本集名称
replSet=test
#不启用验证
noauth=true
#auth=true
#keyFile=/data/configdb/keyfile

副本集创建-启动

  1. 通过不同的容器名称,映射不同的端口和挂载不同的目录,分别启动三个mongodb实例:
1
2
3
4
5
6
# mongodb1,端口号:27017
docker run -d --privileged -p 27017:27017 -v /etc/localtime:/etc/localtime -v /mnt/environment/mongodb/27017/data:/data/db -v /mnt/environment/mongodb/27017/conf:/data/configdb -v /mnt/environment/mongodb/27017/log:/var/log/mongodb/ --name mongodb1 mongo:latest -f /data/configdb/mongodb.conf
# mongodb2,端口号:27018
docker run -d --privileged -p 27018:27017 -v /etc/localtime:/etc/localtime -v /mnt/environment/mongodb/27018/data:/data/db -v /mnt/environment/mongodb/27018/conf:/data/configdb -v /mnt/environment/mongodb/27018/log:/var/log/mongodb/ --name mongodb2 mongo:latest -f /data/configdb/mongodb.conf
# mongodb3,端口号:27019
docker run -d --privileged -p 27019:27017 -v /etc/localtime:/etc/localtime -v /mnt/environment/mongodb/27019/data:/data/db -v /mnt/environment/mongodb/27019/conf:/data/configdb -v /mnt/environment/mongodb/27019/log:/var/log/mongodb/ --name mongodb3 mongo:latest -f /data/configdb/mongodb.conf
  1. 进入其中一台,配置副本集信息,本次进入mongodb1。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
docker exec -it mongodb1 bash
# 因为配置设置了noauth=true,所以暂时不需要密码可直接进入mongodb控制台
mongo
# 输入以下内容
####注即便是本地,ip也不能直接写localhost,如果是虚拟机,切记查看虚拟机IP,
rsconf = {
_id: "test",
members: [
{
_id: 0,
host: "127.0.0.1:27018",
priority:3
},
{
_id: 1,
host: "127.0.0.1:27019",
priority:1
},
{
_id: 2,
host: "127.0.0.1:27020",
priority:1
}
]
}

rs.initiate(rsconf)
  1. 退出重启数据库,然后进入查看是否配置成功,忘记截图(懒)。
1
2
3
4
5
rs.conf();
# 最后输出json对象,里边会出现primary(主库)或者secondary(副本)字样
db.ismaster()
# 会输出true或者false字样
# 同时mongo进入控制台,开头字样会变为:xxx:primary>或者xxx:secodary>
  1. 开启身份认证

切换到admin数据库,添加的账号才是管理员账号。

用户只能在用户所在数据库登录,包括管理员账号。

管理员可以管理所有数据库,但是不能直接管理其他数据库,要先在admin数据库认证后才可以。

以下账号不能操作其他库:这是因为给root授权的userAdminAnyDatabase权限只是针对用户管理的,对其它的表示没有操作权限的。

因为对权限这里还不是很熟,故直接创建超级用户。

1
2
3
4
5
6
7
8
use admin
db.createUser(
{
user: "root",
pwd: "root",
roles: [ { role: "root", db: "admin" } ]
}
);

可以使用该命令给用户增加权限db.grantRolesToUser("root", ["xxxxxx"])

配置文件打开#启用验证,注掉#不启用验证,并设置keyFile路径。

1
2
3
4
#不启用验证
#noauth=true
auth=true
keyFile=/data/configdb/keyfile

在宿主机映射的conf目录生成keyfile文件(任意目录都可以,映射到容器里就行,20可以随意填写,不需要必须20),切记keyfile文件权限必须是600,新版是400,否则启动失败。

1
2
openssl rand -base64 20 > keyfile
chmod 600 keyfile 或者 chmod 400 keyfile

重启,如果上步创建的不是超级用户,需要给用户添加集群的权限,否则创建的用户无法操作。

1
2
use admin
db.grantRolesToUser("root", ["clusterAdmin"])

至此,副本集搭建完成。

额外配置

以下配置看自己情况。

设置主写完,得到所有副本确认才算成功。

默认配置 {“w”:1},这样表示主节点写入数据成功即可给客户端返回成功,“w” 配置为2,则表示除了主节点,还需要收到其中一个副本节点返回写入成功,“w” 还可以配置为 “majority”,表示需要集群中大多数承载数据且有选举权限的节点返回写入成功。

1
2
3
4
5
6
7
8
9
10
11
12
13
db.adminCommand({
"setDefaultRWConcern" : 1,
"defaultWriteConcern" : {
"w" : "majority"
},
"defaultReadConcern" : { "level" : "majority" }
})

**********************已弃用***************************
cfg = rs.conf()
cfg.settings.getLastErrorDefaults = { w: "majority", wtimeout: 5000 }
rs.reconfig(cfg)
*******************************************************

以下两种读取方式来自自己测试,并未找到相关文档说明:

查看自定义的:db.adminCommand(“getDefaultRWConcern”)。

查看默认的:rs.conf()。

springboot整合

只需修改平常的配置为如下:

1
2
3
4
5
6
# readPreference设置从副本读,但是实验下来,资源紧张,主库也会参与读操作
# 注意ip
spring:
data:
mongodb:
uri: mongodb://root:root@127.0.0.1:27017,127.0.0.1:27018,127.0.0.1:27019/living_circle?authSource=admin&replicaSet=test&readPreference=secondaryPreferred

Docker-mongodb副本集
http://www.muzili.ren/2022/06/12/Docker-mongodb副本集/
作者
jievhaha
发布于
2022年6月12日
许可协议