本文最后更新于:2022年6月12日 晚上
Docker-mongodb副本集
注: 已经过实测,如果启动失败,注意权限问题。
虽然是创建mongodb副本集,其实第一步就是mongodb的docker安装。
副本集创建-配置 一台作为主库,其他两台作为副本。
宿主机创建待映射目录 1 2 3 mkdir -p /mnt/environment/mongodb/2701 {7 ,8 ,9 }/datamkdir -p /mnt/environment/mongodb/2701 {7 ,8 ,9 }/confmkdir -p /mnt/environment/mongodb/2701 {7 ,8 ,9 }/log
宿主机新建配置文件 1 2 3 vim /mnt/ environment/mongodb/ 27017 /conf/m ongodb.conf vim /mnt/ environment/mongodb/ 27018 /conf/m ongodb.conf vim /mnt/ environment/mongodb/ 27019 /conf/m ongodb.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/dblogpath =/var/log/mongodb/mongod.loglogappend =true maxConns =100 journal =true storageEngine =wiredTigerbind_ip =0.0 .0.0 replSet =testnoauth =true
副本集创建-启动
通过不同的容器名称,映射不同的端口和挂载不同的目录,分别启动三个mongodb实例:
1 2 3 4 5 6 docker run -d --privileged -p 27017 :27017 -v /etc/ localtime:/etc/ localtime -v /mnt/ environment/mongodb/ 27017 /data:/ data/db -v /m nt/environment/m ongodb/27017/ conf:/data/ configdb -v /mnt/ environment/mongodb/ 27017 /log:/ var/log/m ongodb/ --name mongodb1 mongo:latest -f / data/configdb/m ongodb.conf docker run -d --privileged -p 27018 :27017 -v /etc/ localtime:/etc/ localtime -v /mnt/ environment/mongodb/ 27018 /data:/ data/db -v /m nt/environment/m ongodb/27018/ conf:/data/ configdb -v /mnt/ environment/mongodb/ 27018 /log:/ var/log/m ongodb/ --name mongodb2 mongo:latest -f / data/configdb/m ongodb.conf docker run -d --privileged -p 27019 :27017 -v /etc/ localtime:/etc/ localtime -v /mnt/ environment/mongodb/ 27019 /data:/ data/db -v /m nt/environment/m ongodb/27019/ conf:/data/ configdb -v /mnt/ environment/mongodb/ 27019 /log:/ var/log/m ongodb/ --name mongodb3 mongo:latest -f / data/configdb/m ongodb.conf
进入其中一台,配置副本集信息,本次进入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 2 3 4 5 rs.conf(); # 最后输出json 对象,里边会出现primary (主库)或者secondary(副本)字样 db.ismaster() # 会输出true 或者false 字样 # 同时mongo进入控制台,开头字样会变为:xxx:primary >或者xxx:secodary>
开启身份认证
切换到admin数据库,添加的账号才是管理员账号。
用户只能在用户所在数据库登录,包括管理员账号。
管理员可以管理所有数据库,但是不能直接管理其他数据库,要先在admin数据库认证后才可以。
以下账号不能操作其他库:这是因为给root授权的userAdminAnyDatabase权限只是针对用户管理的,对其它的表示没有操作权限的。
因为对权限这里还不是很熟,故直接创建超级用户。
1 2 3 4 5 6 7 8 use admindb .createUser( { user: "root" , pwd : "root" , roles: [ { role: "root" , db : "admin" } ] } );
可以使用该命令给用户增加权限db.grantRolesToUser("root", ["xxxxxx"]) 。
配置文件打开#启用验证,注掉#不启用验证,并设置keyFile路径。
1 2 3 4 auth =true keyFile =/data/configdb/keyfile
在宿主机映射的conf目录生成keyfile文件(任意目录都可以,映射到容器里就行,20可以随意填写,不需要必须20),切记keyfile文件权限必须是600,新版是400 ,否则启动失败。
1 2 openssl rand -base64 20 > keyfilechmod 600 keyfile 或者 chmod 400 keyfile
重启,如果上步创建的不是超级用户,需要给用户添加集群的权限,否则创建的用户无法操作。
1 2 use admindb .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: