PSA架构的问题
众所周知,PSA架构中如果Secondary发生故障会带来一系列的问题,包括
- Majority写入无法完成
- 造成主库内存压力的增加
- 重启主库需要更多的时间
- 特殊情况下会导致数据的丢失
所以副本集架构中最好的方式是PSS的架构
当前环境
Primary | vm003:28001 |
Secondary | vm002:28001 |
Arb | vm001:28000 |
需求是将副本集架构修改为:
Primary | vm003:28001 |
Secondary | vm002:28001 |
Secondary | vm001:28001 |
操作过程
添加Secondary节点
方法1:使用初始化的方式进行同步
- 在vm001上面创建mongodb实例
```
[root@vm001 conf]# cat rs1.conf
storage:
dbPath: "/mg_data/rs1/data"
systemLog:
destination: file
path: "/mg_data/rs1/log/mongo1.log"
logAppend: true
net:
port: "28001"
bindIp: localhost,vm001
processManagement:
fork: true
replication:
replSetName: rs0
security:
keyFile: /mg_data/rs1/pki/myrp-keyfile
```
启动实例
mongd -f rs1.conf
- 添加实例
添加之前建议备份rs.conf()的内容
```
rs.add("vm001:28001");
```
方式2:使用同步其它节点数据目录的方式进行同步
对于一些数据量比较大的节点,初始化的时间可能会很长,同时会对主库的性能造成一定的影响,那么这个时候就可以采用同步其它节点数据目录的方式快速创建备库。但是PSA结构下要注意对majority写入的影响
- 修改默认写关注
```
db.adminCommand({
"setDefaultRWConcern" : 1,
"defaultWriteConcern" : {
"w" : "majority"
}
})
```
在同步现有secondary数据目录的时候需要先停止这个secondary。但对于PSA架构来说停止secondary的关闭会带来一系列的影响。
- 停止备库并且复制备库数据文件目录到新节点
```
vm002上操作
mongod -f /mg_data/rs1/conf/rs1.conf
scp -r /mg_data/rs1/data/ vm001:/mg_data/rs1/
```
- 在vm003上面启动mongod实例
- remove原来的仲裁节点
```
mongod -f /mg_data/rs1/conf/arb_rs1.conf --shutdown
连接到primary
rs.remove("vm001:28000")
```
- 恢复默认的写关注
db.adminCommand({
"setDefaultRWConcern" : 1,
"defaultWriteConcern" : {
"w" : "majority"
}
})
总结
需要注意的问题:
1、注意当Secondary关闭之后对主库的影响
2、注意OPLOG的保留期限