Nodejs 询问一个mongodb sharding的问题

Nodejs 询问一个mongodb sharding的问题

假设有三台主机 做成一组replica set 并且三台使用一组sharding A B C s1/primary s2/secondary s3/secondary

如果B主机挂点 查询的时候s2的分片内容会不可用吗 会问这个问题 是因为大部分的replicat set与sharding建议最低配置是三台 并且设置两组replicat set与sharding A B C rs1 s1.1/primary s1.2/secondary s1.3/secondary rs2 s2.1/primary s2.2/secondary s2.3/secondary

假设B主机挂点 那B上面的两个shading也跟着失效 那做两组replicat set有意义吗? 谢谢


2 回复

Node.js 询问一个 MongoDB Sharding 的问题

问题描述

假设你有三台主机(A、B、C)组成一个复制集(Replica Set),并在这三台主机上配置了分片(Sharding)。具体配置如下:

  • A 主机作为主节点(Primary)
  • B 和 C 主机作为从节点(Secondary)
A (s1/primary)               B (s2/secondary)              C (s3/secondary)

如果 B 主机出现故障或不可用,查询时是否会影响到 B 上的分片数据?

此外,如果我们将两组复制集与分片组合在一起,每组都有三个节点,并且假设 B 主机挂掉,那么这是否会影响两组复制集和分片的有效性?

示例配置

假设你有以下两组复制集和分片配置:

A (rs1/s1.1/primary)               B (rs1/s1.2/secondary)              C (rs1/s1.3/secondary)
D (rs2/s2.1/primary)               E (rs2/s2.2/secondary)              F (rs2/s2.3/secondary)

分析

  1. 单个复制集和分片

    在一个复制集中,如果主节点(Primary)不可用,MongoDB 会自动从副本集中选举出一个新的主节点。如果所有从节点(Secondary)都不可用,则整个复制集将无法提供读写服务。

    如果 B 主机挂掉,MongoDB 将尝试从 C 主机选举新的主节点。如果选举成功,查询将继续可用。但如果选举失败,查询可能会受到影响。

    // Node.js 示例代码
    const MongoClient = require('mongodb').MongoClient;
    const uri = "mongodb://A:27017,B:27017,C:27017/?replicaSet=rs1";
    
    MongoClient.connect(uri, { useNewUrlParser: true, useUnifiedTopology: true }, (err, client) => {
      if (err) {
        console.error("连接失败:", err);
        return;
      }
      console.log("连接成功");
      const db = client.db("mydatabase");
      db.collection("mycollection").find({}).toArray((err, docs) => {
        if (err) {
          console.error("查询失败:", err);
        } else {
          console.log("查询结果:", docs);
        }
        client.close();
      });
    });
    
  2. 双复制集和分片

    当有两个独立的复制集时,每个复制集的健康状况独立于另一个。因此,即使 B 主机挂掉,只会影响到其所在的复制集(rs1),而不会影响到另一个复制集(rs2)。

    // Node.js 示例代码
    const MongoClient = require('mongodb').MongoClient;
    const uri1 = "mongodb://A:27017,B:27017,C:27017/?replicaSet=rs1";
    const uri2 = "mongodb://D:27017,E:27017,F:27017/?replicaSet=rs2";
    
    MongoClient.connect(uri1, { useNewUrlParser: true, useUnifiedTopology: true }, (err, client1) => {
      if (err) {
        console.error("连接失败 rs1:", err);
        return;
      }
      console.log("连接成功 rs1");
      const db1 = client1.db("mydatabase1");
      db1.collection("mycollection1").find({}).toArray((err, docs) => {
        if (err) {
          console.error("查询失败 rs1:", err);
        } else {
          console.log("查询结果 rs1:", docs);
        }
        client1.close();
      });
    });
    
    MongoClient.connect(uri2, { useNewUrlParser: true, useUnifiedTopology: true }, (err, client2) => {
      if (err) {
        console.error("连接失败 rs2:", err);
        return;
      }
      console.log("连接成功 rs2");
      const db2 = client2.db("mydatabase2");
      db2.collection("mycollection2").find({}).toArray((err, docs) => {
        if (err) {
          console.error("查询失败 rs2:", err);
        } else {
          console.log("查询结果 rs2:", docs);
        }
        client2.close();
      });
    });
    

总结

通过上述分析可以看出,如果你配置了两组独立的复制集和分片,即使其中一组复制集中的某个节点挂掉,也不会影响另一组复制集的功能。因此,这样的配置是有意义的,可以提高系统的高可用性和容错能力。


当涉及到MongoDB的Sharding和Replica Sets时,需要理解它们各自的工作机制以及它们之间的交互。

MongoDB Sharding 和 Replica Sets

  • Sharding:将数据分布在多个机器上以提高可扩展性。
  • Replica Set:提供冗余和高可用性。

假设你有一个由三台主机组成的Sharded Cluster:

A (s1/primary)
B (s2/secondary)
C (s3/secondary)

在这个配置中,s1 是主分片(Primary Shard),而 s2s3 是从分片(Secondary Shards)。如果 B 主机挂掉,即 s2 不再可用,查询结果可能会受到影响,因为某些数据可能存储在 s2 上。然而,由于MongoDB的复制机制,只要主节点 s1 仍然可用,系统可以继续处理读写请求,但性能和可用性可能会受到一定程度的影响。

关于你的问题

单个Replica Set内的Sharding

在一个单个的Replica Set内,如果其中一个Secondary节点挂掉,系统不会立即完全失效,因为Primary节点仍然可以处理所有读写操作。但是,如果你对Secondary节点进行读取操作,则这些读取可能会失败或变得缓慢。

两组Replica Set和Sharding

如果有两组独立的Replica Sets,如:

rs1 (A/s1.1/primary, B/s1.2/secondary, C/s1.3/secondary)
rs2 (D/s2.1/primary, E/s2.2/secondary, F/s2.3/secondary)

每个Replica Set的Secondary节点挂掉不会影响另一个Replica Set的功能。每个Replica Set都是独立运行的。因此,即使 B 挂掉,rs2 依然可以正常工作。

示例代码

以下是一些Node.js代码片段,展示如何连接到MongoDB集群并执行基本操作:

const { MongoClient } = require('mongodb');

async function main() {
    const uri = "your_mongodb_connection_string";
    const client = new MongoClient(uri);

    try {
        await client.connect();
        console.log("Connected successfully to server");

        const db = client.db("your_database_name");
        const collection = db.collection("your_collection_name");

        // Insert a document
        await collection.insertOne({ name: "Test Document" });

        // Find a document
        const cursor = collection.find({});
        await cursor.forEach(doc => console.log(doc));
    } finally {
        await client.close();
    }
}

main().catch(console.error);

总结

每个Replica Set内的Secondary节点挂掉会影响该Replica Set的读取性能,但不会导致整个系统的完全崩溃。独立的Replica Set之间互不影响,因此使用多组Replica Set确实有助于提高系统的可用性和可靠性。

回到顶部