本篇文章介绍 MongoDB ReplicaSet 如何搭建,及常用的维护方法。
单机 MongoDB 安装部署,可参考 MongoDB 单机部署 文档。
IP | Hostname | Role |
---|---|---|
172.16.104.55 | 172-16-104-55 | PRIMARY |
172.16.104.56 | 172-16-104-56 | SECONDARY |
172.16.104.57 | 172-16-104-57 | SECONDARY |
配置 /etc/hosts 映射:
172.16.104.57 172-16-104-57
172.16.104.56 172-16-104-56
172.16.104.55 172-16-104-55
通过密钥文件身份验证, mongod 副本集中的每个实例都使用密钥文件的内容作为共享密码来对部署中的其他成员进行身份验证。只有 mongod 具有正确密钥文件的实例才能加入副本集。
在主节点生成密钥,可通过下方命令完成:
openssl rand -base64 756 > /data/mongodb/data/keyFile
chmod 400 /data/mongodb/data/keyFile
然后将密钥文件,scp 到其他节点的相同目录下:
scp /data/mongodb/data/keyFile [email protected]:/data/mongodb/data/keyFile
记得调整文件属组:
chown mongod:mongod /data/mongodb/data/keyFile
在原来的配置文件基础上,需要添加如下内容:
security:
keyFile: <path-to-keyfile>
replication:
replSetName: <replicaSetName>
keyFile 就是刚才生产密钥的文件路径,replSetName 是集群的名称,3 台实例都需要配置。
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /data/mongodb/logs/mongod.log
# Where and how to store data.
storage:
dbPath: /data/mongodb/data
journal:
enabled: true
# how the process runs
processManagement:
fork: true # fork and run in background
pidFilePath: /data/mongodb/run/mongod.pid # location of pidfile
replication:
replSetName: myReplSet
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0 # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.
security:
authorization: enabled
keyFile: /data/mongodb/data/keyFile
配置修改完成后,重启 3 台实例。
rs.initiate(
{
_id : "myReplSet",
members: [
{ _id : 0, host : "172-16-104-55:27017" },
{ _id : 1, host : "172-16-104-56:27017" },
{ _id : 2, host : "172-16-104-57:27017" }
]
}
)
查看 ReplicaSet 状态:
rs.status()
如果集群成员都正常,那 infoMessage 为空。
rs.add("172-16-104-57:27017")
新增节点的数据会自动同步,分为两个阶段 Initial Sync 和 Replication,先通过 init sync 同步全量数据,再通过 replication 不断重放 Primary 上的 oplog 同步增量数据。
另外,当创建副本集节点数比较多的时候,主节点需要每次需要心跳检测来判断自己是否符合 “大多数”。这种情况下,心跳的网络流量和选举所花费的时间都会比较大。为避免这种情况我们可以指定某几个节点具体选举的权利。
rs.add({"_id":4,"host":"xx:xx","votes":0})
rs.remove("172-16-104-57:27017")
将主节点降级为副本节点,触发选举且原主节点不会被选为主。
rs.stepDown(stepDownSecs, secondaryCatchUpPeriodSecs)
当一个节点维护的时候,使用下方命令阻止其在一定时间内,不会被选为主节点。
rs.freeze()
副本节点默认不允许执行操作,执行命令会报错 not master and slaveOk=false
可使用下方命令,允许副本节点只读。
rs.secondaryOk()
可使用下方命令查看备节点延迟:
db.printSecondaryReplicationInfo()
MongoDB 连接串参数,支持指定多个副本集节点,可通过 readPreference 分配读写。
推荐阅读:https://www.mongodb.com/docs/manual/reference/method/js-replication/