美文网首页
MongoDB系列~副本集

MongoDB系列~副本集

作者: 开心的蛋黄派 | 来源:发表于2024-01-14 15:25 被阅读0次

### 一、检测机制

MongoDB的每个节点成员都会同其他节点进行周期性的节点检测。如果超过一定的阈值没有反馈,就认为其他节点不可用。当主节点挂掉后,MongoDB的所有从节点会进行选举,选举机制是类Raft协议。

### 二、当选成新主的条件

1. 集群已不存在Primary节点。

2. Optime必须是所有成员中最新的,也即数据是最新的。

3. 优先级非0(仲裁节点和备用节点除外)。

4. 收获超过集群所有成员超过一半以上的投票数。

### 三、高可用切换

```javascript

config = rs.conf();

config.members[_id] = 6;

rs.reconfig(config);

```

注意:`_id` 需要替换为具体的成员ID。

### 四、副本集角色解读

- **PRIMARY**:主节点

- **SECONDARY**:从节点

- **ARBITER**:仲裁节点

- **STARTUP**:全量同步状态

- **RECOVERING**:恢复中,需要重做从库,从库所需Oplog已经不存在

- **ROLLBACK**:回滚中,如果一个主节点在写入数据后未同步到从节点就宕机,新的主节点选举出来后,老的主节点会发生回滚

- **DOWN**:服务不可达,需要启动服务

- **REMOVED**:已移除

### 五、同步细节

- 3.2版本之前:建立`_id`索引 -> 同步数据 -> 建立其他索引 -> 拉取增量Oplog并应用。

- 3.2版本之后:建立所有索引 -> 同步数据 -> 应用本地Oplog。先建索引后同步数据是关键。

### 六、读写分离特性

在副本节点上设置 `rs.slaveOk();` 并添加 `readPreference=xx` 代码设置。包括:

- **primary**:默认参数,只从主节点读取。

- **primaryPreferred**:大部分从主节点读取,主节点不可用时从Secondary节点读取。

- **secondary**:只从Secondary节点读取,数据可能“旧”。

- **secondaryPreferred**:优先从Secondary节点读取,不可用时从主节点读取。

- **nearest**:从网络延迟最低的节点读取。

### 七、Oplog设置

- 默认为磁盘的5%(1G下限-50G上限),符合大多数情况。

- 在线调整大小可以通过滚动调整实现。

- 3.4及更早版本可以直接删除并重建`local.oplog.rs`集合来调整大小。

- 更高版本禁止删除Oplog。

- 使用命令`use local; db.oplog.rs.stats().maxSize; db.adminCommand({replSetResizeOplog:1,size:1000}); db.runCommand({"compact" : "oplog.rs"});`进行调整和压缩。

### 八、搭建相关

- 本地测试环境应使用具体IP地址而非127.0.0.1。

- 尽量使用真实IP地址而非域名。

```javascript

config = {

    "_id": "rs0",

    "members": [

        {

            "_id": 0,

            "priority": 3,

            "host": "xxxx:27017",

        },

        // ... 其他成员配置 ...

    ]

};

rs.initiate(config);

```

### 九、更改副本集配置(域名转化为IP)

```javascript

cfg = rs.conf();

cfg.members[0].host = "xx:27011";

cfg.members[1].host = "xx:27011";

// 注意:这里应该是其他成员的ID,避免重复设置同一个成员

cfg.members[2].host = "xx:27011";

rs.reconfig(cfg);

rs.status();

```

### 十、副本集开启认证

1. 在Primary节点上创建root用户。

2. 生成keyfile文件:`openssl rand -base64 741 > /keys/mongo-keyfile` 并设置权限 `chmod 400 /keys/mongo-keyfile`。

3. 在配置文件中添加 `keyfile=/keys/mongo-keyfile`。

4. 重启整个副本集。

请注意,在实际操作中,需要根据实际情况替换上述代码中的占位符(如`xxxx:27017`、`xx:27011`等)为具体的IP地址或端口号,并确保MongoDB的配置文件和keyfile的路径及权限设置正确。

### 十一、新节点加入设置hidden属性

在MongoDB中,当你想要添加一个新节点到副本集,并希望这个新节点默认是隐藏的(即,设置为`hidden`),你需要在添加节点时指定其配置。以下是如何在添加新节点时设置`hidden`属性的步骤:

1. **连接到MongoDB实例**:

  使用`mongo` shell或MongoDB客户端连接到你的MongoDB副本集中的任意一个成员。

2. **修改副本集配置**:

  你需要先获取当前的副本集配置,然后添加新成员的配置,并确保在新的成员配置中设置`hidden: true`。

  以下是一个示例,展示如何使用`mongo` shell将一个新节点添加到副本集,并将其设置为隐藏:

  ```javascript

  // 连接到MongoDB shell

  mongo

  // 获取当前副本集配置

  var currentConfig = rs.conf();

  // 定义新成员的配置

  var newMemberConfig = {

      _id: <新的成员ID>, // 确保这个ID是唯一的,并且没有被当前副本集中的其他成员使用

      host: "<新节点的hostname>:<端口号>", // 替换为新节点的实际主机名和端口号

      hidden: true // 设置新节点为隐藏节点

  };

  // 将新成员添加到副本集配置中

  currentConfig.members.push(newMemberConfig);

  // 重新配置副本集

  rs.reconfig(currentConfig, {force: true});

  ```

  请确保替换`<新的成员ID>`、`<新节点的hostname>`和`<端口号>`为实际的值。

3. **验证新节点的添加**:

  重新配置后,你可以使用`rs.status()`命令来检查新节点是否已经成功添加到副本集中,并且其`hidden`属性是否已正确设置。

4. **注意事项**:

  - 添加新节点并设置其属性时,需要确保整个操作过程的原子性,以避免在重新配置过程中出现数据不一致的情况。

  - 设置`hidden: true`意味着这个节点将不会成为主节点,并且在默认的读取偏好设置下,客户端不会从该节点读取数据。

  - 在修改副本集配置之前,请确保所有节点都是可达的,以避免网络问题导致重新配置失败。

通过遵循以上步骤,你可以成功地将一个新节点添加到MongoDB副本集中,并将其设置为隐藏节点。

相关文章

网友评论

      本文标题:MongoDB系列~副本集

      本文链接:https://www.haomeiwen.com/subject/gomxodtx.html