副本集管理

来源:互联网 发布:自学剑道软件 编辑:程序博客网 时间:2024/05/02 20:20

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

    db.createCollection(“oplog.rs”,{“capped”:true,”size”:10000})

  • 将最后一条数据写入oplog

    var temp = db.tempLastOp.findOne()
    db.oplog.rs.insert(temp)
    db.oplog.rs.findOne() //确保成功

  • 将当前服务器座位副本集成员重新启动
  • 0 0