官方文档:https://docs.mongodb.com/manual/replication/
安装配置
安装MongoDB 3.6.9
$ echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.6 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.6.list
$ sudo apt-get update
$ sudo apt-get install mongodb-org
添加配置
$ sudo vi /etc/mongo.conf
replication:
oplogSizeMB: 2048
replSetName: rs0
启动数据库
$ mongod -f /etc/mongo.conf
添加集群信息
一个主节点,一个从节点,一个仲裁节点
$ mongo
>cfg={ _id:"rs0", members:[ {_id:0,host:'192.168.56.100:27017',priority:2}, {_id:1,host:'192.168.56.101:27017',priority:1}, {_id:2,host:'192.168.56.102:27017',arbiterOnly:true}] };
>rs.initiate(cfg)
主节点权重稍微提高一点
初始化完成后,从节点自动同步主节点的所有数据
设置从节点可读
避免每次使用mongo client登录都需要设置,这里直接配置文件
$ vi ~/.mongorc.js
rs.slaveOk();
KeyFile权限配置
集群内部访问通过KeyFile
生成keyfile, MongoDb支持6~1024长度,文件权限需要修改为600
openssl rand -base64 567 > /var/lib/mongodb/keyfile
chmod 600 /var/lib/mongodb/keyfile
添加配置文件
security:
authorization: enabled
clusterAuthMode: keyFile
keyFile: /var/lib/mongodb/keyfile
MongoDB副本集-失效备援后的回滚
当主节点挂掉后,从节点升级为主节点承载读写操作,这时可能会存在没有同步到从节点的写操作。
当老主节点恢复后,会废弃掉这些操作,并在dbPath目录下产生一个rollback/目录,存储这部分操作为bson文件,可人工用bsondump/mongorestore等方式导入主节点
如何避免,参考MongoDb Write Concern: https://docs.mongodb.com/manual/core/replica-set-write-concern/
注:如果只有一个mongodb存活,则降级为secondary,不可写
主从切换
Spring boot 连接mongoDB副本集配置多节点地址
spring.data.mongodb.uri=mongodb://host1:port2,host2:port2/million?replcaSet=_rsName_
可能会产生connector切换,如果副本集配置的members host是内网地址,则要求driver也在内网,否则切换不成功,报connect timeout错误。(估计connector切换是读取的mongo副本集配置,而不是读取driver配置的地址)
外网调试,则直接连接主节点的外网地址
命令参考
降级
rs.stepDown()
添加成员
rs.add({host:"localhost:27017"})
// 添加arbiter
rs.add({host:"localhost:27017",arbiterOnly:true})
// 或者
rs.addArb({host:"localhost:27017"})
移除成员
rs.remove({host:"localhost:27017"})
修改优先级
var config=rs.config()
config.members[2].priority=2
rs.reconfig(config)
更多信息
隐藏节点,延迟节点等