将碎片从一个bigcouch服务器移动到另一个(用于平衡)

时间:2011-07-13 09:43:12

标签: nosql couchdb bigcouch

我目前正在测试bigcouch的大量数据(每天1500万条记录)。

当我需要生成数据视图时,我会遇到一些平衡问题,因为我的两台机器中的一台比另一台机器弱得多。结果是,更好的机器完成并且没有任何关系,而较弱的机器还有很多工作要做。 (单核与双核)

我现在的想法是将一些碎片从较弱的机器移动到另一台碎片,这样它们几乎可以在同一时间完成。

因此,我的问题是,如何将周末bigcouch服务器的分片移动到更好的分区?

感谢您的帮助+最好的问候!

安迪

1 个答案:

答案 0 :(得分:23)

Bigcouch分片只是CouchDB数据库,所以移动它们的过程非常简单。 Bigcouch的未​​来版本将自动化该过程,但是现在,我只是描述它。

一些背景知识将有助于解释。 Bigcouch节点正在侦听两个端口5984和5986.前端口5984看起来像CouchDB(虽然是集群和容错的)。后端口5986直接与特定节点上的底层CouchDB服务器通信。您会注意到除了数据库的分片之外,localhost还显示了两个额外的数据库:5986 / _all_dbs。一个称为“节点”,您在设置群集时已经与它进行了交互。另一个称为'dbs',包含每个集群数据库的文档,指定数据库每个分片的每个副本实际存在的位置。

所以,要移动一个碎片,你需要做一些事情;

  1. 识别分片文件。
  2. 将分片文件复制到新服务器。
  3. 告诉Bigcouch它的新位置。
  4. 如果需要,可以复制。
  5. 第1步

    在Bigcouch节点的数据目录中,您将找到这样的文件;

      

    碎片/ a0000000-bfffffff / foo.1312544893.couch

    所有分片都在shards /目录下组织,然后按范围组织,最后名称后跟一个随机数。

    选择数据库中的一个文件并记住其名称。

    第2步

    使用任何方法将此文件复制到目标服务器上的相同路径。 rsync和scp是很好的选择,CouchDB复制也是如此(确保从端口5986复制到端口5986)。

    第3步

    需要修改管理集群数据库布局的'dbs'中的文档。它看起来有点像这样;

      

    {“_ id”:“baz”,“_ rev”:“1-912fe2dd63e0a570a4ceb26fd742dffd”,“shard_suffix”:[46,49,51,49,50,53,52,53,50,49,55], “更新日志”:[[ “添加”, “00000000-7fffffff”, “dev1@127.0.0.1”],[ “添加”, “80000000-FFFFFFFF”, “dev1@127.0.0.1”]] “by_node”: { “dev1@127.0.0.1”:[ “00000000-7fffffff”, “80000000-FFFFFFFF”]} “by_range”:{ “00000000-7fffffff”:[ “dev1@127.0.0.1”], “80000000-FFFFFFFF” :[ “dev1@127.0.0.1”]}}

    更新by_node和by_range值,以便您移动的分片解析为新主机。

    此时您已经移动了碎片。但是,如果在您开始复制文件之后但在更新“dbs”文档之前有更新,那些写入发生在原始节点上并且不可见,因此您应该继续执行步骤4.如果没有更新,则可以删除原始服务器上的分片,但我建议您在端口5984上检查数据库,以确保所有文档都能正确显示。

    第4步

    执行从源分片到目标分片的复制,再次注意在每个分片的5986端口上执行此操作。这将确保所有更新再次可用。您现在可以在原始服务器上删除此分片的副本。

    HTH, Robert Newson - Cloudant。