MongoDB

MongoDB 知识量:13 - 42 - 129

11.1 客户端到副本集的连接><

客户端连接副本集- 11.1.1 -

客户端到MongoDB副本集的连接行为主要表现在以下几个方面:

  1. 自动连接到主节点:客户端默认会连接到副本集中的主节点,并处理所有的读写请求。副本集会自动处理热备份,后台默默处理热备份。

  2. 自动故障转移:当主节点出现故障或不可用时,客户端会自动找到新的主节点,并将请求路由到新的主节点。这个过程是自动的,不需要人工干预。

  3. 等待写入复制:如果希望不管发什么都将写入操作保存到副本集中,那么必须要确保写入操作被同步到了副本集的“大多数”。这需要等待写入复制,以确保数据的一致性。

  4. 连接字符串URI:MongoDB提供了连接字符串URI来方便地连接到副本集。通过解析URI,客户端可以连接到副本集中的任何一个成员。

  5. 设置连接数:在客户端连接池设置中,可以设置最大连接数,以限制与数据库的连接数。这有助于优化性能和资源利用率。

在写入时等待复制- 11.1.2 -

MongoDB副本集在写入时等待复制的操作,通常是通过设置“w”参数来实现的。这个参数指定了写入操作需要等待多少个节点确认写操作完成。如果设置为“majority”,则表示需要等待大多数节点(包括主节点和副本节点)都完成写入操作。这样可以确保数据的一致性,但也可能会影响写入性能。

此外,MongoDB还提供了getLastError命令来检查写入是否成功。通过使用这个命令,可以强制等待所有节点都完成写入操作,直到给定数量的成员都执行完了最后的写入操作。

在配置MongoDB副本集时,还可以设置“wtimeout”参数来设置超时时间。如果超过了指定的超时时间还没有返回结果,则写入操作会被认为是失败的。这有助于避免因等待过长时间而导致的性能问题。

以下是一个使用MongoDB副本集进行写入操作的示例:

const MongoClient = require('mongodb').MongoClient;  
const uri = 'mongodb://localhost:27017,localhost:27018,localhost:27019/?readPreference=primary&replicaSet=rs0&authSource=admin';  
const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });  
  
client.connect(err => {  
  const collection = client.db('mydb').collection('mycollection');  
  const doc = { field: 'value' };  
  collection.insertOne(doc, { w: 'majority', wtimeout: 5000 }, err => {  
    if (err) {  
      console.error('Error writing to MongoDB:', err);  
    } else {  
      console.log('Successfully wrote to MongoDB');  
    }  
    client.close();  
  });  
});

在上述示例中,首先创建了一个MongoClient实例,并指定了连接的URI。URI中包含了副本集的成员地址、读偏好设置和认证源等信息。然后,连接到MongoDB,并获取指定数据库和集合的实例。接下来,使用insertOne方法插入一个文档,并使用“w”参数设置为“majority”,表示需要等待大多数节点完成写入操作。同时,还设置了“wtimeout”参数为5000毫秒,表示等待超时时间为5秒。最后,检查是否有错误发生,并关闭MongoDB连接。