环境
- MongoDB 版本:4.0
- 操作系统:Windows 10 (因为只有一台机器,所以会采用多实例来记录)
- 三个节点结构如下图:
要求
1 个 Primary 节点,2 个 Secondary 节点,其中 1 个 Secondary 节点作为 Arbiter(仲裁) 节点。
三个节点的配置文件
primary
replSet = rs0
# 端口
port = 27017
# 日志
logpath = D:Program FilesMongoDBServerreplsetPrimarylogmongodb.log
# 数据库
dbpath = D:Program FilesMongoDBServerreplsetPrimarydata
secondary-1
replSet = rs0
# 端口
port = 27018
# 日志
logpath = D:Program FilesMongoDBServerreplsetSecondary1logmongodb.log
# 数据库
dbpath = D:Program FilesMongoDBServerreplsetSecondary1data
secondary-2 —— 作为仲裁(Arbiter)节点
replSet = rs0
# 端口
port = 27019
# 日志
logpath = D:Program FilesMongoDBServerreplsetSecondary2logmongodb.log
# 数据库
dbpath = D:Program FilesMongoDBServerreplsetSecondary2data
其实三个配置文件除了端口号其他都一样。这里我选择了?29031?作为 Primary 节点 。
启动三个节点
分别进入三个?MongoDB?主程序的?bin?目录 然后对应分别执行下面的三句命令:
F:replSetprimarybin> mongod -f ../primary.ini F:replSetsecondary-1bin> mongod -f ../secondary-1.ini F:replSetsecondary-2bin> mongod -f ../secondary-2.ini
配置 Primary 节点
config_rs0 = {_id : "rs0",members : [ { _id:0,host:"localhost:27017",priority:1 },{ _id:1,host:"localhost:27018",{ _id:2,host:"localhost:27019",priority:1,"arbiterOnly": true } ]} rs.initiate(config_rs1)
进入?primary?节点的?bin?目录打开控制台通过命令:mongo --port 27017 连接到 primary 节点。分别执行以上两行命令。看到如下图信息表示配置成功:
注意事项
默认只可以从 primary 节点读写数据,secondary 节点不支持读写,在 secondary 节点执行 rs.slaveOk() 命令可让 secondary 节点支持读写。?
其他
- 生产环境中应该还有一个仲裁节点,它不接受复制的数据。当 primary 节点出现问题(如:宕机)之后,它会从新选出一个 secondary 节点作为 primary 节点,以保证生产线不会出问题。原来的 primary 节点修复后将做为 secondary 节点存在。
- 单机配置复制集时,MongoDB 添加仲裁节点时 host 不能用 localhost 这个主机名 ,否则会提示重复的主机名(Duplicate host names)错误。解决办法就是文章开头说的在 hosts 做个映射。