Mysql

我為大量使用的 API 設置的伺服器

  • March 13, 2015

我很快就會為即將啟動的應用程序購買一堆伺服器,但我對我的設置感到擔憂。我很感激我得到的任何回饋。

我有一個應用程序將使用我編寫的 API。其他使用者/開發人員也將使用此 API。API 伺服器將接收請求並將它們中繼到工作伺服器。API 將只保存一個 mysql 數據庫,用於日誌記錄、身份驗證和速率限制。

每個工作伺服器執行不同的工作,並且在未來進行擴展時,我將添加更多工作伺服器以用於工作。將編輯 API 配置文件以記錄新的工作伺服器。工作伺服器將進行一些處理,有些會將圖像的路徑保存到本地數據庫,以便稍後由 API 檢索以在我的應用程序上查看,有些將返回程序結果的字元串並將其保存到本地數據庫.

此設置對您來說是否有效?有沒有更好的方法來重組它?我應該考慮哪些問題?請看下圖,希望能幫助理解。在此處輸入圖像描述

更高的可用性

正如 Chris 所提到的,您的 API 伺服器是佈局中的單點故障。您正在設置的是消息隊列基礎設施,許多人之前已經實施過。

繼續沿著相同的路徑

您提到在 API 伺服器上接收請求並將作業插入到每個伺服器上執行的 MySQL 數據庫中。如果您想繼續走這條路,我建議您移除 API 伺服器層,並將工作人員設計為直接從您的 API 使用者那裡接受命令。您可以使用輪詢 DNS 之類的簡單方法將每個 API 使用者連接直接分發到可用的工作節點之一(如果連接不成功,則重試)。

使用消息隊列伺服器

更強大的消息隊列基礎設施使用為此目的設計的軟體,如ActiveMQ。您可以使用 ActiveMQ 的 RESTful API 來接受來自 API 使用者的 POST 請求,空閒的工作人員可以獲取隊列中的下一條消息。但是,這對於您的需求來說可能是多餘的——它是為延遲、速度和每秒數百萬條消息而設計的。

使用動物園管理員

作為中間立場,您可能想查看Zookeeper,即使它不是專門的消息隊列伺服器。我們使用 at $work 來達到這個目的。我們有一組執行 Zookeeper 伺服器軟體的三台伺服器(類似於您的 API 伺服器),並有一個用於處理來自使用者和應用程序的請求的 Web 前端。Web 前端以及 Zookeeper 後端與工作人員的連接具有負載均衡器,以確保我們繼續處理隊列,即使伺服器因維護而停機。工作完成後,worker 告訴 Zookeeper 集群工作完成。如果一名工人死亡,該工作將被發送到另一個工作來完成。

其他問題

  • 確保在工人沒有響應的情況下完成工作
  • API 如何知道作業已完成,並從工作人員的數據庫中檢索它?
  • 嘗試降低複雜性。您是否需要在每個工作節點上都有一個獨立的 MySQL 伺服器,或者它們可以與 API 伺服器上的 MySQL 伺服器(或複制的 MySQL 集群)通信?
  • 安全。任何人都可以送出工作嗎?有認證嗎?
  • 哪個工人應該得到下一份工作?您沒有提到任務預計需要 10 毫秒還是 1 小時。如果它們很快,您應該刪除層以降低延遲。如果它們很慢,您應該非常小心,以確保較短的請求不會卡在幾個長時間執行的請求後面。

引用自:https://serverfault.com/questions/274533