天有不測風雲,人有旦夕禍福;服務在走,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 以維持服務正常運作。
redis-server [sentinel config] --sentinel
向 Redis-Sentinel 詢問目前的 master 的位址
首先,先感謝天橋下的說書人提供的資訊及 Sample:
- Redis failover with StackExchange / Sentinel from C#
- Redis keyspace notifications with StackExchange.Redis
這種做法是跟 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 >