使用VMwaer搭建3台虚拟机,CentOS7,副本集配置如下:
成员 | 守护进程 | 主机:端口 | 数据文件路径 |
Active_Member | mongod | 192.168.0.128:7001 | /data2/replSet7001/ |
Passive_Member | mongod | 192.168.0.120:7001 | /data2/replSet7001/ |
Arbiter_Member | mongod | 192.168.0.121:7001 | /data2/replSet7001/ |
单机模式安装并配置详见之前写的这篇文章 - 《Linux下单节点MongoDB安装配置》,具体命令就不在这里写了;
使用root登录,在120、121上创建数据文件路径,配置文件路径;解压缩MongoDB压缩包;
1、在每台服务器上新建配置文件:
[root@localhost conf]# vim /data2/conf/replSet7001.conf
# 使用demon形式启动
fork = true
# 以7001端口启动
port = 7001
# 日志不在终端输出而是进入log
quiet = true
# 数据目录配置
dbpath = /data2/replSet7001
# 日志文件存放位置
logpath = /data2/replSet7001/log/replSet7001.log
# 以追加方式记录日志
logappend = true
# 副本集名称
replSet = replSet7001
2、新建mongodb用户及mongodb用户组,并把mongodb相关的文件夹都赋予mongodb用户所有权限
groupadd mongodb
useradd mongodb -m -d /home/mongodb -g mongodb
chown -R mongodb:mongodb /data2/conf
chown -R mongodb:mongodb /data2/mongodb-3.4.10
chown -R mongodb:mongodb /data2/replSet7001
3、切换到mongodb用户下,依次启动成员,启动前最好确认一下7001端口是否开启;
[root@localhost data2]# su mongodb
[mongodb@localhost data2]$ /data2/mongodb-3.4.10/bin/mongod -f /data2/conf/replSet7001.conf
about to fork child process, waiting until server is ready for connections.
forked process: 4551
child process started successfully, parent exiting
三台服务器都处于启动和运行状态,并且彼此能够通信,但该副本集没有初始化;
4、初始化副本集
连接到128服务器进行操作
/data2/mongodb-3.4.10/bin/mongo -port 7001
切换到admin数据库
use admin
设置一个配置数据结构,提供与服务器有关的角色,其中arbiterOnly:true 代表其为仲裁节点
config={
_id:"replSet7001",
members:[
{_id:0,host:"192.168.0.128:7001"},
{_id:1,host:"192.168.0.120:7001"},
{_id:2,host:"192.168.0.121:7001",arbiterOnly:true}
]
}
初始化:
> rs.initiate(config);
{ "ok" : 1 }
5、验证
5.1 初始化成功后,自动切换角色,由原来的“>”变为“replSet7001:PRIMARY>”,证明此服务器为主节点,运行以下命令,检查副本集的状态:
replSet7001:PRIMARY> rs.status()
{
"set" : "replSet7001",
"date" : ISODate("2018-05-18T08:01:15.592Z"),
"myState" : 1,
"term" : NumberLong(1),
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1526630474, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1526630474, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1526630474, 1),
"t" : NumberLong(1)
}
},
"members" : [
{
"_id" : 0,
"name" : "192.168.0.128:7001",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 622,
"optime" : {
"ts" : Timestamp(1526630474, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-05-18T08:01:14Z"),
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(1526630433, 1),
"electionDate" : ISODate("2018-05-18T08:00:33Z"),
"configVersion" : 1,
"self" : true
},
{
"_id" : 1,
"name" : "192.168.0.120:7001",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 53,
"optime" : {
"ts" : Timestamp(1526630474, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1526630474, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-05-18T08:01:14Z"),
"optimeDurableDate" : ISODate("2018-05-18T08:01:14Z"),
"lastHeartbeat" : ISODate("2018-05-18T08:01:15.285Z"),
"lastHeartbeatRecv" : ISODate("2018-05-18T08:01:14.258Z"),
"pingMs" : NumberLong(5),
"syncingTo" : "192.168.0.128:7001",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "192.168.0.121:7001",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 53,
"lastHeartbeat" : ISODate("2018-05-18T08:01:15.289Z"),
"lastHeartbeatRecv" : ISODate("2018-05-18T08:01:14.026Z"),
"pingMs" : NumberLong(4),
"configVersion" : 1
}
],
"ok" : 1
}
运行以下命令来验证主节点:
replSet7001:PRIMARY> db.isMaster()
{
"hosts" : [
"192.168.0.128:7001",
"192.168.0.120:7001"
],
"arbiters" : [
"192.168.0.121:7001"
],
"setName" : "replSet7001",
"setVersion" : 1,
"ismaster" : true,
"secondary" : false,
"primary" : "192.168.0.128:7001",
"me" : "192.168.0.128:7001",
"electionId" : ObjectId("7fffffff0000000000000001"),
"lastWrite" : {
"opTime" : {
"ts" : Timestamp(1526630514, 1),
"t" : NumberLong(1)
},
"lastWriteDate" : ISODate("2018-05-18T08:01:54Z")
},
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2018-05-18T08:02:00.776Z"),
"maxWireVersion" : 5,
"minWireVersion" : 0,
"readOnly" : false,
"ok" : 1
}
5.2 连接120服务器,查看副本集状态
replSet7001:SECONDARY> rs.status()
{
"set" : "replSet7001",
"date" : ISODate("2018-05-18T08:20:32.390Z"),
"myState" : 2,
"term" : NumberLong(1),
"syncingTo" : "192.168.0.128:7001",
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1526631625, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1526631625, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1526631625, 1),
"t" : NumberLong(1)
}
},
"members" : [
{
"_id" : 0,
"name" : "192.168.0.128:7001",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 1207,
"optime" : {
"ts" : Timestamp(1526631625, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1526631625, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-05-18T08:20:25Z"),
"optimeDurableDate" : ISODate("2018-05-18T08:20:25Z"),
"lastHeartbeat" : ISODate("2018-05-18T08:20:31.112Z"),
"lastHeartbeatRecv" : ISODate("2018-05-18T08:20:30.630Z"),
"pingMs" : NumberLong(21),
"electionTime" : Timestamp(1526630433, 1),
"electionDate" : ISODate("2018-05-18T08:00:33Z"),
"configVersion" : 1
},
{
"_id" : 1,
"name" : "192.168.0.120:7001",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 1714,
"optime" : {
"ts" : Timestamp(1526631625, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-05-18T08:20:25Z"),
"syncingTo" : "192.168.0.128:7001",
"configVersion" : 1,
"self" : true
},
{
"_id" : 2,
"name" : "192.168.0.121:7001",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 1207,
"lastHeartbeat" : ISODate("2018-05-18T08:20:31.499Z"),
"lastHeartbeatRecv" : ISODate("2018-05-18T08:20:29.915Z"),
"pingMs" : NumberLong(0),
"configVersion" : 1
}
],
"ok" : 1
}
5.3 连接121服务器,查看副本集状态
replSet7001:ARBITER> rs.status()
{
"set" : "replSet7001",
"date" : ISODate("2018-05-18T08:22:11.261Z"),
"myState" : 7,
"term" : NumberLong(1),
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1526631725, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1526631725, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
}
},
"members" : [
{
"_id" : 0,
"name" : "192.168.0.128:7001",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 1306,
"optime" : {
"ts" : Timestamp(1526631725, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1526631725, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-05-18T08:22:05Z"),
"optimeDurableDate" : ISODate("2018-05-18T08:22:05Z"),
"lastHeartbeat" : ISODate("2018-05-18T08:22:07.435Z"),
"lastHeartbeatRecv" : ISODate("2018-05-18T08:22:10.246Z"),
"pingMs" : NumberLong(594),
"electionTime" : Timestamp(1526630433, 1),
"electionDate" : ISODate("2018-05-18T08:00:33Z"),
"configVersion" : 1
},
{
"_id" : 1,
"name" : "192.168.0.120:7001",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 1307,
"optime" : {
"ts" : Timestamp(1526631725, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1526631725, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-05-18T08:22:05Z"),
"optimeDurableDate" : ISODate("2018-05-18T08:22:05Z"),
"lastHeartbeat" : ISODate("2018-05-18T08:22:09.662Z"),
"lastHeartbeatRecv" : ISODate("2018-05-18T08:22:09.292Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "192.168.0.128:7001",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "192.168.0.121:7001",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 1645,
"configVersion" : 1,
"self" : true
}
],
"ok" : 1
}
6、添加一台服务器
使用如上配置再配置一台服务器(直接关掉一台服务器,克隆一台,记得把文件夹清空,log文件夹必须保留)
切换到mongodb用户下,启动成员:
[root@localhost data2]# su mongodb
[mongodb@localhost data2]$ /data2/mongodb-3.4.10/bin/mongod -f /data2/conf/replSet7001.conf
about to fork child process, waiting until server is ready for connections.
forked process: 3616
child process started successfully, parent exiting
连接到主节点mongo控制台
replSet7001:PRIMARY> use admin
switched to db admin
replSet7001:PRIMARY> rs.add("192.168.0.131:7001")
{ "ok" : 1 }
查看状态,131作为副节点添加到该副本集中了:
replSet7001:PRIMARY> rs.status()
{
"set" : "replSet7001",
"date" : ISODate("2018-05-18T08:43:25.180Z"),
"myState" : 1,
"term" : NumberLong(1),
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1526633000, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1526633000, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1526633000, 1),
"t" : NumberLong(1)
}
},
"members" : [
{
"_id" : 0,
"name" : "192.168.0.128:7001",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 3152,
"optime" : {
"ts" : Timestamp(1526633000, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-05-18T08:43:20Z"),
"electionTime" : Timestamp(1526630433, 1),
"electionDate" : ISODate("2018-05-18T08:00:33Z"),
"configVersion" : 2,
"self" : true
},
{
"_id" : 1,
"name" : "192.168.0.120:7001",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 71,
"optime" : {
"ts" : Timestamp(1526633000, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1526633000, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-05-18T08:43:20Z"),
"optimeDurableDate" : ISODate("2018-05-18T08:43:20Z"),
"lastHeartbeat" : ISODate("2018-05-18T08:43:25.031Z"),
"lastHeartbeatRecv" : ISODate("2018-05-18T08:43:21.051Z"),
"pingMs" : NumberLong(5),
"configVersion" : 2
},
{
"_id" : 2,
"name" : "192.168.0.121:7001",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 2583,
"lastHeartbeat" : ISODate("2018-05-18T08:43:25.031Z"),
"lastHeartbeatRecv" : ISODate("2018-05-18T08:43:21.042Z"),
"pingMs" : NumberLong(5),
"configVersion" : 2
},
{
"_id" : 3,
"name" : "192.168.0.131:7001",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 4,
"optime" : {
"ts" : Timestamp(1526633000, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1526633000, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-05-18T08:43:20Z"),
"optimeDurableDate" : ISODate("2018-05-18T08:43:20Z"),
"lastHeartbeat" : ISODate("2018-05-18T08:43:25.036Z"),
"lastHeartbeatRecv" : ISODate("2018-05-18T08:43:22.155Z"),
"pingMs" : NumberLong(10),
"configVersion" : 2
}
],
"ok" : 1
}
连接上131的mongo,查看是否为主节点:
replSet7001:SECONDARY> db.isMaster()
{
"hosts" : [
"192.168.0.128:7001",
"192.168.0.120:7001",
"192.168.0.131:7001"
],
"arbiters" : [
"192.168.0.121:7001"
],
"setName" : "replSet7001",
"setVersion" : 2,
"ismaster" : false,
"secondary" : true,
"primary" : "192.168.0.128:7001",
"me" : "192.168.0.131:7001",
"lastWrite" : {
"opTime" : {
"ts" : Timestamp(1526633155, 1),
"t" : NumberLong(1)
},
"lastWriteDate" : ISODate("2018-05-18T08:45:55Z")
},
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2018-05-18T08:46:02.459Z"),
"maxWireVersion" : 5,
"minWireVersion" : 0,
"readOnly" : false,
"ok" : 1
}
7、移除一台服务器
移除120服务器,连接到120mongo控制台
replSet7001:SECONDARY> use admin
switched to db admin
replSet7001:SECONDARY> db.shutdownServer()
server should be down...
2018-05-18T16:48:10.944+0800 I NETWORK [thread1] trying reconnect to 127.0.0.1:7001 (127.0.0.1) failed
2018-05-18T16:48:10.944+0800 W NETWORK [thread1] Failed to connect to 127.0.0.1:7001, in(checking socket for error after poll), reason: Connection refused
2018-05-18T16:48:10.944+0800 I NETWORK [thread1] reconnect 127.0.0.1:7001 (127.0.0.1) failed failed
2018-05-18T16:48:10.947+0800 I NETWORK [thread1] trying reconnect to 127.0.0.1:7001 (127.0.0.1) failed
2018-05-18T16:48:10.947+0800 W NETWORK [thread1] Failed to connect to 127.0.0.1:7001, in(checking socket for error after poll), reason: Connection refused
2018-05-18T16:48:10.947+0800 I NETWORK [thread1] reconnect 127.0.0.1:7001 (127.0.0.1) failed failed
> db
admin
连接到主节点mongo控制台:
replSet7001:PRIMARY> use admin
switched to db admin
replSet7001:PRIMARY> rs.remove("192.168.0.120:7001")
{ "ok" : 1 }
查看副本集状态:
replSet7001:PRIMARY> rs.status()
{
"set" : "replSet7001",
"date" : ISODate("2018-05-18T08:52:09.404Z"),
"myState" : 1,
"term" : NumberLong(1),
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1526633525, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1526633525, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1526633525, 1),
"t" : NumberLong(1)
}
},
"members" : [
{
"_id" : 0,
"name" : "192.168.0.128:7001",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 3676,
"optime" : {
"ts" : Timestamp(1526633525, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-05-18T08:52:05Z"),
"electionTime" : Timestamp(1526630433, 1),
"electionDate" : ISODate("2018-05-18T08:00:33Z"),
"configVersion" : 3,
"self" : true
},
{
"_id" : 2,
"name" : "192.168.0.121:7001",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 3107,
"lastHeartbeat" : ISODate("2018-05-18T08:52:07.414Z"),
"lastHeartbeatRecv" : ISODate("2018-05-18T08:52:05.497Z"),
"pingMs" : NumberLong(4),
"configVersion" : 3
},
{
"_id" : 3,
"name" : "192.168.0.131:7001",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 528,
"optime" : {
"ts" : Timestamp(1526633525, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1526633525, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-05-18T08:52:05Z"),
"optimeDurableDate" : ISODate("2018-05-18T08:52:05Z"),
"lastHeartbeat" : ISODate("2018-05-18T08:52:07.413Z"),
"lastHeartbeatRecv" : ISODate("2018-05-18T08:52:08.524Z"),
"pingMs" : NumberLong(3),
"syncingTo" : "192.168.0.128:7001",
"configVersion" : 3
}
],
"ok" : 1
}
replSet7001:PRIMARY> rs.isMaster()
{
"hosts" : [
"192.168.0.128:7001",
"192.168.0.131:7001"
],
"arbiters" : [
"192.168.0.121:7001"
],
"setName" : "replSet7001",
"setVersion" : 3,
"ismaster" : true,
"secondary" : false,
"primary" : "192.168.0.128:7001",
"me" : "192.168.0.128:7001",
"electionId" : ObjectId("7fffffff0000000000000001"),
"lastWrite" : {
"opTime" : {
"ts" : Timestamp(1526633555, 1),
"t" : NumberLong(1)
},
"lastWriteDate" : ISODate("2018-05-18T08:52:35Z")
},
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2018-05-18T08:52:38.668Z"),
"maxWireVersion" : 5,
"minWireVersion" : 0,
"readOnly" : false,
"ok" : 1
}
8、添加一台仲裁者
把刚刚移除的120服务器作为仲裁者添加到副本集中,连接主节点mongo控制台:
replSet7001:PRIMARY> use admin
switched to db admin
replSet7001:PRIMARY> rs.addArb("192.168.0.120:7001")
{ "ok" : 1 }
必须把数据清除掉,否则120服务器会报错退出,不能正常启动;
启动120后,连接mongo控制台:
replSet7001:ARBITER> db.isMaster()
{
"hosts" : [
"192.168.0.128:7001",
"192.168.0.131:7001"
],
"arbiters" : [
"192.168.0.121:7001",
"192.168.0.120:7001"
],
"setName" : "replSet7001",
"setVersion" : 4,
"ismaster" : false,
"secondary" : false,
"primary" : "192.168.0.128:7001",
"arbiterOnly" : true,
"me" : "192.168.0.120:7001",
"lastWrite" : {
"opTime" : {
"ts" : Timestamp(1526634855, 1),
"t" : NumberLong(1)
},
"lastWriteDate" : ISODate("2018-05-18T09:14:15Z")
},
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2018-05-18T09:14:19.963Z"),
"maxWireVersion" : 5,
"minWireVersion" : 0,
"readOnly" : false,
"ok" : 1
}
9、强制进行一次新选举
9.1 目前副本集中有4台服务器,1台主节点,1台副节点,2台仲裁者,为了保证选举时达到“大多数”的要求,先把121仲裁者移除;
登录121服务器mongo控制台:
replSet7001:ARBITER> use admin
switched to db admin
replSet7001:ARBITER> db.shutdownServer()
server should be down...
登录主节点mongo控制台:
replSet7001:PRIMARY> rs.remove("192.168.0.121:7001")
{ "ok" : 1 }
replSet7001:PRIMARY> rs.status()
{
"set" : "replSet7001",
"date" : ISODate("2018-05-18T09:22:24.703Z"),
"myState" : 1,
"term" : NumberLong(1),
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1526635333, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1526635333, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1526635333, 1),
"t" : NumberLong(1)
}
},
"members" : [
{
"_id" : 0,
"name" : "192.168.0.128:7001",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 5491,
"optime" : {
"ts" : Timestamp(1526635333, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-05-18T09:22:13Z"),
"electionTime" : Timestamp(1526630433, 1),
"electionDate" : ISODate("2018-05-18T08:00:33Z"),
"configVersion" : 5,
"self" : true
},
{
"_id" : 3,
"name" : "192.168.0.131:7001",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 2343,
"optime" : {
"ts" : Timestamp(1526635333, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1526635333, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-05-18T09:22:13Z"),
"optimeDurableDate" : ISODate("2018-05-18T09:22:13Z"),
"lastHeartbeat" : ISODate("2018-05-18T09:22:23.838Z"),
"lastHeartbeatRecv" : ISODate("2018-05-18T09:22:23.848Z"),
"pingMs" : NumberLong(2),
"configVersion" : 5
},
{
"_id" : 4,
"name" : "192.168.0.120:7001",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 531,
"lastHeartbeat" : ISODate("2018-05-18T09:22:23.839Z"),
"lastHeartbeatRecv" : ISODate("2018-05-18T09:22:23.841Z"),
"pingMs" : NumberLong(3),
"configVersion" : 5
}
],
"ok" : 1
}
9.2 使用rs.stepDown()命令强制当前主服务器关闭,并启动新主节点的选举;
应用场景:
1)模拟主节点故障的影响时,可以强制集群进行故障转移;
2)当主服务器需要离线时,或是进行维护,或是为了升级或检查该服务器;
3)针对数据结构运行诊断程序时;
登录主节点mongo控制台:
replSet7001:PRIMARY> use admin
switched to db admin
replSet7001:PRIMARY> rs.stepDown()
2018-05-18T17:24:54.225+0800 E QUERY [thread1] Error: error doing query: failed: network error while attempting to run command 'replSetStepDown' on host '127.0.0.1:7001' :
DB.prototype.runCommand@src/mongo/shell/db.js:132:1
DB.prototype.adminCommand@src/mongo/shell/db.js:149:1
rs.stepDown@src/mongo/shell/utils.js:1273:12
@(shell):1:1
2018-05-18T17:24:54.229+0800 I NETWORK [thread1] trying reconnect to 127.0.0.1:7001 (127.0.0.1) failed
2018-05-18T17:24:54.230+0800 I NETWORK [thread1] reconnect 127.0.0.1:7001 (127.0.0.1) ok
查看副本集状态可以发现,128服务器变为“SECONDARY”副节点,而131服务器变为“PRIMARY”主节点;
replSet7001:SECONDARY> rs.status()
{
"set" : "replSet7001",
"date" : ISODate("2018-05-18T09:25:09.951Z"),
"myState" : 2,
"term" : NumberLong(2),
"syncingTo" : "192.168.0.131:7001",
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1526635504, 1),
"t" : NumberLong(2)
},
"appliedOpTime" : {
"ts" : Timestamp(1526635504, 1),
"t" : NumberLong(2)
},
"durableOpTime" : {
"ts" : Timestamp(1526635504, 1),
"t" : NumberLong(2)
}
},
"members" : [
{
"_id" : 0,
"name" : "192.168.0.128:7001",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 5656,
"optime" : {
"ts" : Timestamp(1526635504, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2018-05-18T09:25:04Z"),
"syncingTo" : "192.168.0.131:7001",
"configVersion" : 5,
"self" : true
},
{
"_id" : 3,
"name" : "192.168.0.131:7001",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 2508,
"optime" : {
"ts" : Timestamp(1526635504, 1),
"t" : NumberLong(2)
},
"optimeDurable" : {
"ts" : Timestamp(1526635504, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2018-05-18T09:25:04Z"),
"optimeDurableDate" : ISODate("2018-05-18T09:25:04Z"),
"lastHeartbeat" : ISODate("2018-05-18T09:25:09.437Z"),
"lastHeartbeatRecv" : ISODate("2018-05-18T09:25:08.783Z"),
"pingMs" : NumberLong(4),
"electionTime" : Timestamp(1526635502, 1),
"electionDate" : ISODate("2018-05-18T09:25:02Z"),
"configVersion" : 5
},
{
"_id" : 4,
"name" : "192.168.0.120:7001",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 697,
"lastHeartbeat" : ISODate("2018-05-18T09:25:09.509Z"),
"lastHeartbeatRecv" : ISODate("2018-05-18T09:25:09.064Z"),
"pingMs" : NumberLong(3),
"configVersion" : 5
}
],
"ok" : 1
}
10、启用安全认证机制keyFile
10.1 在任一服务器上执行以下命令,生成keyFile文件,拷贝到其他服务器对应的路径下,并修改文件所属用户及文件权限(文件权限必须为600):
openssl rand -base64 90 > /data2/replSet7001/keyFile
openssl rand -base64 90 > /data2/replSet7001/keyFile
chown -R mongodb:mongodb /data2/replSet7001/keyFile
chmod 600 /data2/replSet7001/keyFile
10.2 修改配置文件,在最后添加
# 以keyFile的方式启用验证,启用后必须通过用户名密码才可访问
keyFile = /data2/replSet7001/keyFile
10.3 主节点配置用户
开启keyFile认证就默认开启auth认证了,为了保证后面可以登录,提前创建用户