簡體   English   中英

如何設計一個能夠以動態方式有效管理配置的系統?

[英]How to design a system that can manage configurations in a dynamic way efficiently?

我正在設計一個系統,我需要在其中以動態方式跨多個應用程序服務器管理配置(配置文件)。 我正在使用 Consul 鍵值存儲來管理配置。

為了管理配置,我在 consul kv 存儲中創建了以下節點。

{"remoteConfig":"abc-123.tgz", "...."}

這里remoteConfig包含所有應用服務器將使用的配置文件(至少這是我得到的設計)。

以下是我正在嘗試做的事情:

  • 所有的應用服務器都會在 Consul 中監視上述節點,一旦remoteConfig鍵的值發生變化,他們就會收到通知,然后他們會下載這個配置並將其存儲在磁盤上。
  • 現在,一旦集群中的所有應用服務器都下載了新配置,那么只有我們應該在集群中的所有盒子中切換到使用 memory 中的新配置。 如果很少有應用服務器下載失敗,那么我們不應該在成功的剩余框中切換到使用最新配置。

我能夠輕松完成第一點,但我對如何有效地設計第二點感到困惑,這可以幫助我僅在所有應用服務器都下載了該特定配置時才切換到最新配置。 我確實知道如何通過在 Consul 中獲取和釋放鎖來自動更新節點,但困惑在於如何有效地設計它以輕松處理這些情況。

問題:

  • 我應該如何設計我的節點,以便我更容易看到所有機器都成功下載了這個特定的配置? 現在是時候在所有盒子上切換到最新配置了。
  • 如果某些機器無法下載特定的配置,那么從閱讀中應該可以清楚地看到這個應用服務器下載失敗,也許它也可以顯示時間戳,就像這個應用服務器在這個時間戳下載這個配置並且他們在這個時間戳切換到新配置.

我不必保留每台機器的所有配置狀態的歷史記錄,只需最新的就足夠了。 在上述設計中也歡迎任何其他改進,以動態方式管理配置。

注意:我也可以有一堆其他節點(比如狀態節點)來做這個練習,僅供參考。也可以使用 Zookeeper 代替 Consul,bcoz lock/leader 的東西可以在這兩種技術中完成,但現在我我會堅持領事)

我無法回答您的問題,但我擔心如果您找到實現既定目標的方法可能會發生潛在的競爭狀況。

假設您有 5 台服務器,並且都使用版本 1 的配置文件。 然后要求服務器下載配置文件的版本 2。 當所有 5 台服務器都完成此操作后,您(以某種方式)向所有 5 台服務器發送信號,告訴它們從配置文件的版本 1 切換到版本 2。 這是可能發生競爭條件的地方。 從配置文件的版本 1 切換到版本 2 的配置文件不能保證在 5 台服務器中的每台服務器中同時發生。 因此,在很短的一段時間內(可能只有幾毫秒),一些服務器仍將使用版本 1,而其他服務器將使用版本 2。在這短暫的時間內,您的服務器上的配置將不一致。

如果這種短暫的不一致會給您帶來問題,那么我認為您將需要一個不同的“從配置版本 1 切換到版本 2”機制,其本質歸結為:(1)要求所有服務器進程終止; (2) 等待它們全部終止,(3) 使用版本 2 的配置重新啟動它們。 顯然,這種方法需要一個短暫的服務器不運行期間,這並不理想,但至少它避免了競態條件。

暫無
暫無

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

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