Cloister→簡單的OTP叢集管理

幾乎每個成功的業務應用程式遲早都會進入需要水平擴展的階段。 在許多情況下,您可以簡單地啟動一個新執行個體並降低平均負載。 但也有一些不那麼簡單的情況,我們需要確保不同的節點彼此了解並仔細分配工作負載。

Cloister→簡單的OTP叢集管理

結果很幸運 二郎,我們選擇它是因為它令人愉快的語法和圍繞它的炒作,它具有一流的 支援分散式系統。 從理論上講,這聽起來完全微不足道:

不同節點上的進程之間以及連結和監視器之間的訊息傳遞是透明的[...]

在實踐中,一切都有點複雜。 分散式 二郎 當「貨櫃」指的是用於運輸的大鐵箱,而「碼頭工人」只是碼頭工人的同義詞時,它就被開發出來了。 在 IP4 有許多未被佔用的位址,網路中斷通常是由老鼠咬斷電纜造成的,生產系統的平均正常運作時間長達數十年。

現在我們都難以置信地自給自足、打包並運行分散式 二郎 在一個動態IP位址依照高度隨機性原則分配的環境中,節點可以根據調度程序的突發奇想出現和消失。 為了避免在每個運行分散式的專案中出現大量樣板程式碼 二郎,為了對抗敵對環境,需要幫助。

注意: 我知道有 libcluster。 它真的很酷,它有超過一千顆星,作者在社區中很有名,等等。 如果這個套件提供的用於建立和維護叢集的方法對您來說足夠了,我為您感到高興。 不幸的是,我還需要更多。 我想詳細地控制設置,而不是成為集群重組劇院的局外人。

需求

我個人需要的是一個能夠接管叢集管理並具有以下屬性的庫:

  • 使用硬編碼節點清單和透過服務進行動態發現的透明工作 二郎;
  • 每次拓撲更改的功能齊全的回調(那裡的節點,這裡的節點,網路不穩定,分裂);
  • 用於啟動具有長名稱和短名稱的叢集的透明介面,如 :nonode@nohost;
  • Docker 支援開箱即用,無需編寫基礎架構程式碼。

後者意味著我在本地測試應用程式後 :nonode@nohost,或在人工分散式環境中使用 test_cluster_task,我只想跑 docker-compose up --scale my_app=3 看看它如何在 docker 中執行三個實例而不需要更改任何程式碼。 我還想要依賴應用程序,例如 mnesia - 當拓撲發生變化時,他們會在幕後即時重建集群,而無需應用程式進行任何額外的操作。

迴廊 它的目的並不是成為一個具備從支持集群到製作咖啡等所有功能的圖書館。 它不是旨在涵蓋所有可能情況的靈丹妙藥,也不是理論家認為是學術上完整的解決方案。 CS 放入這個字中。 這個函式庫的設計目的非常明確,但又完美地完成了它不太大的工作。 這個目標將是在本地開發環境和充滿敵意容器的分散式彈性環境之間提供完全的透明性。

選擇的方法

迴廊 旨在作為應用程式運行,儘管高級用戶可以透過直接運行來手動組裝和維護集群 Cloister.Manager 在目標應用程式的主管樹中。

當作為應用程式運行時,該庫依賴於 config,從中讀取以下基本值:

config :cloister,
  otp_app: :my_app,
  sentry: :"cloister.local", # or ~w|n1@foo n2@bar|a
  consensus: 3,              # number of nodes to consider
                             #    the cluster is up
  listener: MyApp.Listener   # listener to be called when
                             #    the ring has changed

上述參數的字面意思如下: 迴廊 用於 OTP 應用 :my_app,使用 Erlang服務發現 連接節點,至少三個,並且 MyApp.Listener 模組(實現 @behaviour Cloister.Listener)配置為接收有關拓撲變更的通知。 完整配置的詳細描述可以在 文件.

透過此配置,應用程式 迴廊分階段啟動,延遲啟動主應用程式的過程,直到達成共識(三個節點連接並連接,如上例所示)。這使主應用程式有機會假設在啟動時,叢集已經可用。 每當拓撲發生變化時(會有很多,因為節點不完全同步啟動),處理程序就會被調用 MyApp.Listener.on_state_change/2。 大多數時候,我們會在收到狀態訊息時執行操作 %Cloister.Monitor{status: :up},這意味著:“您好,集群已組裝完成。”

大多數情況下,安裝 consensus: 3 是最優的,因為即使我們期望有更多節點連接,回調也會通過 status: :rehashingstatus: :up 在任何新新增或刪除的節點上。

以開發模式啟動時,只需設定 consensus: 1 и 迴廊 當他看到時,他會很高興地跳過等待集群組裝的過程 :nonode@nohost:node@host:[email protected] - 取決於節點的配置方式(:none | :shortnames | :longnames).

分散式應用管理

非真空的分散式應用程式通常包含分散式依賴項,例如 mnesia。 我們可以很容易地從同一個回調中處理它們的重新配置 on_state_change/2。 這裡舉例詳細說明如何重新配置 mnesia 在飛行中 文件 迴廊.

使用的主要優點 迴廊 是它在拓撲更改後執行重建叢集所需的所有操作 在引擎蓋下。 該應用程式只是在一個已經準備好的分散式環境中運行,所有節點都已連接,無論我們是否提前知道 IP 位址和節點名稱,或者它們是否已被動態分配/更改。 這完全不需要特殊的 docker 配置設置,並且從應用程式開發人員的角度來看,在分散式環境中運行與在本地環境中運行沒有區別。 :nonode@nohost。 您可以閱讀有關此內容的更多信息 文件.

儘管可以透過自訂實作來複雜地處理拓撲更改 MyApp.Listener,可能總是存在邊緣情況,其中這些庫限制和配置偏差被證明是實現的基石。 沒關係,照上面的就可以了 libcluster,這是更通用的,甚至可以自己處理低階叢集。 這個程式碼庫的目標不是覆蓋所有可能的場景,而是使用最常見的場景,而不需要不必要的痛苦和繁瑣的複製貼上。

注: 在原文中,此時出現了“Happy clustering!”這一短語,而我用它進行翻譯的 Yandex(我不必自己翻字典)為我提供了“Happy clustering!”選項。 也許無法想像更好的翻譯,特別是考慮到當前的地緣政治局勢。

來源: www.habr.com

添加評論