这次的所有操作都在windows上进行,linux是同样的原理。
先编写三个mongod.cfg
假设mongo安装在D:\Program Files\mongodb\server\4.2目录
mongod.cfg:
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
storage:
dbPath: D:\Program Files\mongodb\server\4.2\data
journal:
enabled: true
# engine:
# mmapv1:
# wiredTiger:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: D:\Program Files\mongodb\server\4.2\log\mongod.log
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0
#processManagement:
#security:
#authorization: enabled
#keyFile: D:\Program Files\mongodb\server\4.2\mongo_key
#operationProfiling:
# replSetName所属副本集的名称,副本集中的所有主机必须使用相同的集名称
replication:
replSetName: rs0
#sharding:
## Enterprise-Only Options:
#auditLog:
#snmp:
其余两个mongod.cfg中仅修改几个地方:
dbPath: D:\Program Files\mongodb\server\4.2\data
path: D:\Program Files\mongodb\server\4.2\log\mongod.log
port: 27017
切记:replSetName必须设置成相同的,若未设置,将不会以副本集方式启动
# replSetName所属副本集的名称,副本集中的所有主机必须使用相同的集名称
replication:
replSetName: rs0
启动:
mongod.exe --config mongod.cfg
mongod.exe --config mongod2.cfg
mongod.exe --config mongod3.cfg
若我的ip是192.168.1.888
三个mongo是:
192.168.1.888:27017
192.168.1.888:27016
192.168.1.888:27015
进入mongo,host最好带上
mongo.exe --host 192.168.1.888 --port 27017
config = {_id:"liangqicong",members:[{ _id:0,host:"192.168.1.188:27017" },{ _id:1,host:"192.168.1.188:27016" },{ _id:2,host:"192.168.1.188:27015" }]}
rs.initiate(config);
rs.status() #查看mongo副本集状态
讲解:rs.conf()中每项的意思
{
"_id" : "rs0",#MongoDB副本集名称
"version" : 135972,
"protocolVersion" : NumberLong(1),
"writeConcernMajorityJournalDefault" : true,
"members" : [#副本集成员
{
"_id" : 0,
"host" : "192.168.1.183:27017",//host,mongo实例的ip,可以为域名
"arbiterOnly" : false,#是否是仲裁者,不保存数据,只参与选举
"buildIndexes" : true,#是否在mongo上建立索引
"hidden" : false,#是否隐藏该实例,如果设置为true,将不能读取数据库,该成员有投票权
"priority" : 10,#优先级,priority和votes的具体讲解在下面,着重将这个
"tags" : {
},
"slaveDelay" : NumberLong(0),#延迟多久同步
"votes" : 1#投票数
},
{
"_id" : 1,
"host" : "192.168.1.183:27015",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 0,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 0
},
{
"_id" : 2,
"host" : "ngrok.viatank.com:5555",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 0,
"tags" : {
},
"slaveDelay" : NumberLong(0),
"votes" : 0
}
],
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : 2000,
"heartbeatTimeoutSecs" : 10,
"electionTimeoutMillis" : 10000,
"catchUpTimeoutMillis" : -1,
"catchUpTakeoverDelayMillis" : 30000,
"getLastErrorModes" : {
},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("5f35ed66c17c49c0519d52c3")
}
}
cfg = rs.conf()
cfg.members[0].priority = 5
cfg.members[1].votes = 0
rs.reconfig(cfg)
切记,不要在数据库中直接修改replset,同步会有问题的
rs.slaveOk()
对于当前会话,此命令允许从非主实例(即从属或辅助实例)读取操作
题外话:有很多客户端,需要重新连接后才能看见数据,因为每一次连接是一次会话。而如果不重新连接,是无法有读取操作
文档:https://docs.mongodb.com/manual/reference/replica-configuration/index.html
https://mongodb-documentation.readthedocs.io/en/latest/