一、什么是副本集
见名知义,副本集就是将数据按照一定策略,拷贝一份或者多份。拷贝一份就是主从结构,拷贝多份就是副本集了。
二、什么时候需要副本集
- 需要数据安全容灾时
- 需要读写分离提高性能时
- 需要分片时(请参看另一篇文章,《mongodb分片实战》)
三、副本集配置步骤(以下示例使用三个副本集)
- 定义一个副本集的名称(rs0)
- 定义三台逻辑实例(生产环境应当是三台物理实例,每一台物理实例对应一台逻辑实例,本文测试只在一台物理机且通过端口隔离,分别未27017,27018,2701)。为了方便记忆,本文定义三个副本节点分别未rs0_1,rs0_2,rs0_3;
- 编写配置文件(注:本文并非详解配置文件,只列出常用的属性)
- 副本集rs0对应的节点一 rs0_1.conf
#配置副本集存储的文件,存贮副本集的第一个数据
dbpath=/home/york/mongodb4/data/rs0_1
#日志存放目录
logpath=/home/york/mongodb4/logs/rs0_1.log
#由于测试,通过端口来区分,生产环境需要分布在不同的物理机
port=27017
# 以追加方式写入日志
logappend=true
# 是否以守护进程方式运行
fork = true
#副本集名称,必须配置,否则无法完成副本集配置(多个副本集应当配置相同的名称)
replSet=rs0
- 副本集rs0对应的节点二 rs0_2.conf
#配置副本集存储的文件,存贮副本集的第一个数据
dbpath=/home/york/mongodb4/data/rs0_2
#日志存放目录
logpath=/home/york/mongodb4/logs/rs0_2.log
#由于测试,通过端口来区分,生产环境需要分布在不同的物理机
port=27018
# 以追加方式写入日志
logappend=true
# 是否以守护进程方式运行
fork = true
#副本集名称,必须配置,否则无法完成副本集配置(多个副本集应当配置相同的名称)
replSet=rs0
- 副本集rs0对应的节点三 rs0_3.conf
#配置副本集存储的文件,存贮副本集的第一个数据
dbpath=/home/york/mongodb4/data/rs0_3
#日志存放目录
logpath=/home/york/mongodb4/logs/rs0_3.log
#由于测试,通过端口来区分,生产环境需要分布在不同的物理机
port=27019
# 以追加方式写入日志
logappend=true
# 是否以守护进程方式运行
fork = true
#副本集名称,必须配置,否则无法完成副本集配置(多个副本集应当配置相同的名称)
replSet=rs0
- 启动三个mongod实例
./mongod -f /home/york/mongodb4/conf/rs0/rs0_1.conf
./mongod -f /home/york/mongodb4/conf/rs0/rs0_2.conf
./mongod -f /home/york/mongodb4/conf/rs0/rs0_3.conf
- 创建副本集
通过 mongo shell进入交互式命令行(任意一个节点),load("~/mongodb4/conf/rs0/create.js")
var config = {
"_id":"rs0",
"members":[
{"_id":0,"host":"localhost:27017"},
{"_id":1,"host":"localhost:27018"},
{"_id":2,"host":"localhost:27019"}
]
}
rs.initiate(config)
- 然后通过命令行查看状态信息
rs.status();下文为部分信息。可以看到对应节点的状态。至此,副本集配置成功。
"members" : [
{
"_id" : 0,
"name" : "localhost:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 3341,
"optime" : {
"ts" : Timestamp(1657794924, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2022-07-14T10:35:24Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1657794664, 1),
"electionDate" : ISODate("2022-07-14T10:31:04Z"),
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "localhost:27018",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 277,
"optime" : {
"ts" : Timestamp(1657794924, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1657794924, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2022-07-14T10:35:24Z"),
"optimeDurableDate" : ISODate("2022-07-14T10:35:24Z"),
"lastHeartbeat" : ISODate("2022-07-14T10:35:29.656Z"),
"lastHeartbeatRecv" : ISODate("2022-07-14T10:35:29.024Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "localhost:27017",
"syncSourceHost" : "localhost:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "localhost:27019",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 277,
"optime" : {
"ts" : Timestamp(1657794924, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1657794924, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2022-07-14T10:35:24Z"),
"optimeDurableDate" : ISODate("2022-07-14T10:35:24Z"),
"lastHeartbeat" : ISODate("2022-07-14T10:35:29.655Z"),
"lastHeartbeatRecv" : ISODate("2022-07-14T10:35:29.026Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "localhost:27017",
"syncSourceHost" : "localhost:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1
}
],
- 常见的副本集管理命令
rs.stepDown() // 将主节点退化为备份节点
rs.stepDown(600) // 将主节点退化为备份节点10分钟
rs.freeze(100) // 100秒内阻止当前节点选举成为主节点