伺服器集群(Django、Apache、Nginx、Postgres)
我有一個使用 django、Apache、Nginx 和 Postgres 部署的項目。該項目要求客戶可以查看實時數據。項目要點有: 1、現場設備登錄後向伺服器發送數據(設備也如網站使用者)。2.有後台導入過程,將上傳的數據導入postgres。3. 系統的網路使用者使用這些數據,可以向設備發送命令,設備在登錄時讀取這些命令。4. 也有對數據執行的後台分析常式。
上述所有設置和系統都部署在一台亞馬遜 EC2 雲機器上。該項目目前支持超過 600 台設備和 400 名使用者。但是隨著設備數量的增加,伺服器的性能正在下降。
我們想擴展這個項目,以便它可以支持越來越多的設備。我最初的想法是,我們將再創建一台像目前一樣的伺服器,並將這些設備之間的設備劃分為伺服器。但同樣,我們需要一個中央使用者和設備管理點雖然 django admin。
有任何想法嗎?創建可擴展架構的最佳方法是什麼?如果可能,如何創建 Postgres 集群並將其與 Django 一起使用?
你的問題缺乏細節,而且很長,但聽起來你最初的想法是一個很好的開始。您的應用程序聽起來很像 Zenoss 監控套件,它使用本質上相同的負載分佈架構來擴展:多個監控主機共享數據收集工作負載,具有單個管理界面,以及管理主機或單獨的數據庫系統。
如果您的瓶頸在第 1 點(設備向您的伺服器發送數據),那麼將這些任務分散到另一台機器上應該會為負載增長騰出一些空間。最大的實現障礙通常是如何跨多個 Django 伺服器管理任務。分佈式任務隊列引擎 Celery 可能是目前最好的選擇。它最初是圍繞對你有好處的 Django 設計的,它擁有非常活躍和樂於助人的開發人員和使用者社區。
但是,如果第 2 點和第 4 點是您目前的限制,那麼您可能正在談論數據庫可伸縮性。一般來說,這只是一個難題:沒有程式碼透明、負載中性和廉價的方法來擴展數據庫容量。
如果您只需要獲得更多的數據庫“讀取”IO 容量,複製可能就可以解決問題。Postgres 支持使用名為 Slony-I 的外部工具進行複制。這是單主複製,具有多個只讀“從”主機,這些主機獲取在主伺服器上執行的語句的副本。您的應用程序的所有寫入(更新、插入、刪除…)都通過單個主主機,但您將讀取(選擇…)分佈在主主機和所有從屬主機上。
分佈式讀取所需的程式碼修改通常非常簡單。Django 最近增加了對複制數據庫的支持,我沒用過,不過應該還不錯。
如果您需要更多的數據庫寫入 IO 容量,分片可能會起作用。每個主機都為每個數據庫表保留一個單獨的、唯一的塊。數據庫客戶端使用確定性函式來決定任何給定記錄應該駐留的位置,因此負載分佈實際上是無狀態的,並且可以擴展到大量的數據庫伺服器。Django 新的多數據庫支持(與上面相同的連結)也支持分片。你需要一些程式碼更改,痛苦應該是有限的。
另外,我想提一下 Memcached,它似乎是當今 Internet 上幾乎每個高度可擴展的 Web 應用程序(Facebook、Google、Twitter…)的一部分。一個好的記憶體實現可以將您的數據庫需求減少到其原始大小的一小部分,方法是將昂貴、緩慢的數據庫查找轉換為廉價、快速的記憶體查找。Django 支持 Memcached 集成已經有一段時間了,現在。
我意識到這些都不是太具體,但它應該為您提供一個很好的起點來製定細節。祝你的項目好運。