3台Linux服务器搭建可用副本集 - 主节点、副节点、仲裁者

使用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认证了,为了保证后面可以登录,提前创建用户


猜你喜欢

转载自blog.csdn.net/hellboy0621/article/details/80364556