当前位置:  开发笔记 > 编程语言 > 正文

阻止,直到新的副本集配置到位

如何解决《阻止,直到新的副本集配置到位》经验,为你挑选了0个好方法。

我的Python Web应用程序有几个连接注册到同一个MongoDb服务器,但有3个不同的数据库.该应用程序由4名Gunicorn工作人员运行.

我正在使用副本集.

当主节点关闭时,当前查询失败并在MongoReplicaSetClient中安排刷新(2.8,但我猜在3.2中它是相同的).如果时间选择了新的主节点,并且MonitorThread获取有关更新客户端连接的信息,则下一个查询可能会成功.

但刷新仅影响此客户端.连接同一MongoDB服务器的其他客户端不受影响 - 每个客户端都会发生相同的故事.这意味着如果每个工作者连接到同一个MongoDB服务器上的3个数据库,并且我重复相同的HTTP请求,当主要服务器失败时使用所有3个数据库,则无限时间更新所有连接的客户端.如果每个HTTP请求循环到4个中的每个工作者,我们需要12个请求来更新每个Mongo客户端.但实际上这些要求并不是循环的.

查看PyMongo代码, MongoReplicaSetClient._send_message_with_response我看到当主要关闭时,self.disconnect调用哪些调用self.__schedule_refresh.此方法具有参数sync,允许"阻止直到刷新完成".

我的想法是捕获AutoReconnect异常并调用__schedule_refresh(sync=True)连接到故障主节点和块的所有客户端,直到新的副本集配置到位.因此,在数据库正常之前,不会处理HTTP请求(导致500).

但这__schedule_refresh是一种私人方法.此外,我不知道是否在所有客户端上顺序调用它会很快 - 看起来MonitorThread它是否间隔工作.

或者也许我可以使用MongoReplicaSetClient.refresh.

你对这个想法有什么看法?它有缺点吗?

你能帮我实现一下吗?

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有