考虑以下设置:
有2个物理服务器被设置为常规mongodb复制集(包括仲裁进程,因此自动故障转移将正常工作)。
现在,据我所知,大多数实际工作都将在主服务器上完成,而奴隶主要只是努力使其数据集保持同步。
在这个设置中引入分片是否合理,是否会在同一个服务器上设置另一个复制集,以便每个服务器都有一个mongod进程作为主要运行,一个进程作为辅助运行。
预期的结果是两个服务器都将共享实际查询/插入的工作量,而两者都是up。在一台服务器发生故障的情况下,整个设置应优雅地故障转移以继续运行,直到另一台服务器恢复。
除了设置和进程数量(mongos / configservers / arbiters)的整体开销外,此设置是否有任何缺点?
答案 0 :(得分:10)
这肯定有用。我之前在#mongodb IRC频道中问了一个问题,就是在一台机器上运行多个mongod进程是不是一个坏主意。答案是“只要你有RAM / CPU /带宽,就疯了”。
值得注意的是,如果您正在寻找高性能读取,并且不介意写入速度有点慢,您可以:
这将为您提供类似于MySQL的集群设置 - 在主服务器上写入一次,但任何从服务器都有资格进行读取。在你有更多读取而不是写入(例如,一个数量级)的情况下,这可能是更高的性能,但我不知道当节点发生故障时它的行为如何(因为写入可能会停止尝试写入到3个节点,但只有2个节点,等等 - 需要测试)。
答案 1 :(得分:1)
有一点需要注意的是,当两台计算机都启动时,您的查询将在它们之间进行分割。当一个人关闭时,所有查询都将转到剩余的机器上,从而使对它的要求加倍。你必须确保你的机器可以承受突然加倍的查询。
答案 2 :(得分:0)
您缺少一个关键细节:如果您只有两个物理节点进行分片设置,如果有一个死亡,您的所有数据都将消失。这是因为在分片层下面没有任何冗余(建议的方法是每个分片都由副本集组成)。
您对副本集的说法是正确的:您可以在两个无共享节点上运行它并拥有一个额外的仲裁器。但是,推荐的设置是3个节点:一个主节点和两个辅助节点。
http://www.markus-gattol.name/ws/mongodb.html#do_i_need_an_arbiter
答案 3 :(得分:0)
在这种情况下,我首先会重新考虑分片,然后将其设为2台机器的非分片副本(+1仲裁者)。