Redis哨兵提供了Redis的高可用功能,使用Sentinel以後能夠在某些狀況下無需人爲介入自動的恢復Redis的服務不可用問題。node
哨兵主要提供如下能力:redis
哨兵是分佈式部署的,哨兵設計的目的是爲了多臺哨兵節點能相互配合。運行多臺哨兵有以下優勢:spring
一套Sentinel集羣能夠監控多個Redis主從集羣安全
1 每10s每一個Sentinel對Master和Slave執行Info信息bash
2 每隔2s對每一個Sentinel經過Master節點的Channel交換信息(pub/sub),注意是Master節點分佈式
3 每隔1S對其它Sentinel和Redis節點執行pingui
Redis Sentinel高可用指的是服務端的高可用,若是咱們直接鏈接到Redis 的Master節點掛掉了,那麼咱們的客戶端就不可用了。spa
咱們須要的是服務端高可用和客戶端高可用的結合。設計
1 獲取全部的Sentinel節點,遍歷獲得一個可用的Sentinel節點code
2 在可用的Sentinel節點上執行,sentinel get-master-addr-by-name MasterName來返回Master節點信息,包含地址和端口
3 當獲取到Master節點以後,執行role或者role replication來驗證是否真的是Master節點
4 若是當Master節點發生了變化,Sentinel通知客戶端主節點信息發生了變化。客戶端接受到變化是經過一個Redis的Channel來實現
Sentinel默認監聽的端口在TCP 26379,運行Sentinel有兩種方式,效果是同樣的:
redis-sentinel /path/to/sentinel.conf
redis-server /path/to/sentinel.conf --sentinel
複製代碼
下載Redis後,通常都會有sentinel.conf配置文件,裏面有sentinel的配置同時配上了文檔說明。
通常Redis Sentinel的配置以下:
# 指定監聽的Redis Master地址,不須要指定slave的地址,sentinel鏈接到master以後能夠自行獲取
# 語法:sentinel monitor <master-group-name> <ip> <port> <quorum>
# quorum是當master沒法訪問的時候,須要幾臺sentinel確認才贊成master是不可用的
sentinel monitor mymaster 127.0.0.1 6379 2
# 配置格式:sentinel <option_name> <master_name> <option_value>
# down-after-milliseconds,在 60s內,sentinel一直沒法ping通mymaster的時候,認爲mymaster是不可用的
sentinel down-after-milliseconds mymaster 60000
# 指定當故障發生的時候,進行恢復的超時時間,當failover開始後,在此時間內仍然沒有觸發任何failover操做,當前sentinel 將會認爲這次failoer失敗
sentinel failover-timeout mymaster 180000
# 當某臺slave被提高爲新的master的時候,同一時間有幾臺slave會更新配置,值越小越好,若是值設的過大,可能致使master阻塞。
sentinel parallel-syncs mymaster 1
sentinel monitor resque 192.168.1.3 6380 4
sentinel down-after-milliseconds resque 10000
sentinel failover-timeout resque 180000
sentinel parallel-syncs resque 5
複製代碼
Sentinel在發現Slave以後,或者提高Slave爲Master節點以後,或者新加入了Sentinel節點的時候會自動的更新配置文件。
其餘配置:
# 開啓守護進程模式
daemonize yes
# 關閉保護模式
protected-mode no
# 讓Sentinel只工做在/tmp目錄下,減小安全隱患
dir "/tmp"
# 設置sentinel用於鏈接master的密碼,若是redis配置了密碼,那這裏必須配置認證,不然不能自動切換
sentinel auth-pass <master-name> <password>
複製代碼
1 在配置文件中指定sentinel的地址,若是有多個用逗號分隔sentinel.nodes
spring.redis.sentinel.master=mymaster
spring.redis.sentinel.nodes=192.168.26.129:26379
spring.redis.password=123456
複製代碼
若是不想使用屬性配置能夠自行在代碼中建立:
/**
* Jedis
*/
@Bean
public RedisConnectionFactory jedisConnectionFactory() {
RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
.master("mymaster")
.sentinel("127.0.0.1", 26379)
.sentinel("127.0.0.1", 26380);
return new JedisConnectionFactory(sentinelConfig);
}
複製代碼
2 配置下RedisTemplate的序列器,否則容易出現一些奇怪字符開頭的key。如:
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
RedisSerializer stringSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setValueSerializer(stringSerializer);
redisTemplate.setHashKeySerializer(stringSerializer);
redisTemplate.setHashValueSerializer(stringSerializer);
return redisTemplate;
}
複製代碼
3 注入RedisTemplate使用。
關於Redis Sentinel的配置與使用就到這裏了。