### 一、检测机制
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副本集中,并将其设置为隐藏节点。












网友评论