Mongodb副本集添加节点,你学会了吗?

1、准备工作

有一套mongodb 副本集的集群,部署方式参考 mongodb 4.0副本集搭建。

准备一个新节点,使用和原副本集版本一致的mongodb。

拷贝原副本集中的配置文件、keyfile文件,并注意修改keyfile文件的权限(600)。

节点

角色

192.168.56.199:27017

PRIMARY

192.168.56.198:27018

SECONDARY

192.168.56.199:27018

ARBITER

准备加入的新节点: 192.168.56.197:27017。

2、添加节点

(1)启动新节点

例如,原节点的版本是4.2.8,新节点版本一致,路径一致然后启动新节点。

/usr/local/mongodb/bin/mongod -f /data/mongodb/27017/etc/mongodb.conf

(2)主库上查看当前节点及配置信息

使用rs.config()查看配置信息。

test12:PRIMARY>rs.config()
{
"_id" : "test12",
"version" : 1,
"protocolVersion" : NumberLong(1),
"writeConcernMajorityJournalDefault" : true,
"members" : [
{
"_id" : 0,
"host" : "192.168.56.198:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {


},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "192.168.56.199:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {


},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "192.168.56.199:27018",
"arbiterOnly" : true,
"buildIndexes" : true,
"hidden" : false,
"priority" : 0,
"tags" : {


},
"slaveDelay" : NumberLong(0),
"votes" : 1
}
],
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : 2000,
"heartbeatTimeoutSecs" : 10,
"electionTimeoutMillis" : 10000,
"catchUpTimeoutMillis" : -1,
"catchUpTakeoverDelayMillis" : 30000,
"getLastErrorModes" : {


},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("61b86af0a21015e69623e18d")
}
}

rs.status() 查看状态信息。

test12:PRIMARY>rs.status()
{
"set" : "test12",
"date" : ISODate("2021-12-14T10:07:46.561Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"majorityVoteCount" : 2,
"writeMajorityCount" : 2,
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1639476462, 1),
"t" : NumberLong(1)
},
"lastCommittedWallTime" : ISODate("2021-12-14T10:07:42.560Z"),
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1639476462, 1),
"t" : NumberLong(1)
},
"readConcernMajorityWallTime" : ISODate("2021-12-14T10:07:42.560Z"),
"appliedOpTime" : {
"ts" : Timestamp(1639476462, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1639476462, 1),
"t" : NumberLong(1)
},
"lastAppliedWallTime" : ISODate("2021-12-14T10:07:42.560Z"),
"lastDurableWallTime" : ISODate("2021-12-14T10:07:42.560Z")
},
"lastStableRecoveryTimestamp" : Timestamp(1639476442, 1),
"lastStableCheckpointTimestamp" : Timestamp(1639476442, 1),
"electionCandidateMetrics" : {
"lastElectionReason" : "electionTimeout",
"lastElectionDate" : ISODate("2021-12-14T09:59:22.407Z"),
"electionTerm" : NumberLong(1),
"lastCommittedOpTimeAtElection" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"lastSeenOpTimeAtElection" : {
"ts" : Timestamp(1639475952, 1),
"t" : NumberLong(-1)
},
"numVotesNeeded" : 2,
"priorityAtElection" : 1,
"electionTimeoutMillis" : NumberLong(10000),
"numCatchUpOps" : NumberLong(0),
"newTermStartDate" : ISODate("2021-12-14T09:59:22.431Z"),
"wMajorityWriteAvailabilityDate" : ISODate("2021-12-14T09:59:23.493Z")
},
"members" : [
{
"_id" : 0,
"name" : "192.168.56.198:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 514,
"optime" : {
"ts" : Timestamp(1639476462, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1639476462, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2021-12-14T10:07:42Z"),
"optimeDurableDate" : ISODate("2021-12-14T10:07:42Z"),
"lastHeartbeat" : ISODate("2021-12-14T10:07:45.153Z"),
"lastHeartbeatRecv" : ISODate("2021-12-14T10:07:46.542Z"),
"pingMs" : NumberLong(1),
"lastHeartbeatMessage" : "",
"syncingTo" : "192.168.56.199:27017",
"syncSourceHost" : "192.168.56.199:27017",
"syncSourceId" : 1,
"infoMessage" : "",
"configVersion" : 1
},
{
"_id" : 1,
"name" : "192.168.56.199:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 1001,
"optime" : {
"ts" : Timestamp(1639476462, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2021-12-14T10:07:42Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1639475962, 1),
"electionDate" : ISODate("2021-12-14T09:59:22Z"),
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 2,
"name" : "192.168.56.199:27018",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 514,
"lastHeartbeat" : ISODate("2021-12-14T10:07:44.896Z"),
"lastHeartbeatRecv" : ISODate("2021-12-14T10:07:44.896Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"configVersion" : 1
}
],
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1639476462, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1639476462, 1)
}

(3)将新节点添加至集群

在主库上执行rs.add()将新节点添加进集群中.

生产环境添加节点时,建议将priority及votes设为0,即不会选为主(priority默认1),也没有投票特性(votes默认1,有投票权)。

test12:PRIMARY> rs.add( { host: "192.168.56.197:27017", priority: 0, votes: 0 } )
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1639476997, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1639476997, 1)
}

另外,生产环境是从主库拉取全量数据,如果数据量较大,则需要观察主库的压力及对线上业务的影响。

同步数据的过程中,新节点的状态stateStr 为STARTUP2,待同步完成后会变为SECONDARY。

