MongoDB(49)什么是副本集?

副本集(Replica Set)是 MongoDB 实现高可用性和数据冗余的一种机制。一个副本集由一组具有相同数据的 MongoDB 实例组成,其中包括一个主节点(Primary)和多个从节点(Secondary)。副本集中至少需要有一个主节点和一个从节点。

副本集工作原理

  1. 主节点(Primary):处理所有的写入操作,并将数据同步到从节点。
  2. 从节点(Secondary):复制并维护主节点的数据的副本,主要用于读操作,也可以在主节点故障时接替主节点的角色。
  3. 仲裁节点(Arbiter):不存储数据,只参与选举过程,用于在选举过程中投票,确保副本集能够选出新的主节点。

副本集的优点

  • 高可用性:如果主节点发生故障,从节点会自动选举新的主节点,保证系统的高可用性。
  • 读写分离:可以将读操作分配到从节点,提高系统的读性能。
  • 数据冗余:从节点保存主节点的数据副本,防止数据丢失。

副本集的配置和使用

以下是如何设置和使用 MongoDB 副本集的详细步骤和代码示例。

环境准备

假设我们有三台 MongoDB 实例:一个主节点(mongodb://localhost:27017)、两个从节点(mongodb://localhost:27018mongodb://localhost:27019),并且三台实例位于同一台机器上。

配置副本集

  1. 启动 MongoDB 实例

首先,启动三个 MongoDB 实例,并确保它们能够相互通信。

bash 复制代码
mongod --port 27017 --dbpath /data/db0 --replSet rs0
mongod --port 27018 --dbpath /data/db1 --replSet rs0
mongod --port 27019 --dbpath /data/db2 --replSet rs0
  1. 初始化副本集

连接到主节点并初始化副本集:

bash 复制代码
mongo --port 27017

在 MongoDB Shell 中执行以下命令:

javascript 复制代码
rs.initiate({
    _id: "rs0",
    members: [
        { _id: 0, host: "localhost:27017" },
        { _id: 1, host: "localhost:27018" },
        { _id: 2, host: "localhost:27019" }
    ]
});
  1. 验证副本集状态

通过执行以下命令,查看副本集的状态:

javascript 复制代码
rs.status();

如果配置正确,应该会显示副本集的状态信息,包括所有成员的同步状态。

数据插入与同步

在这个配置下,所有的写操作(插入、更新、删除)都会发送到主节点,然后主节点会将这些操作同步到从节点。下面是一个示例,展示如何在主节点上进行数据插入,并验证数据是否同步到从节点。

插入数据

连接到主节点并插入数据:

bash 复制代码
mongo --port 27017

在 MongoDB Shell 中执行以下命令:

javascript 复制代码
use myDatabase;

db.myCollection.insert({ name: "Alice", age: 30 });
db.myCollection.insert({ name: "Bob", age: 25 });

验证数据同步

连接到从节点并验证数据是否成功同步:

bash 复制代码
mongo --port 27018

在 MongoDB Shell 中执行以下命令:

javascript 复制代码
use myDatabase;

db.myCollection.find().pretty();

如果数据已经同步成功,你应该能在从节点上看到与主节点一致的数据。

故障恢复

在主节点发生故障时,从节点之一会被提升为新的主节点。MongoDB 中,副本集会自动选举新的主节点。你可以通过以下命令查看当前的主节点:

javascript 复制代码
rs.isMaster();

这将显示当前的主节点信息。如果需要手动将某个从节点提升为主节点,可以使用以下命令:

javascript 复制代码
rs.stepDown();

这个命令将当前的主节点降级,从而触发副本集选举新的主节点。

Node.js 示例代码

以下是一个使用 Node.js 与 MongoDB 副本集进行连接和操作的示例代码。

安装 MongoDB 的 Node.js 驱动

bash 复制代码
npm install mongodb

Node.js 代码示例

javascript 复制代码
const { MongoClient } = require('mongodb');

async function main() {
    const uri = "mongodb://localhost:27017,localhost:27018,localhost:27019/?replicaSet=rs0";
    const client = new MongoClient(uri, { useUnifiedTopology: true });

    try {
        await client.connect();
        console.log("Connected to the MongoDB replica set");

        const db = client.db('myDatabase');
        const collection = db.collection('myCollection');

        // 插入数据
        await collection.insertOne({ name: "Charlie", age: 22 });
        console.log("Data inserted");

        // 查询数据
        const data = await collection.find().toArray();
        console.log("Data retrieved:", data);

    } catch (err) {
        console.error(err);
    } finally {
        await client.close();
    }
}

main().catch(console.error);

这个示例展示了如何连接到 MongoDB 副本集,并进行数据插入和查询操作。通过使用 MongoDB 副本集的连接字符串,我们可以确保在主节点发生故障时,客户端可以自动连接到新的主节点。

结论

副本集是 MongoDB 提供的一种高可用性和数据冗余机制,通过配置副本集,我们可以实现主节点和从节点之间的数据同步和故障切换。这种机制大大增强了系统的可靠性和扩展性,是分布式数据库系统中常用的一种架构模式。

相关推荐
涡能增压发动积20 小时前
同样的代码循环 10次正常 循环 100次就抛异常?自定义 Comparator 的 bug 让我丢尽颜面
后端
Wenweno0o20 小时前
0基础Go语言Eino框架智能体实战-chatModel
开发语言·后端·golang
swg32132120 小时前
Spring Boot 3.X Oauth2 认证服务与资源服务
java·spring boot·后端
tyung20 小时前
一个 main.go 搞定协作白板:你画一笔,全世界都看见
后端·go
gelald20 小时前
SpringBoot - 自动配置原理
java·spring boot·后端
殷紫川20 小时前
深入拆解 Java 内存模型:从原子性、可见性到有序性,彻底搞懂 happen-before 规则
java·后端
元宝骑士20 小时前
FIND_IN_SET使用指南:场景、优缺点与MySQL优化策略
后端·mysql
用户319523703477120 小时前
记一次 PostgreSQL WAL 日志撑爆磁盘的排查
后端
nghxni20 小时前
LightESB PlatformHttp v3.0.0:JSONPath 订单转换 HTTP 路由实战
后端
武子康21 小时前
大数据-263 实时数仓-Canal 增量订阅与消费原理:MySQL Binlog 数据同步实践
大数据·hadoop·后端