0
点赞
收藏
分享

微信扫一扫

mongodb副本集

水沐由之 2022-07-14 阅读 65

一、什么是副本集

见名知义,副本集就是将数据按照一定策略,拷贝一份或者多份。拷贝一份就是主从结构,拷贝多份就是副本集了。

二、什么时候需要副本集

  • 需要数据安全容灾时
  • 需要读写分离提高性能时
  • 需要分片时(请参看另一篇文章,《mongodb分片实战》)

mongodb副本集_mongodb

三、副本集配置步骤(以下示例使用三个副本集)

  1. 定义一个副本集的名称(rs0)
  2. 定义三台逻辑实例(生产环境应当是三台物理实例,每一台物理实例对应一台逻辑实例,本文测试只在一台物理机且通过端口隔离,分别未27017,27018,2701)。为了方便记忆,本文定义三个副本节点分别未rs0_1,rs0_2,rs0_3;
  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秒内阻止当前节点选举成为主节点

举报

相关推荐

0 条评论