0

当我重新配置 Mongo 副本集时,我最终得到了一个随机递增的副本集版本号。一切正常,但我担心这个数字最终可能会溢出,因为它似乎呈几何级数递增。

如果我做:

conf = rs.conf()

并检查我会看到conf['version' ] = 1 然后我做:

conf['members'][0]['priority'] = 2
rs.reconfig(conf, {force:1})

它有效,我的 replset 已重新配置,但是当我这样做时:

conf = rs.conf()

conf['version']是类似的东西24956。如果我再做一次,它会变成83584and then282961等等(它并不总是那些确切的数字,但模式是相同的,随机大增量,通常加倍或更糟)。

即使我这样指定版本号,也会发生这种情况:

conf['members'][0]['priority'] = 2
conf['version'] = conf['version'] + 1
rs.reconfig(conf, {force:1})

有谁知道底层的 Mongo 发生了什么,以及如何让它具有可靠的版本号增量?(我在 Ubuntu 上运行 Mongo 2.0.2)。

顺便说一句,如果我通过 Mongo shell 执行此操作或使用 Pymongoconn.admin.command('replSetReconfig', config)通过 Python 脚本执行此操作,则会发生这种情况。

4

1 回答 1

2

大的随机增量是强制标志的实现方式。

https://github.com/mongodb/mongo/blob/master/src/mongo/db/repl/rs_config.cpp#L653

void ReplSetConfig::init(BSONObj cfg, bool force) {
    _constructed = false;
    clear();
    from(cfg);
    if( force ) {
        version += rand() % 100000 + 10000;
    }
    configAssert( version < 0 /*unspecified*/ || (version >= 1) );
    if( version < 1 )
        version = 1;
    _ok = true;
    _constructed = true;
}

副本集总是使用最高版本的配置。如果您已经获得了最高版本,则不需要强制。最大的飞跃是试图确保新配置始终是最高版本,即使该集合的另一个成员的版本比正在更新的版本新。

于 2013-10-22T13:19:02.013 回答