1.以单机模式启动成员
当要对一个副本集中的数据进行维护时,既不能在主节点上进行,又不能在备份结点上进行(不能写),所以可以使用单机模式启动成员。
以单机模式启动服务器前,先查看服务器的命令参数。
db.serverCmdLineOpts()
要使此副本集中的其他成员无法连接此节点,只需更改此节点的监听端口
mongod –dbpath=D:/db –port 20000
2.副本集配置
创建副本集在前面已经介绍过,这里不再赘述。重要的是如何修改副本集成员
举个栗子:
rs.add(“spock:27017”) //添加新节点
rs.remove(“spock:27017”) //删除节点(按照host的字段值进行删除)
rs.add({“_id”:5,”host”:”spock:27017”,”priority”:0,”hidden”:”true”})
//可以通过此函数添加成员的复杂配置
另外,也可以通过rs.reconfig修改副本集成员的配置。但需要注意:
- 不能修改”_id”的值
- 不能将接受rs.reconfig命令的成员(通常是主节点)的优先级设为0
- 不能将仲裁节点更改为非仲裁节点,反过来也亦然
- 不能将“buildIndexes”:“false”的成员修改为“buildIndexes”:“false”
副本集最多只能拥有12个成员 其中 只有 7 个成员才能拥有投票权
设置
rs.add({“_id”:5,”host”:”server0:27017”,”votes”:0})
若希望某个成员优先被选举成为主节点,应该使用优先级(priority)
3.修改成员状态
rs.stepDown() //降级1min
rs.stepDown(600) //降级10分钟
rs.freeze(10000) //限制使之不能主动成为主节点10000s
rs.freeze(0) // 解冻
可以通过此种方式指定主节点 先把其他的冻结,只剩此节点 解冻
4.进入维护模式
当有读请求进入备份节点且拿到久数据,且不可忍耐(落后30s等),则可使此节点强制进行维护状态
db.dminCommand({“replSetMaintenanceMode”:true}) //进入维护模式
db.dminCommand({“replSetMaintenanceMode”:false}) //解除维护模式
5.复制图谱
db.adminCommand({replSetGetStatus:1})[‘syncingTo’]
server0:27017 //此为此节点的复制源
若所有节点在一个数据中心,则会产生无法忍受的延时
(A->B->C->D->E)
当应用程序在E上读数据,则不可忍受,可以通过:
db.adminCommand({“replSetSyncFrom”:”server0:27017”})
指定复制源为server0:27017
但一旦开始指定复制源,则会产生复制链
(A->B->C->A)
可以禁用复制链,所有数据均在主节点上复制
在config.setting.allowChaining设置为false(默认为true)
6.调整oplog.rs的大小
- 当前服务器若是主节点,让它降级退位
- 关闭当前服务器
- 将当前服务器以单机方式启动
临时将oplog中的最后一条insert操作保存下来
use local
var cursor = db.oplog.rs.find({“op”:”i”})
var lastInsert = cursor.sort({“$natural”:-1}).limit(1).next()
db.tempLastOp.save(lastInsert)
db.tempLastOp.findOne()
删除当前oplog
db.oplog.rs.frop()
创建一个新的oplog
将最后一条数据写入oplogdb.createCollection(“oplog.rs”,{“capped”:true,”size”:10000})
将当前服务器座位副本集成员重新启动var temp = db.tempLastOp.findOne()
db.oplog.rs.insert(temp)
db.oplog.rs.findOne() //确保成功