Spring Data Redis:Sentinel的高可用性 - Michael C. Good
為了使用Redis實現高可用性,我們可以使用Spring Data Redis對Redis Sentinel的支援。使用Sentinel,我們可以建立一個自動抵禦某些故障的Redis部署。
Redis Sentinel還提供其他附屬任務,如監控,通知,並充當客戶端的配置提供程式。
在較高的層面上,Sentinel的能力是:
- 自動故障轉移。當主伺服器未按預期工作時,Sentinel會為我們啟動故障轉移過程,其中將從屬伺服器提升為主伺服器。此外,其他從站被重新配置為使用新主站,並且使用Redis伺服器的應用程式將被告知要使用的新地址。
- 配置源。發生故障轉移時,Sentinels將報告新地址。這是因為Sentinel充當客戶端的許可權來源。當客戶端進行服務發現時,它們會連線到Sentinels以請求負責給定服務的當前Redis主伺服器的地址。
- 監控。Sentinel會定期檢查我們的主例項和從屬例項是否按預期工作。
- 通知。可以將Sentinel配置為在其中一個Redis例項發生錯誤時通知各種目標。這些目標包括其他應用程式,系統管理員或API。
如何執行Sentinel
自Redis 2.8以來,Robis已經發布了穩定版本的Sentinel。
啟動Sentinel非常簡單。我們在Mac上使用自制軟體安裝了Redis。此命令允許我們使用該安裝執行Sentinel:
1redis-sentinel /path/to/sentinel.conf
如果我們使用redis-sentinel可執行檔案(或者如果使用該名稱的符號連結到redis-server可執行檔案),我們也可以使用上述命令執行Sentinel。
或者,我們可以使用redis-server 可執行檔案並在Sentinel模式下啟動它,如下所示:
redis-server /path/to/sentinel.conf --sentinel
部署Sentinel之前需要了解的關鍵概念
在部署到Sentinel之前我們應該審查的一些概念包括:
- 我們需要至少三個Sentinel例項才能實現持久的Redis部署。
- 我們應該將三個Sentinel例項放入被認為獨立失敗而不是一起失敗的計算機或虛擬機器中。例如,這可能意味著不同的可用區域。
- Redis使用非同步複製,因此無法保證在失敗期間保留接收的寫入,即使使用Sentinel也是如此。但是,我們可以部署Sentinel,以減少寫入丟失的時間。
- 必須定期測試任何高可用性設定,Sentinel也不例外。我們需要在開發環境和生產環境中進行測試。通過規劃和測試失敗,我們限制了我們的失敗。
Spring Data中的配置
當我們使用基於Sentinels的配置時,我們不會向Spring Data Redis提供Redis主機/埠資訊。相反,我們提供主伺服器的屬性和Sentinel URL列表。每個Sentinel程序都有自己的配置檔案,列出Redis主伺服器,例如:
sentinel monitor themaster 127.0.0.1 6379 2 sentinel down-after-milliseconds themaster 60000 sentinel failover-timeout themaster 180000 sentinel parallel-syncs themaster 1
一旦我們配置了master,slave和Sentinels,我們需要在應用程式中更改spring資料redis配置以使用sentinels。
可以使用Jedis和Lettuce完成Java配置:
<font><i>/** * Jedis */</i></font><font> @Bean <b>public</b> RedisConnectionFactory jedisConnectionFactory() { RedisSentinelConfiguration sentinelConfig = <b>new</b> RedisSentinelConfiguration() .master(</font><font>"themaster"</font><font>) .sentinel(</font><font>"127.0.0.1"</font><font>, 26579) .sentinel(</font><font>"127.0.0.1"</font><font>, 26580); <b>return</b> <b>new</b> JedisConnectionFactory(sentinelConfig); } </font><font><i>/** * Lettuce */</i></font><font> @Bean <b>public</b> RedisConnectionFactory lettuceConnectionFactory() { RedisSentinelConfiguration sentinelConfig = <b>new</b> RedisSentinelConfiguration() .master(</font><font>"themaster"</font><font>) .sentinel(</font><font>"127.0.0.1"</font><font>, 26579) .sentinel(</font><font>"127.0.0.1"</font><font>, 26580); <b>return</b> <b>new</b> LettuceConnectionFactory(sentinelConfig); } </font>
application.properties配置:
spring.redis.sentinel.master= themaster # Name of our Redis server.
spring.redis.sentinel.nodes= localhost:26579, localhost:26580, localhost:26581 # Comma-separated list of host:port pairs.
結論
今天我們回顧了使用Sentinel如何通過Redis實現高可用性以及Spring Data Redis如何支援這一點在我們的Spring應用程式中。有關Sentinel的更多資訊,Redis網站 是一個很好的來源。