【问题标题】:Maximum clients reached on Heroku and Redistogo Nano在 Heroku 和 Redistogo Nano 上达到的最大客户数
【发布时间】:2016-11-07 08:44:38
【问题描述】:

我在 Heroku 上使用 celerybeat 和 RedisToGo Nano 插件

有一个 web dyno 和一个 worker dyno

celerybeat worker 设置为每分钟执行一项任务。

问题是:每当我部署一个新的提交时,dynos 重新启动,我得到这个错误

2014-02-27T13:19:31.552352+00:00 app[worker.1]: Traceback (most recent call last):
2014-02-27T13:19:31.552352+00:00 app[worker.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/celery/worker/consumer.py", line 389, in start
2014-02-27T13:19:31.552352+00:00 app[worker.1]:     self.reset_connection()
2014-02-27T13:19:31.552352+00:00 app[worker.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/celery/worker/consumer.py", line 727, in reset_connection
2014-02-27T13:19:31.552352+00:00 app[worker.1]:     self.connection = self._open_connection()
2014-02-27T13:19:31.552352+00:00 app[worker.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/celery/worker/consumer.py", line 792, in _open_connection
2014-02-27T13:19:31.552352+00:00 app[worker.1]:     callback=self.maybe_shutdown)
2014-02-27T13:18:23.864287+00:00 app[worker.1]:     self.on_connect()
2014-02-27T13:18:23.864287+00:00 app[worker.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/redis/connection.py", line 263, in on_connect
2014-02-27T13:18:23.864287+00:00 app[worker.1]:     if nativestr(self.read_response()) != 'OK':
2014-02-27T13:18:23.864287+00:00 app[worker.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/redis/connection.py", line 314, in read_response
2014-02-27T13:18:23.864287+00:00 app[worker.1]:     raise response
2014-02-27T13:18:23.864287+00:00 app[worker.1]: ResponseError: max number of clients reached
2014-02-27T13:19:31.552352+00:00 app[worker.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/kombu/connection.py", line 272, in ensure_connection
2014-02-27T13:19:31.552352+00:00 app[worker.1]:     interval_start, interval_step, interval_max, callback)
2014-02-27T13:19:31.552591+00:00 app[worker.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/kombu/utils/__init__.py", line 218, in retry_over_time
2014-02-27T13:19:31.552591+00:00 app[worker.1]:     return fun(*args, **kwargs)
2014-02-27T13:19:31.552591+00:00 app[worker.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/kombu/connection.py", line 162, in connect
2014-02-27T13:19:31.552591+00:00 app[worker.1]:     return self.connection
2014-02-27T13:19:31.552591+00:00 app[worker.1]:   File "/app/.heroku/python/lib/python2.7/site-packages/kombu/connection.py", line 617, in connection
2014-02-27T13:18:23.870811+00:00 app[worker.1]: [2014-02-27 13:18:23,870: ERROR/MainProcess] consumer: Connection to broker lost. Trying to re-establish the connection...

这些日志会无休止地继续下去。直到我停止两个测功机并重新启动它们。

这已经成为一个问题,因为它几乎在每次部署新提交时都会发生。

任何想法为什么会发生这种情况以及如何解决这个问题?

【问题讨论】:

    标签: heroku redis celery celerybeat redistogo


    【解决方案1】:

    nano redistogo 计划将并发 redis 连接限制在 10

    使用的 redis 连接数将根据您的前端和 celery worker 设置而有所不同。听起来您正在为生产堆栈使用 >= 5 个 redis 连接

    当您部署新代码时,Heroku 会启动一个全新的堆栈。这意味着您在部署时使用了 >= 10 个 redis 连接

    有两种方法可以解决这个问题:

    • 通过升级到更大的计划 ($$$) 来增加允许的最大 redistogo 连接数
    • 减少堆栈使用的连接数(减少 Web Worker 使用的 celery 并发或 redis 连接)

    这是一个简单的资源耗尽问题。我只会为更大的 RedisToGo 计划付费。

    【讨论】:

    • +1 @Winfield 可能是正确的,您可以发出info 命令来获取当前connected_clients 的数量,这样您就可以检查当前实例的限制。您用来发出info 的连接也很重要。我在 redistogo 工作,如果您需要任何帮助来解决您的实例问题,请发送电子邮件至 support@redistogo.com。
    • 有没有办法让 redis/heroku 在部署时关闭旧堆栈上的任何连接?
    • 问题在于时机——你的新dynos正在出现,而旧的dynos正在下降。特别是如果您使用 Preboot 进行零停机部署。确保在使用新连接和资源之前释放所有旧连接和资源的唯一方法是在部署期间关闭整个站点 - 我怀疑您是否想要这样做。
    猜你喜欢
    • 1970-01-01
    • 2015-12-13
    • 2023-02-04
    • 2018-11-27
    • 2014-05-13
    • 2015-05-04
    • 2020-06-07
    • 1970-01-01
    • 2012-08-28
    相关资源
    最近更新 更多