我正在试图弄清楚mongos服务器的不同实例是如何协同工作的。
如果我有1个配置服务器和一些分片,例如4个,每个分片只由一个节点组成(当然是主服务器),并且有4个mongos服务器...... mongos服务器之间是否进行通信?是否有可能一个mongos将其负载重定向到另一个mongos?
答案 0 :(得分:2)
当您有多个mongos实例时,它们不会自动在彼此之间进行负载平衡。他们甚至不了解彼此的存在。
大多数编程语言的MongoDB驱动程序允许在创建连接时指定多个mongos实例。在这种情况下,驱动程序通常会ping所有并连接到延迟最低的那个。这通常是地理上最接近的那个。当所有网络距离相同时,现在最不忙的网络距离通常会先响应。然后驱动程序将保持与那一个mongos的连接,除非程序明显重新连接或无法再访问mongos(在这种情况下,驱动程序通常会自动从初始列表中选择另一个)。
这意味着当您拥有大量低负载客户端而不是一个高负载客户端时,使用多个mongos实例通常只是一种有效的扩展方法。当您希望一个高负载客户端使用许多mongos实例时,您需要自己实现这一点,方法是创建一个与每个mongos实例的单独连接,并实现自己的机制来在它们之间分发查询。
答案 1 :(得分:2)
从MongoDB 2.4开始,mongos
服务器仅提供路由服务,以将读/写查询定向到适当的分片。 mongos
服务器通过配置服务器发现分片集群的配置。您可以在MongoDB文档中找到更多详细信息:Sharded Cluster Query Routing。
我正在试图弄清楚mongos服务器的不同实例是如何工作的。
mongos
服务器当前不直接相互通话。他们通过配置服务器协调活动的某些活动:
mongos
可start a balancing round,但一次只能启用一轮)如果我有1个configserver
您应该始终在生产中有3个配置服务器。如果您以某种方式丢失或损坏配置服务器,则必须合并数据并重新分片数据库。保存在配置服务器上的分片群集元数据是每个分片上应存在分片数据范围的权威来源。
一些分片,例如四个,每个分片只由一个节点组成(当然是主人)
如果您想要最佳的正常运行时间,理想情况下每个分片都应该由副本集支持。副本集提供自动故障转移,对于管理目的非常有用(例如,备份或离线添加索引)。
有可能一个mongos将其负载重定向到另一个mongos吗?
不,mongos
不执行任何负载平衡。典型的建议是为每个应用服务器部署一个mongos
。
从应用程序/驱动程序的角度来看,您可以在连接字符串中指定多个mongos
以进行故障转移。应用程序驱动程序通常会连接到最近的可用mongos
(通过网络ping时间),并在当前mongos
连接失败的情况下尝试重新连接。