一個基於Consul的.NET Leader選舉類庫
前段時間有傳言說Consul將不能在我國繼續使用,後被查明是因法律問題Vault企業版產品不能在國內銷售。Valut和Consul都是HashiCorp公司的產品,並且都推出了開源版本,繼續使用開源版本都是沒有問題的,虛驚一場。Consul是一款優秀的服務發現和配置管理產品,基於其提供的Session機制,可以很方便的實現Leader選舉功能。這篇文章將介紹我編寫的一個基於Consul的.NET Leader選舉類庫。
基於Consul的Leader選舉原理
1、參加選舉的程式可以在Consul中建立一個Session,這個Session的存活狀態依賴於當前程式的Consul健康檢查狀態, 一旦健康檢查處於Critical狀態,則對應的Session就會失效。
2、使用這個Session去鎖定某個Consul Key/Value,只有一個Session能成功鎖住KV,擁有這個Session的程式即為Leader。
3、Leader選舉成功後,所有節點還要繼續阻塞查詢上邊的Consul Key/Value,如果KV繫結的Session失效了, 所有節點可以立即發現併發起一次Leader選舉,並選舉出1個Leader。
使用說明
1、啟動本機Consul
當前的版本依賴本機Consul,後續會支援配置遠端Consul地址。
如果本地環境已經配置Consul,保證其正常執行即可。
如果本地環境沒有配置Consul,可以下載後以開發模式快速啟動,以方便體驗Leader選舉功能。
下載地址:https://www.consul.io/downloads
啟動命令:./consul agent -dev
2、安裝Nuget包
NuGet包地址:https://www.nuget.org/packages/FireflySoft.LeaderElection
3、編寫Leader選舉程式碼
首先建立LeaderElectionManager的一個例項,傳入服務名稱、服務Id、leader選舉選項等引數,然後呼叫Watch方法參與選舉,並在Watch方法中傳入Leader選舉結果的處理方法。
以控制檯程式為例:
class Program { static void Main(string[] args) { Console.WriteLine("I am ElectionService1."); // 參與Leader選舉的多個程式應該使用相同的服務名 // 參與Leader選舉的每個程式應該有唯一的服務Id LeaderElectionManager electionManager = new LeaderElectionManager("ElectionService", "ElectionService1", new LeaderElectionOptions()); electionManager.Watch(LeaderElectCompletedEventHandler); Console.WriteLine("Start Election..."); Console.Read(); } private static void LeaderElectCompletedEventHandler(LeaderElectionResult result) { // 在這裡處理Leader選舉結果。 Console.WriteLine($"LeaderElectCompleted, Result: {result.IsSuccess}, Current Leader: {result.State.CurrentLeaderId}."); } }
4、注意事項
選舉沉默期
LeaderElectionOptions中提供了一個重新選舉沉默期:ReElectionSilencePeriod,預設15s。應用場景如下:
當一個程式的Leader狀態失效時,它可能仍在處理某些事務,並且不能立即中止。 這時候如果其它節點馬上選舉成為Leader,並且開始處理資料,則可能導致資料不一致的狀態。
Leader優先選舉權
此類庫為Leader增加了優先選舉權。應用場景如下:
Leader狀態失效可能只是一種短暫的中斷導致的,系統會很快自動恢復,而業務事務的的啟動和中止需要進行復雜的處理, 所以我們仍然期望下一次Leader選舉時之前的Leader有優先選舉權,避免資料同步和加快系統恢復。
5、原始碼開放
這麼好的東西當然要開源:https://github.com/bosima/FireflySoft.LeaderElection
參考文件
1、Consul Session機制參考:
https://blog.bossma.cn/consul/consul-leader-election-solution/
https://www.consul.io/docs/internals/sessions
2、基於Session的Leader選舉機制參考:
https://learn.hashicorp.com/consul/developer-configuration/elections
如果你有關於Consul的任何使用問題歡迎加入千人Consul QQ交流群:234939415