簡體   English   中英

多個服務器上的django-celery基礎架構,代理為redis

[英]django-celery infrastructure over multiple servers, broker is redis

當前,我們在單個雲服務器上進行了所有設置,包括:

  • 數據庫服務器
  • 阿帕奇
  • 芹菜
  • redis擔任芹菜和其他一些任務的經紀人
  • 等等

現在,我們正在考慮將主要組件分解為單獨的服務器,例如單獨的數據庫服務器,媒體文件的單獨存儲,負載均衡器后面的Web服務器。 原因是不必為一台重型服務器付費,而不必使用負載平衡器按需創建服務器,從而降低成本並提高整體速度。

我真的只是對芹菜感到困惑,有人在負載均衡器后面的多個生產服務器上使用過芹菜嗎? 任何指導將不勝感激。

考慮一個小用例,它是當前在單台服務器上的完成方式(混淆是當我們使用多台服務器時如何完成):

  • 用戶上傳abc.pptx文件->引用存儲在數據庫中->存儲在服務器磁盤上
  • 創建任務(將文檔轉換為pdf)並將其放入redis(經紀人)隊列
  • 在同一服務器上運行的celery從隊列中選擇任務
    • 讀取文件,然后使用稱為docsplit軟件將其轉換為pdf
    • 在服務器磁盤上創建一個文件夾(稍后將用作靜態內容)將pdf文件及其縮略圖和純文本以及原始文件放入文件夾

考慮到上述用例,您如何設置多個可以執行相同功能的Web服務器?

可以從所有協作服務器訪問的共享存儲將極大地簡化您的處理。 通過這種設計,您可以將工作分配到更多服務器上,而不必擔心下一步處理將在哪個服務器上完成。

使用AWS S3(或類似的)雲存儲

如果您可以使用某些雲存儲,例如AWS S3,請使用它。

如果您的服務器也運行在AWS上,則無需為同一區域內的流量付費,並且傳輸速度非常快。

主要優點是,您的數據可在同一存儲桶/密鑰名稱下從所有服務器獲得,因此您不必費心誰在處理哪個文件,因為所有文件都在S3上共享存儲。

注意:如果需要清除舊文件,甚至可以在Give bucket上設置一些策略文件,例如刪除1天或1周以上的文件。

使用其他類型的共享存儲

還有更多選擇

  • 桑巴舞
  • 中央文件服務器
  • 的FTP
  • Google存儲(非常類似於AWS S3)
  • Swift(來自OpenStack)
  • 等等

對於小文件,您甚至可以使用Redis,但是由於種種原因,這種解決方案很少見。

Celery實際上使這變得非常簡單,因為您已經將任務放在隊列中了。 隨着更多工人的變化,所有工人都將接下隊列中的下一個任務,因此多個工人可以一次處理,每個人都在自己的計算機上進行處理。

這包括三個部分,您已經擁有其中之一。

  1. 共享存儲,以便所有計算機都可以訪問相同的文件
  2. 可以將任務分發給多個工作人員的經紀人-Redis可以做到這一點
  3. 多台機器上的工人

設置方法如下:

  • 用戶將文件上傳到前端服務器,該服務器存儲在您的共享存儲中(例如S3,Samba,NFS等),並將引用存儲在數據庫中
  • 前端服務器啟動芹菜任務來處理文件,例如

def my_view(request): # ... deal with storing the file file_in_db = store_file(request) my_process_file_task.delay(file_in_db.id) # Use PK of DB record # do rest of view logic...

  • 在每台處理機上,運行celery-worker: python manage.py celery worker --loglevel=INFO -Q default -E

然后,隨着添加更多計算機,您將擁有更多工人,並且工作將在它們之間分配。

需要確保的關鍵事項:

  • 您必須具有共享存儲,否則將變得更加復雜
  • 每台工作計算機必須具有正確的Django / Celery設置,才能找到redis代理和共享存儲(例如S3存儲桶,密鑰等)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM