我们正在使用一个由4名成员组成的mongo副本,以及一名仲裁者。有3个物理站点,所有mongo服务器可以相互通信:
第1站(西海岸)site1-mg01 site1-mg02
第2站(东海岸)site2-mg03 site2-mg04
站点3(仅限云,仲裁者)site3-mgarbiter
我们有一个Java客户端。我更喜欢客户端永远不会连接到其他站点中的Mongo服务器,即使其中一台服务器成为主服务器(延迟会终止应用程序。)或者采用不同的方式
Site 1 Java App连接到site1-mg01和site1-mg02
站点2 JavaApp连接到site2-mg03和site2-mg04
客户只能知道副本集的一部分是否可以接受?因此,如果Web客户端实际上只能访问站点1,并且我按如下方式设置了我的副本集:
“站点1-MG01:270xx,站点1-MG02:270xx”
我的客户会受到负面影响吗?我认为它的工作方式,只要其中一个服务器是主要的,它会连接好吗?如果Site 2 Mongo成为主要的,我就是无法连接?
答案 0 :(得分:1)
在Mongo中,所有写入都是对主要进行的。 如果您的客户是“只读”,则可以在查询中使用“最近”的读取首选项。 另一种选择是连接到非主节点并设置rs.slaveOk以允许客户端读取。 https://docs.mongodb.org/v3.0/reference/method/rs.slaveOk/
希望它有所帮助。答案 1 :(得分:1)
Mongo副本集 - 客户是否需要了解所有这些副本?
否 - 待定
客户只能知道副本集的一部分是否可以接受?
事实上,对于客户端应用程序 - 通过Java驱动程序 - 就足以了解"知道"只有该集合中的一个成员。其余的集成员可以通过单个成员配置访问。
我的客户会受到负面影响吗?
是的,在仅设置该集合中的单个数据中心成员部分的情况下,您不能保护自己免受数据中心停机且客户端无法初始连接到该集合的情况的影响。您应该更好地配置一个服务器地址数组,该数组首先包含西海岸的成员,然后是东海岸的成员。应由东海岸客户申请表反转的订单。
为了安全起见,您应该配置三个成员服务器地址,以确保如果该集合正常运行,您可以连接至三个幸存节点中的至少一个。在这种情况下,将仲裁器原样添加到中立数据中心如果两个成员离开,它们很可能都来自同一个DC。
我认为它的工作方式,只要其中一个服务器是主要的,它会连接好吗?
如上所述,您不一定需要连接到主要,只需要知道知道主要位置的成员。
如果Site 2 Mongo成为主要的,我就无法连接?
是的,你可以。
我希望客户端永远不会连接到其他站点中的Mongo服务器,即使其中一台服务器成为主服务器
客户当然总是写信给主要人员,对哪个DC不重要。如果您希望应用程序始终从其指定的数据中心读取,则实现该应用程序的最佳方法是通过read preference tag sets。