[料理佳餚] C# 在 Redis 發生 Failover 時自動跟著執行 HA 切換

天有不測風雲,人有旦夕禍福;服務在走,HA 要有,先前有介紹過使用 Redis-Sentinel 打造 Redis 的 HA,當時只完成了伺服器端的設定,這次要介紹如何在應用程式這一端也完成自動 failover,以維持服務的 HA。

Redis 透過 Redis-Sentinel 維持服務 HA

我錄了大概 2 分鐘的影片,給大家看看 Redis 透過 Redis-Sentinel 自動 failover 維持服務 HA 的情形。

左上是 master、左下是 slave、右上是 Redis-Sentinel、右下是 redis-cli,從影片中可以看到由 Redis-Sentinel 發動 failover,切換 master 及 slave 輪流擔任 master 以維持服務正常運作。

在 Windows 底下啟動 Redis-Sentinel 的指令:
redis-server [sentinel config] --sentinel

向 Redis-Sentinel 詢問目前的 master 的位址

首先,先感謝天橋下的說書人提供的資訊及 Sample:

這種做法是跟 Redis-Sentinel 詢問目前的 master 是誰? master 的 EndPoint 是什麼?話不多說,我們看一下 Sample Code。

private EndPoint GetCurrentMasterEndPoint()
{
    var sentinelConfig = new ConfigurationOptions
                             {
                                 ServiceName = "mymaster",
                                 TieBreaker = string.Empty,
                                 CommandMap = CommandMap.Sentinel,
                                 DefaultVersion = new Version(3, 0),
                                 AllowAdmin = true
                             };
    sentinelConfig.EndPoints.Add("sentinel host", 26379);

    var sentinelConnection = ConnectionMultiplexer.Connect(sentinelConfig);
    var endPoint = sentinelConnection.GetEndPoints().First();
    var server = sentinelConnection.GetServer(endPoint);

    return server.SentinelGetMasterAddressByName("mymaster");
}

建立 Sentinel Config,連線到 Redis-Sentinel 後先取得 Redis-Sentinel 的 EndPoint,再呼叫 SentinelGetMasterAddressByName() 方法取得目前的 master EndPoint。

看下圖,原本取得到的 master EndPoint 是 x.x.x.x:6379,手動停掉原本 master 之後再取得的 master EndPoint 就變成了 x.x.x.x:6380。

向 Redis-Sentinel 訂閱 +switch-master 頻道

Redis-Sentinel 在發生 failover 時會記錄 +switch-master 事件,我們可以透過 Redis 的訂閱機制來監聽 +switch-master 事件。

我們來看一下執行的效果,按下 button1 先得知目前的 master EndPoint,接著按下 button2 訂閱 +switch-master 頻道,開始監聽 +switch-master 事件。

以上這兩種方式都可以從 Redis-Sentinel 被動及主動得知目前的 master EndPoint,讓我們的應用程式也可以跟著自動 failover。

參考資料

 < Source Code >

相關資源

C# 指南
ASP.NET 教學
ASP.NET MVC 指引
Azure SQL Database 教學
SQL Server 教學
Xamarin.Forms 教學