2014-05-08 29 views
1

目前我們有一個雲服務器上的所有設置,包括:在多個服務器上的Django芹菜基礎設施,券商Redis的

  • 數據庫服務器
  • 阿帕奇
  • 芹菜
  • Redis的作爲芹菜經紀人和其他一些任務
  • etc

現在我們正在考慮拆分主要組件以分離服務器,例如單獨的數據庫服務器,媒體文件的獨立存儲,負載均衡器後面的Web服務器。原因是不支付一臺繁重的服務器,並使用負載平衡器按需創建服務器,以降低成本並提高總體速度。

我真搞不清楚只有芹菜,有沒有人用過芹菜對負載平衡器背後的多個生產服務器?任何指導將不勝感激。

考慮這是目前它是如何被單個服務器上完成(混亂是如何可以做,當我們使用多個服務器)一個小的用例:

  • 用戶上載abc.pptx文件 - >參考被存儲在數據庫 - >存儲在服務器的磁盤上
  • 任務(轉換文件PDF)被創建並進入在redis的(代理)隊列
  • 芹菜其同一個服務器上運行的主從隊列任務
    • 閱讀文件,使用軟件稱爲docsplit
    • 將其轉換爲PDF創建服務器磁盤上的文件夾(這將被用來作爲靜態內容以後)把PDF文件及其縮略圖以及純文本和原始文件

考慮到上述的使用情況,你怎麼設置了多個Web服務器可以執行相同的功能?

+0

celeryd過程splited在多個服務器上? – christophe31

+0

你可以簡單地啓動多個celeryd ,,(至少RabbitMQ的經紀人酒館酥餅,任播) – christophe31

回答

3

什麼將極大地簡化您的處理過程,這是一些共享存儲,可從所有協作服務器訪問。通過這樣的設計,您可以將工作分配給更多的服務器,而無需擔心將在哪個服務器上完成下一個處理步驟。

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

如果你可以使用一些雲存儲,像AWS S3,使用。

如果你有在AWS上運行您的服務器也一樣,你不要在同一區域內的支付業務,並轉移是相當快的。

主要優點是,你的數據都可以從同一個桶/鍵名下的所有服務器,所以你不必理會誰是處理這些文件,因爲所有對S3的共享存儲。

注:如果您需要擺脫舊文件,你甚至可以設置在給定桶,例如一些政策性文件刪除超過1天或1周的文件。

使用其他類型的共享存儲

人有更多的選擇

  • 桑巴
  • 中央文件服務器
  • FTP
  • 谷歌存儲(非常類似於AWS S3)
  • 夫特(從開棧)

對於小文件,你甚至可以使用Redis,但這種解決方案是有很好的理由相當罕見。

1

芹菜實際上使得這個很簡單,因爲你已經把任務上的隊列。所有這些隨着更多工人而變化的是,每個工人都會在隊列中接下來的任務 - 所以多名工人可以一次處理,每個工人都可以在自己的機器上處理。

有三個部分,這一點,你已經得到了他們中的一個。

  1. 共享存儲,讓所有的機器可以訪問同一文件
  2. ,可以把手伸到任務到多個工人經紀人 - Redis的是罰款,在多臺機器是
  3. 工人

以下是您如何設置它:

  • 用戶上傳文件到存儲在您的共享存儲中的前端服務器(例如S3,Samb一,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...

  • 在加工機,運行芹菜工人: python manage.py celery worker --loglevel=INFO -Q default -E

然後當您添加更多的機器,你就會有更多的工人和工作將被分割它們之間。

主要事項,以確保:

  • 您必須共享存儲,或這得到更爲複雜
  • 每個工人機必須有正確的Django /芹菜設置能夠找到Redis的經紀人和共享存儲(例如S3桶,鑰匙等)
  • 你想
+0

我應該怎麼做才能讓每個工人讀取隊列中的任務是什麼?我花了很多時間找到一個很好的例子,而不是沒有發現。謝謝 – user2372074

+0

所以這個'...(file_in_db。id)#使用數據庫記錄的PK表明celery機器也必須能夠訪問與前端服務器相同的數據庫。我對麼? –

+0

是的,在前端和後端服務器之間必須有一些共享知識。這不一定是PK - 它可能是一個GUID來跟蹤任務,文件路徑或其他內容。但是*不知何故,*前端和後端需要知道他們在談論什麼 –