MongoDB - 副本集

1.Docker部署MongoDB副本集

1.1 创建docker桥接网络(非必须)
sudo docker network create mongo-rs
1.2 启动3个MongoDB实例,注意要指定上一步创建的桥接网络 (非必须)
sudo docker run --name mongo1 --net mongo-rs -p 27011:27017 -v /data/db/mongo1:/data/db -d mongo:4.0.4 --replSet "rs0"
sudo docker run --name mongo2 --net mongo-rs -p 27012:27017 -v /data/db/mongo2:/data/db -d mongo:4.0.4 --replSet "rs0"
sudo docker run --name mongo3 --net mongo-rs -p 27013:27017 -v /data/db/mongo3:/data/db -d mongo:4.0.4 --replSet "rs0"

更多参数说明参考docker hub

1.3 通过docker进入其中一个容器
sudo docker exec -it mongo1 /bin/bash
1.4 然后使用容器中的mongo客户端连接MongoDB服务,再执行副本集初始化命令
rs.initiate({
     _id:"rs0",
     members:[
         {_id:1,host:"mongo1:27017"},
         {_id:2,host:"mongo2:27017"},
         {_id:3,host:"mongo3:27017"}
     ]
})

如果副本集希望给宿主机外部环境使用,请使用宿主机ip及相应实例的映射端口作为host,如:

rs.initiate({
     _id:"rs0",
     members:[
         {_id:1,host:"172.18.20.35:27011"},
         {_id:2,host:"172.18.20.35:27012"},
         {_id:3,host:"172.18.20.35:27013"}
     ]
})
1.5 初始化成功以后,会显示以下结果
{
    "ok" : 1,
    "operationTime" : Timestamp(1541000706, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1541000706, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}

这一步完成以后,MongoDB副本集就完成初始化了。另外,命令行提示也变成了rs0:SECONDARY>

特别需要注意的是SECONDARY节点默认情况下不能读写,每次连接到SECONDARY节点都需要设定slaveOk为true。

rs0:SECONDARY> rs.slaveOk()
rs0:SECONDARY> rs.slaveOk()
rs0:PRIMARY>

不过最新版的MongoDB中已经不需要这么操作了,rs.slaveOk()也已经废弃了,直接退出重新进入,就是PRIMARY。

副本集初始化完成以后,可以使用rs.conf()查看配置,rs.status()查看状态。

更多的副本集相关命令可以通过rs.help()查看。

2.MongoDB副本集配置安全认证

以上操作部署的副本集,并没有启用安全认证,还是存在比较大的风险。

2.1 设置管理员账号
rs:PRIMARY> use admin
switched to db admin
rs:PRIMARY> db.createUser({user:"admin",pwd:"123456",roles:["userAdminAnyDatabase"]})
Successfully added user: { "user" : "admin", "roles" : [ "userAdminAnyDatabase" ] }
rs:PRIMARY> show users
{
        "_id" : "admin.admin",
        "userId" : UUID("cb06641e-265e-472a-9752-6050d39bf6d7"),
        "user" : "admin",
        "db" : "admin",
        "roles" : [
                {
                        "role" : "userAdminAnyDatabase",
                        "db" : "admin"
                }
        ],
        "mechanisms" : [
                "SCRAM-SHA-1",
                "SCRAM-SHA-256"
        ]
}

2.2 准备security.keyFile
sudo openssl rand -base64 128 > mongo.key & sudo cp mongo.key /data/configdb/
2.3 准备配置文件
net:
  port: 27017
  bindIp: 0.0.0.0
systemLog:
  logAppend: true
security:
  keyFile: "/data/configdb/mongo.key"
  authorization: enabled
replication:
  replSetName: "rs"
2.4 重新运行新的容器

停止并移除原来的mongo容器,保留数据库文件

docker run --name mongo -p 27011:27017 -v /data/configdb:/data/configdb -v /data/db/mongo:/data/db -d mongo:4.4.4 --config /data/configdb/mongod.conf
2.5 进入容器设置其他用户账号
docker exec -it mongo bash
mongo -u admin -p 123456 --authenticationDatabase "admin"
rs:PRIMARY> use some-db
switched to db some-db
rs:PRIMARY> db.createUser({user: "app", pwd: "secret", roles: ["readWrite"]})
Successfully added user: { "user" : "app", "roles" : [ "readWrite" ] }

这一步切换到some-db这个数据库下,并且创建了一个具有“readWrite”角色的用户“app”,后续如果想对some-db进行常规的读写操作,就可以使用app这个用户了。

需要注意的是一定要指定认证的数据库

mongo 192.168.1.100:27011 -u app -p secret --authenticationDatabase "some-db"
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. 副本集概述 某些情况下,副本可以提供更高的读取容量,就像客户端可以发送读操作到不同的服务器。在不同数据中心维...
    LLLeon阅读 13,565评论 2 7
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 32,177评论 2 89
  • mongodb副本集即客户端连接到整个副本集,不关心具体哪一台机器是否挂掉。主服务器负责整个副本集的读写,副本集定...
    yaya520阅读 11,963评论 0 4
  • MongoDB副本集相关命令 1 - 配置副本集 启动相关mongod进程配置文件需要添加 replSet=xxx...
    iEpacJ阅读 9,697评论 0 1
  • 有事做,有人爱,有所期待,人的三个幸福点所在。 那,想一想,现阶段的你,有哪些事情可以去做?有哪些人可以去爱?有什...
    卖女孩de小火柴阅读 421评论 0 0

友情链接更多精彩内容