MongoDB部署Replica Sets
本节演示在1台服务器上部署3节点的Replica Sets,配置信息如下表所示。
配置信息 | SERVER-1 | SERVER-2 | SERVER-3 |
---|---|---|---|
数据文件存储路径 | /data/data/r0 | /data/data/r1 | /data/data/r2 |
日志文件存储路径 | /data/log/r0.log | /data/log/r1.log | /data/log/r2.log |
复制集key文件 | /data/key/r0 | /data/key/r1 | /data/key/r2 |
示例监听端口 | 28010 | 28011 | 28012 |
分别创建3个节点各自的数据文件存储路径
mkdir -p /data/data/r0
mkdir -p /data/data/r1
mkdir -p /data/data/r2
以上代码创建3个目录,其中SERVER-1使用"/data/data/r0"目录存储数据文件,SERVER-2使用"/data/data/r1"目录存储数据文件,SERVER-3使用"/data/data/r2"目录存储数据文件
创建日志文件存储路径
mkdir -p /data/log
在本例中,创建"/data/log"目录用于存储3个节点的系统日志文件
创建复制集key文件存储路径
mkdir -p /data/key
echo "this is rs1 super secret key" > /data/key/r0
echo "this is rs1 super secret key" > /data/key/r1
echo "this is rs1 super secret key" > /data/key/r2
chmod 600 /data/key/r*
以上代码创建3个文件用于存储复制集的key信息,其中SERVER-1使用"/data/key/r0" key文件,SERVER-2使用"/data/key/r1" key文件,SERVER-3使用"/data/key/r2" key文件
启动3个MongoDB实例来模拟 3个节点
/usr/local/software/mongodb/bin/mongod --replSet rs1 --keyFile /data/key/r0 --fork --port 28010 --dbpath /data/data/r0 --logpath=/data/log/r0.log --logappend
/usr/local/software/mongodb/bin/mongod --replSet rs1 --keyFile /data/key/r1 --fork --port 28011 --dbpath /data/data/r1 --logpath=/data/log/r1.log --logappend
/usr/local/software/mongodb/bin/mongod --replSet rs1 --keyFile /data/key/r2 --fork --port 28012 --dbpath /data/data/r2 --logpath=/data/log/r2.log --logappend
在本例中,启动3个MongoDB实例来模拟3个节点
参数说明:
- replSet:指明复制集的名称。本例的取值是"rs1",其他的节点也必须起这个名字才能保证3个节点间的连通性。
- keyFile:复制集key文件的路径,对于本例它的取值是"/data/key/r0",其他的节点也必须起这个名字才能保证3个节点间的连通性。
- fork:将命令放在后台执行。
- port:MongoDB的监听端口,用于接收客户端请求。
- dbpath:数据文件存储路径。
- logpath:系统日志文件存放的位置。
- logappend:明确指明日志的写入模式是追加,而非覆盖方式。
配置节点信息,并初始化Replica Sets环境。
/usr/local/software/mongodb/bin/mongo -port 28010
config_rs1={_id:'rs1',members:[
{_id:0,host:'localhost:28010'},
{_id:1,host:'localhost:28011'},
{_id:2,host:'localhost:28012'}]
}
rs.initiate(config_rs1);
在本例中,首先通过执行"/Apps/mongo/bin/mongo-port 28010"命令连接到SERVER-1实例;然后通过执行"config_rs1={_id:'rs1',members:……}"命令来命名Replica Sets配置的名字,指定Replica Sets 3个节点的信息。
其中,参数"id"指明Replica Sets的名字,本例的值是"rs1"。
接下来通过执行"rs.initiate(config_rs1)"命令启动Replica Sets,其中参数"config_rs1"就是Replica Sets配置的名字。
配置Replica Sets时需要注意priority(优先级)的概念。当priority=0时,说明这个实例永远不可能被设置成primary。也就是说,它只能作为一个slave而存在,即使在主库当机的情况下,它也不能被选为主库。这种方式其实与最原始的Master-Slave方式是一致的。
。例如下面的配置中,将28010和28012这两个端口的实例优先级调成0,系统就只能选28011作为主库,如下面的代码所示:
config_rs1={_id:'rs1',members:[
{_id:0,host:'localhost:28010',priority:0},
{_id:1,host:'localhost:28011'},
{_id:2,host:'localhost:28012',priority:0}]
}
这样的设置在某些场景中还是非常有实际应用价值的。
然后可以通过rs.status()
查看复制集的状态,分析复制集的各项运行指标(登陆mongo之后查看)
/usr/local/software/mongodb/bin/mongo -port 28010
rs1:PRIMARY> rs.status()
脚本
start.sh
#!bin/bash
#清空操作
if [ $1 == 'reset' ]; then
pkill -9 mongo
rm -rf /data/log
rm -rf /data/key
rm -rf /data/data/*
exit
fi
# 启动
function start() {
# 创建必要的文件
mkdir -p /data/data/r0
mkdir -p /data/data/r1
mkdir -p /data/data/r2
mkdir -p /data/log
mkdir -p /data/key
echo "this is rs1 super secret key" > /data/key/r0
echo "this is rs1 super secret key" > /data/key/r1
echo "this is rs1 super secret key" > /data/key/r2
# 给拥有用户授权
chmod 600 /data/key/r*
# 启动三个mongo实例
/usr/local/software/mongodb/bin/mongod --replSet rs1 --keyFile /data/key/r0 --fork --port 28010 --dbpath /data/data/r0 --logpath=/data/log/r0.log --logappend
/usr/local/software/mongodb/bin/mongod --replSet rs1 --keyFile /data/key/r1 --fork --port 28011 --dbpath /data/data/r1 --logpath=/data/log/r1.log --logappend
/usr/local/software/mongodb/bin/mongod --replSet rs1 --keyFile /data/key/r2 --fork --port 28012 --dbpath /data/data/r2 --logpath=/data/log/r2.log --logappend
# 连接mongo实例并配置节点
/usr/local/software/mongodb/bin/mongo -port 28010 << EOF
config_rs1={_id:'rs1',members:[
{_id:0,host:'localhost:28010'},
{_id:1,host:'localhost:28011'},
{_id:2,host:'localhost:28012'}]
}
# 初始化Replica Sets环境
rs.initiate(config_rs1)
# 启动完后检查状态
rs.status()
EOF
}
if [ $1 == 'start' ]; then
start
fi
运行脚本
# 重置环境
sh start reset
# 启动脚本
sh start start
查看状态
/usr/local/software/mongodb/bin/mongo -port 28010
rs1:PRIMARY> rs.status()
{
"set" : "rs1",
"date" : ISODate("2019-10-10T15:20:53.814Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1570720843, 1),
"t" : NumberLong(1)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1570720843, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1570720843, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1570720843, 1),
"t" : NumberLong(1)
}
},
"lastStableCheckpointTimestamp" : Timestamp(1570720843, 1),
"members" : [
{
"_id" : 0,
"name" : "localhost:28010",
//1表明状态正常;0表明状态异常
"health" : 1,
"state" : 1,
// PRIMARY 表明此机器是主库
"stateStr" : "PRIMARY",
"uptime" : 90,
"optime" : {
"ts" : Timestamp(1570720843, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2019-10-10T15:20:43Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(1570720782, 1),
"electionDate" : ISODate("2019-10-10T15:19:42Z"),
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "localhost:28011",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 82,
"optime" : {
"ts" : Timestamp(1570720843, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1570720843, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2019-10-10T15:20:43Z"),
"optimeDurableDate" : ISODate("2019-10-10T15:20:43Z"),
"lastHeartbeat" : ISODate("2019-10-10T15:20:52.379Z"),
"lastHeartbeatRecv" : ISODate("2019-10-10T15:20:53.450Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "localhost:28010",
"syncSourceHost" : "localhost:28010",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "localhost:28012",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 82,
"optime" : {
"ts" : Timestamp(1570720843, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1570720843, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2019-10-10T15:20:43Z"),
"optimeDurableDate" : ISODate("2019-10-10T15:20:43Z"),
"lastHeartbeat" : ISODate("2019-10-10T15:20:52.379Z"),
"lastHeartbeatRecv" : ISODate("2019-10-10T15:20:53.382Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "localhost:28010",
"syncSourceHost" : "localhost:28010",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1
}
],
"ok" : 1,
"operationTime" : Timestamp(1570720843, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1570720843, 1),
"signature" : {
"hash" : BinData(0,"crIEP/ps9OmjKTmOvzF9+xNt8O0="),
"keyId" : NumberLong("6746194394132512770")
}
}
}