Skip to content

MongoDB 复制(副本集)

MongoDB 的复制功能允许我们创建数据的多个副本,以提高数据的可用性和可靠性。副本集是一组 MongoDB 服务器,其中包含一个主服务器和多个从服务器。主服务器负责处理所有的写操作,而从服务器负责复制主服务器的数据。

基本概念

副本集的结构

副本集通常由以下三种类型的服务器组成:

  1. 主服务器(Primary):负责处理所有的写操作,并将数据同步到从服务器。
  2. 从服务器(Secondary):负责复制主服务器的数据,并处理读操作。
  3. 仲裁者(Arbiter):不存储数据,只负责投票选举新的主服务器。

数据同步

当主服务器接收到写操作时,它会将操作记录到操作日志(Oplog)中。从服务器会定期从主服务器复制操作日志,并执行这些操作,从而实现数据同步。

故障转移

当主服务器出现故障时,副本集会自动进行故障转移,选举新的主服务器。选举过程由仲裁者参与,确保选举的结果是合法的。

配置副本集

初始化副本集

javascript
// 连接到主服务器
mongo --host primary.example.com

// 初始化副本集
rs.initiate({
  _id: "myReplicaSet",
  members: [
    { _id: 0, host: "primary.example.com:27017" },
    { _id: 1, host: "secondary1.example.com:27017" },
    { _id: 2, host: "secondary2.example.com:27017" }
  ]
})

添加从服务器

javascript
// 添加从服务器
rs.add("secondary3.example.com:27017")

// 添加仲裁者
rs.addArb("arbiter.example.com:27017")

查看副本集状态

javascript
// 查看副本集的状态
rs.status()

使用副本集

连接到副本集

javascript
// 连接到副本集
mongo --host myReplicaSet/primary.example.com,secondary1.example.com,secondary2.example.com

读操作

默认情况下,所有的读操作都由主服务器处理。我们可以通过设置 readPreference 选项来指定读操作的服务器。

javascript
// 主服务器读取(默认)
db.collection.find().readPref("primary")

// 主服务器或从服务器读取
db.collection.find().readPref("primaryPreferred")

// 从服务器读取
db.collection.find().readPref("secondary")

// 从服务器读取,如果没有从服务器,则从主服务器读取
db.collection.find().readPref("secondaryPreferred")

// 最接近的服务器读取
db.collection.find().readPref("nearest")

写操作

所有的写操作都由主服务器处理。当主服务器处理写操作时,它会将操作记录到操作日志中,并同步到从服务器。

故障恢复

手动故障转移

javascript
// 手动故障转移
rs.stepDown(300)

恢复主服务器

当原主服务器恢复后,它会作为从服务器加入副本集。

性能考虑

  1. 网络延迟:副本集的性能取决于网络延迟。如果网络延迟较高,数据同步和故障转移的时间会更长。
  2. 服务器资源:副本集的性能取决于服务器的资源。我们应该确保服务器有足够的内存、CPU 和磁盘空间。
  3. 操作日志大小:操作日志的大小会影响数据同步的性能。我们可以通过设置 oplogSizeMB 选项来调整操作日志的大小。

常见问题

复制延迟

复制延迟是指从服务器与主服务器之间的时间差。如果复制延迟过大,可能会导致数据不一致。

选举失败

选举失败可能会导致副本集无法正常工作。我们应该确保有足够的仲裁者和从服务器参与选举。

总结

MongoDB 的复制功能允许我们创建数据的多个副本,以提高数据的可用性和可靠性。副本集是一组 MongoDB 服务器,其中包含一个主服务器和多个从服务器。通过使用副本集,我们可以实现数据的高可用性和故障恢复。同时,我们也需要注意网络延迟、服务器资源和操作日志大小等性能因素,以确保副本集的高效运行。