【问题标题】:Different indexes on different replica set members不同副本集成员上的不同索引
【发布时间】:2013-05-04 13:20:07
【问题描述】:

作为 mongo 集群的一部分,我们有一个隐藏节点,分析人员使用该节点进行报告。他们的查询与我们的主应用程序优化的查询有很大不同。

我们可以通过添加某些索引来显着提高他们的查询性能,这些索引的计算成本相对较高,并且占用了相当多的内存。这些索引不应该被在我们的主要成员和次要成员上运行的任何查询使用,因此在主要副本集成员上花费时间和内存来计算并将报告索引保存在内存中似乎有点愚蠢。

有没有办法创建一个索引,使它只存在于单个副本集成员上?有没有办法告诉我的主节点和辅助节点不计算或存储我知道它们不会使用的索引?

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    是的 - 您可以对用于在副本集中创建新索引的策略使用变体,而无需停机。这将要求在创建索引时使隐藏的成员脱机。

    这里是策略的链接:http://docs.mongodb.org/manual/tutorial/build-indexes-on-replica-sets/#procedure

    在您的情况下,您将使隐藏的成员脱机并以独立模式重新启动(删除 --replSet 选项并使用不同的端口号)。一旦成员被隔离,您就可以调整索引(删除不需要的索引并添加新的索引)。创建索引后,使用旧端口和 --replSet 选项重新启动成员。

    隐藏的成员将重新同步到副本集,你就准备好了。

    【讨论】:

    • 有趣。我的问题是我绝对不想将索引传播回主服务器。它们会显着降低写入性能。
    • 他们不会。索引仅在创建时从主节点传播到辅助节点。由于这是一个隐藏成员,它永远不会是主要的,并且索引永远不会被传播。您必须从副本集中删除该成员,否则它是只读的并且将拒绝创建索引。一旦它被创建,成员就会很高兴地维护它。
    • 从技术上讲,这不是真的 - 辅助服务器当然可以与其他辅助服务器同步。但是,它们不会(通常)从隐藏的辅助节点同步,所以既然这个节点是隐藏的,你应该没问题。
    • 即使您后来将“隐藏”服务器提升为主服务器,索引也不会传播到其他服务器。原因是,如果您将辅助节点从副本集中取出(开始时不使用 --replSet 选项),则在 mongod 以独立模式运行时,不会将任何内容写入 oplog。因此,永远不会提及在 oplog 中创建此类索引,并且由于服务器仅通过读取 oplog 进行同步,因此索引不会传播。
    • 实际上我想到的只有一种情况可以将索引扩展到其他服务器,那就是如果您从“隐藏”服务器执行backups 然后启动一个新的备份的服务器,它将具有与原始服务器相同的索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    相关资源
    最近更新 更多