Redis 哨兵(Sentinel)不僅負責監控和管理 Redis 主從復制集群的高可用性,還需要與客戶端進行有效的交互來實現故障轉移后的透明連接切換。下面詳細探討 Redis 哨兵如何與客戶端進行交互,并結合代碼示例加以說明。
哨兵與客戶端的交互
Redis 哨兵與客戶端的交互主要包括以下幾個方面:
-
發現主節點:
- 客戶端可以連接到哨兵,并通過哨兵來獲取當前的主節點信息。哨兵會提供一個指向當前活躍主節點的地址。
-
監聽主節點變化:
- 客戶端可以訂閱哨兵的事件,及時獲知主節點的變化,從而重新連接到新的主節點。
-
自動重連:
- 客戶端庫如 Jedis、Lettuce 可以配置為自動處理從哨兵獲取主節點信息,并在主節點故障轉移時自動重新連接到新的主節點。
詳細代碼示例
以下是一個具體的代碼示例,展示了如何配置和使用 Redis 哨兵與客戶端進行交互。
哨兵配置 (sentinel.conf
)
port 26379
dir /tmp# 監控主節點
sentinel monitor mymaster 127.0.0.1 6379 2# 主節點不可用時間(毫秒)
sentinel down-after-milliseconds mymaster 5000# 同步從節點的數量
sentinel parallel-syncs mymaster 1# 故障轉移超時時間(毫秒)
sentinel failover-timeout mymaster 60000# 通知腳本
sentinel client-reconfig-script mymaster /path/to/notification/script.sh
啟動哨兵:
redis-sentinel sentinel.conf
Java 客戶端示例
使用 Jedis 庫連接 Redis 哨兵集群,并進行簡單的 Redis 操作。
引入 Jedis 庫
在 Maven 項目中添加 Jedis 依賴:
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.0.1</version>
</dependency>
Java 代碼示例
以下 Java 代碼展示了如何使用 Jedis 庫連接和操作帶有 Sentinel 的 Redis 集群,并自動處理主節點故障轉移。
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisSentinelPool;import java.util.HashSet;
import java.util.Set;public class RedisSentinelExample {private static final String MASTER_NAME = "mymaster";public static void main(String[] args) {// 定義 Sentinel 節點Set<String> sentinels = new HashSet<>();sentinels.add("127.0.0.1:26379");// 創建 JedisPoolConfig 對象JedisPoolConfig poolConfig = new JedisPoolConfig();poolConfig.setMaxTotal(10);poolConfig.setMaxIdle(5);poolConfig.setMinIdle(1);// 創建 JedisSentinelPool 對象try (JedisSentinelPool sentinelPool = new JedisSentinelPool(MASTER_NAME, sentinels, poolConfig);Jedis jedis = sentinelPool.getResource()) {// 執行 Redis 操作jedis.set("mykey", "myvalue");String value = jedis.get("mykey");System.out.println("mykey: " + value);// 輸出連接的主節點信息System.out.println("Connected to master: " + jedis.getClient().getHost() + ":" + jedis.getClient().getPort());// 模擬主節點故障后,JedisSentinelPool 會自動連接到新的主節點// 可以手動殺死主節點進程來測試} catch (Exception e) {System.err.println("Error: " + e.getMessage());}}
}
Python 客戶端示例
使用 redis-py
庫連接 Redis 哨兵集群,進行簡單的 Redis 操作。
引入 redis-py
庫
在 Python 環境中安裝 redis-py
庫:
pip install redis
Python 代碼示例
以下 Python 代碼展示了如何使用 redis-py
庫連接和操作帶有 Sentinel 的 Redis 集群,并自動處理主節點故障轉移。
import redis
from redis.sentinel import Sentineldef main():# 定義 Sentinel 節點sentinel = Sentinel([('127.0.0.1', 26379)], socket_timeout=0.1)# 獲取主節點master = sentinel.master_for('mymaster', socket_timeout=0.1)slave = sentinel.slave_for('mymaster', socket_timeout=0.1)# 執行 Redis 操作master.set('mykey', 'myvalue')value = slave.get('mykey')print('mykey:', value.decode('utf-8'))# 輸出連接的主節點信息print('Connected to master:', master.connection_pool.get_master_address())# 模擬主節點故障后,Sentinel 會自動連接到新的主節點# 可以手動殺死主節點進程來測試if __name__ == '__main__':main()
總結
Redis 哨兵通過與客戶端交互,確保在主節點發生故障后能夠及時獲取新的主節點信息并自動重新連接。客戶端通過連接哨兵獲取主節點信息、監聽主節點變化、自動重新連接等機制,實現對 Redis 集群的透明訪問。合理配置和使用哨兵與客戶端的交互機制,可以顯著提高 Redis 集群的高可用性和可靠性。