2014-02-27 18 views
7

達到我使用celerybeat在Heroku與RedisToGo納米附加最大的客戶在Heroku和Redistogo納米

有一個網頁測功機和一個工人的DYNO

的celerybeat工人被設置成進行每分鐘的任務。

的問題是:每當我部署一個新的提交,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... 

和這些日誌無休止地繼續下去。直到我停止了這兩個dynos並重新啓動它們。

它已經成爲一個問題,因爲它幾乎每次部署新提交時都會發生。

任何想法爲什麼會發生這種情況,以及如何解決這個問題?

回答

9

nano redistogo計劃將併發redis連接限制在。

使用的redis連接數會根據您的前端和芹菜工作者設置而有所不同。這聽起來像你正在使用> = 5 redis連接爲您的生產堆棧。

當您部署新代碼時,Heroku將創建一個全新的堆棧。這意味着您在部署時使用> = 10個redis連接

有兩種方法來解決這個問題:

  • 增加允許redistogo的最大連接數,通過升級到一個更大的計劃($$$)
  • 減少使用的連接數你的籌碼(減少網絡工作者使用的芹菜併發或redis連接)

這是資源耗盡的一個簡單問題。我只需支付更大的RedisToGo計劃。

+0

+1 @Winfield可能是正確的,你可以發出'info'命令來獲取當前'connected_clients'的數量,這樣就可以檢查你當前實例的限制。您用於發佈「信息」的連接也會計數。如果您在排除實例故障時需要任何幫助,我只需通過電子郵件[email protected]在redistogo上工作即可。 – mogramer

+0

有沒有辦法讓redis/heroku在部署時關閉舊堆棧上的所有連接? – Erik

+1

問題在於時間 - 你的新的動力裝置即將到來,而舊的裝置正在降落。特別是如果您使用Preboot進行零宕機部署。保證所有舊連接和資源的唯一方法是在使用新連接和資源之前釋放所有舊連接和資源,這是在部署過程中將整個網站都關閉 - 我懷疑你是否想要這樣做。 – Winfield