(4)重置新节点的属性

此时再用rs.config()查看新节点状态,priority及votes是之前设的0,可以使用 rs.recofig()命令进行调整

test12:PRIMARY>rs.config()
{
"_id" : "test12",
"version" : 2,
"protocolVersion" : NumberLong(1),
"writeConcernMajorityJournalDefault" : true,
"members" : [
{
"_id" : 0,
"host" : "192.168.56.198:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {

},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "192.168.56.199:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {

},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "192.168.56.199:27018",
"arbiterOnly" : true,
"buildIndexes" : true,
"hidden" : false,
"priority" : 0,
"tags" : {

},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 3,
"host" : "192.168.56.197:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 0,
"tags" : {

},
"slaveDelay" : NumberLong(0),
"votes" : 0
}
],
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : 2000,
"heartbeatTimeoutSecs" : 10,
"electionTimeoutMillis" : 10000,
"catchUpTimeoutMillis" : -1,
"catchUpTakeoverDelayMillis" : 30000,
"getLastErrorModes" : {

},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("61b86af0a21015e69623e18d")
}
}

从上面可以看到新节点的id为3 ,则可以通过如下命令调整对应的属性。

varcfg=rs.conf()
cfg.members[3].priority=1
cfg.members[3].votes=1
rs.reconfig(cfg)

调整后再查看,属性已调整。

test12:PRIMARY>rs.config()
{
"_id" : "test12",
"version" : 3,
"protocolVersion" : NumberLong(1),
"writeConcernMajorityJournalDefault" : true,
"members" : [
{
"_id" : 0,
"host" : "192.168.56.198:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {

},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "192.168.56.199:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {

},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "192.168.56.199:27018",
"arbiterOnly" : true,
"buildIndexes" : true,
"hidden" : false,
"priority" : 0,
"tags" : {

},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 3,
"host" : "192.168.56.197:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {

},
"slaveDelay" : NumberLong(0),
"votes" : 1
}
],
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : 2000,
"heartbeatTimeoutSecs" : 10,
"electionTimeoutMillis" : 10000,
"catchUpTimeoutMillis" : -1,
"catchUpTakeoverDelayMillis" : 30000,
"getLastErrorModes" : {

},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("61b86af0a21015e69623e18d")
}
}

至此,新节点便加入了副本集中。

3、注意点总结

  • 一个副本集,最多可以拥有50个secondary,最多可以有7个投票成员,在副本集里面添加一个新成员,如果之前副本集已经有了7个成员,那么可以设置成非投票成员,或者你从移除之前一个投票成员出来。
  • 新节点的版本、配置建议与原集群一致。
  • 注意添加新节点前确定网络互通。
  • 如果集群数据量较大,则选择业务低峰期添加节点,并观察压力情况。
  • 新节点加入时建议将priority及votes设为0。

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/226432.html<

(0)
运维的头像运维
上一篇2025-04-17 09:02
下一篇 2025-04-17 09:03

相关推荐

  • woothostingVPS测评,实测体验,woothostingVPS怎么样,woothostingVPS真实测评

    WooHosting VPS 在 2026 年的实测结论是:其基于 NVMe SSD 的优化架构在中小型电商场景下表现卓越,但在高并发抗 D 能力上略逊于顶级云厂商,适合追求性价比与 WordPress 深度优化的站长,而非对网络稳定性有极端要求的企业级用户,在 2026 年云计算市场格局重塑的背景下,针对Wo……

    2026-05-02
    0
  • 服务器测评,实测数据与性能表现,服务器性能怎么样,服务器测评

    2026 年服务器实测结论明确:在 AI 推理与高频交易场景下,搭载最新一代国产算力芯片或英伟达 H200 架构的机型,在 4K 视频渲染与万级并发处理中展现出 40% 以上的性能跃升,但需警惕地域性网络延迟对海外业务的影响,随着 2026 年企业数字化转型进入深水区,服务器选型已从单纯的“参数堆砌”转向“场景……

    2026-05-02
    0
  • HostBasticVPS测评靠谱吗?高防实测数据与性能表现如何

    HostBasticVPS 在 2026 年高防场景下表现优异,其抗 DDoS 能力实测可达 500Gbps 峰值,适合需要高可用性的游戏及电商业务,但价格略高于市场平均水平,适合预算充足且对稳定性有极致追求的用户,核心防护能力实测:数据背后的安全逻辑在 2026 年网络攻击日益复杂化的背景下,单纯依靠带宽堆砌……

    2026-05-02
    0
  • BigBoxHost美国服务器怎么样?美国服务器租用推荐

    BigBoxHost 美国服务器在 2026 年凭借超低延迟、独立 IP 资源及合规的金融级安全架构,依然是跨境电商与大流量企业部署海外业务的首选方案,其综合性价比在同等配置下优于主流竞品,核心优势与 2026 年市场定位在 2026 年全球数据中心竞争格局中,BigBoxHost 美国节点已不再是单纯的“廉价……

    2026-05-02
    0
  • BigBoxHost美国服务器怎么样,美国云服务器租用推荐

    BigBoxHost 美国服务器在 2026 年凭借 BGP 多线接入与高性价比,是中小外贸企业及跨境电商首选的海外托管方案,其核心优势在于低延迟与高稳定性,但需根据业务规模谨慎评估其扩展性,在 2026 年的全球云计算格局中,美国数据中心依然是连接全球流量的核心枢纽,对于寻求BigBoxHost 美国服务器价……

    2026-05-02
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注