为了节省资源,我这里在同一台电脑的不同目录来进行主从复制,这里至少需要建立一台主服务器,两台从服务器,这样在主服务器故障的时候,从服务器才能自动选举新的主服务器完成主从切换,如果只有一台主服务器和一台从服务器是无法实现主从切换的
1主数据库目录:D:\data,我在下面添加了log(日志)目录,还有db(数据库)目录,然后添加了配置文件.cfg文件
配置文件内容mongod.cfg,使用27018端口,然后分别设置了日志文件和数据文件的存放目录
# 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:\data\db
journal:
enabled: true
# engine:
# mmapv1:
# wiredTiger:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: D:\data\log\mongod.log
# network interfaces
net:
port: 27018
bindIp: 127.0.0.1
#processManagement:
#security:
#operationProfiling:
#replication:
#sharding:
## Enterprise-Only Options:
#auditLog:
#snmp:
2从数据库目录:D:\data1和D:\data2,我在下面添加了log(日志)目录,还有db(数据库)目录,然后添加了配置文件.cfg文件
两台从服务器配置文件内容mongod.cfg,分别使用27019和27020端口,然后分别设置了日志文件和数据文件的存放目录
# 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:\data1\db
journal:
enabled: true
# engine:
# mmapv1:
# wiredTiger:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: D:\data1\log\mongod.log
# network interfaces
net:
port: 27019
bindIp: 127.0.0.1
#processManagement:
#security:
#operationProfiling:
#replication:
#sharding:
## Enterprise-Only Options:
#auditLog:
#snmp:
# 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:\data2\db
journal:
enabled: true
# engine:
# mmapv1:
# wiredTiger:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: D:\data2\log\mongod.log
# network interfaces
net:
port: 27020
bindIp: 127.0.0.1
#processManagement:
#security:
#operationProfiling:
#replication:
#sharding:
## Enterprise-Only Options:
#auditLog:
#snmp:
3主数据库启动并且注册服务
mongod --confg "D:\data\mongod.cfg" --replSet rs0 --install
4从数据库启动并且注册服务
mongod --confg "D:\data1\mongod.cfg" --replSet rs0 --serviceName mongodb1 --serviceDisplayName mongodb1 --install
mongod --confg "D:\data1\mongod.cfg" --replSet rs0 --serviceName mongodb2 --serviceDisplayName mongodb2 --install
(注意)主数据库默认启动的服务名是mongodb,由于我是在同一台电脑上面建服务,所以从数据库的服务名要与主数据库服务名区分开来,这里从数据库的服务名是mongodb1和mongodb2
5登录数据库
在cmd命令窗口登录到其中一台数据库服务器,这里登录到27018端口的这台服务器
C:\Users\Administrator>mongo --port 27018
然后初始化,添加3台数据服务器成员
> rs.initiate({_id:"rs0",members:[{_id:0,host:"127.0.0.1:27018"},{_
id:1,host:"127.0.0.1:27019"},{_id:2,host:"127.0.0.1:27020"}]})
查看状态,这里关注里面的"stateStr"这个状态,决定着对应服务器成员是主状态还是从状态,这里可以看出当前端口27019这台数据库服务器是主服务器,其余两台都是从服务器
rs0:SECONDARY> rs.status()
{
"set" : "rs0",
"date" : ISODate("2019-01-15T03:09:20.366Z"),
"myState" : 2,
"term" : NumberLong(1),
"syncingTo" : "127.0.0.1:27019",
"syncSourceHost" : "127.0.0.1:27019",
"syncSourceId" : 1,
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1547521744, 1),
"t" : NumberLong(1)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1547521744, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1547521744, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1547521744, 1),
"t" : NumberLong(1)
}
},
"lastStableCheckpointTimestamp" : Timestamp(1547521730,
1),
"members" : [
{
"_id" : 0,
"name" : "127.0.0.1:27018",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 282,
"optime" : {
"ts" : Timestamp(1547521744, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2019-01-
15T03:09:04Z"),
"syncingTo" : "127.0.0.1:27019",
"syncSourceHost" : "127.0.0.1:27019",
"syncSourceId" : 1,
"infoMessage" : "",
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "127.0.0.1:27019",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 29,
"optime" : {
"ts" : Timestamp(1547521744, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1547521744, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2019-01-
15T03:09:04Z"),
"optimeDurableDate" : ISODate("2019-01-
15T03:09:04Z"),
"lastHeartbeat" : ISODate("2019-01-
15T03:09:18.656Z"),
"lastHeartbeatRecv" : ISODate("2019-01-
15T03:09:19.856Z"
),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1547521741,
1),
"electionDate" : ISODate("2019-01-
15T03:09:01Z"),
"configVersion" : 1
},
{
"_id" : 2,
"name" : "127.0.0.1:27020",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 29,
"optime" : {
"ts" : Timestamp(1547521744, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1547521744, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2019-01-
15T03:09:04Z"),
"optimeDurableDate" : ISODate("2019-01-
15T03:09:04Z"),
"lastHeartbeat" : ISODate("2019-01-
15T03:09:18.650Z"),
"lastHeartbeatRecv" : ISODate("2019-01-
15T03:09:18.632Z"
),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "127.0.0.1:27019",
"syncSourceHost" : "127.0.0.1:27019",
"syncSourceId" : 1,
"infoMessage" : "",
"configVersion" : 1
}
],
"ok" : 1,
"operationTime" : Timestamp(1547521744, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1547521744, 1),
"signature" : {
"hash" : BinData
(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
6插入数据测试同步
登录并在端口为27019(主服务器)的数据库服务器中插入一条数据
rs0:PRIMARY> db.test.insert({name:"xie",age:25})
然后分别在另外两台从服务器(端口为27018和27020)中查看同步情况。下面以27018端口这台从服务器为例
首先将从数据库服务器设置为可读
rs0:SECONDARY> rs.slaveOk()
然后读取刚才主服务器插入的数据
rs0:SECONDARY> db.test.find()
{ "_id" : ObjectId("5c3d4f86169f1cfe5a17276d"), "name" : "xie", "age" : 25 }
可以看到已经同步过去
7测试主服务器故障,从从服务器自动选举主数据库服务器
cmd窗口下输入net stop mongodb1命令关闭端口为27019(主服务器)的数据库服务器的服务
查看其余两台从数据库服务器状态,可以看到端口为27020的从服务器被自动选举成新的主服务器