Redis Sentinel使用說明

Redis哨兵提供了Redis的高可用功能,使用Sentinel以後能夠在某些狀況下無需人爲介入自動的恢復Redis的服務不可用問題。node

特性

哨兵主要提供如下能力:redis

  • 監控:不斷的週期性的檢查Redis的Master節點和Slave節點的信息
  • 通知:經過API能夠通知系統管理員,被監控的Redis實例遇到了某種問題
  • 故障自動恢復:若是某一臺Master節點不工做了,Sentinel能夠啓動故障切換功能,將某臺Slave提高爲Master,Sentinel會從新配置Slave,同時通知鏈接Sentinel的客戶端,Master的地址改變了
  • 配置提供:客戶端鏈接到Sentinel上獲取當前的Redis Master地址

image-20190927072426181

哨兵是分佈式部署的,哨兵設計的目的是爲了多臺哨兵節點能相互配合。運行多臺哨兵有以下優勢:spring

  • 故障檢測是多臺哨兵都贊成這臺Master不可用了,才認定Master不可用。若是節點數少,可能存在誤判
    • 多個Sentinel發現Master節點有問題
    • 選舉一個Sentinel做爲Master,通常是發現Master不可用的Sentinel節點,Sentinel Master是具備提高Slave爲Master功能的
    • 選出一個Slave做爲新的Master
    • 通知其他Slave新的Master地址
    • 通知客戶度主從變化
    • 等老的Master又被檢測活以後,成爲新Master的Slave
  • 就算掛掉了幾臺Sentinel,其他的Sentinel節點仍然正常工做,加強了系統的健壯性。

一套Sentinel集羣能夠監控多個Redis主從集羣安全

三個定時任務

1 每10s每一個Sentinel對Master和Slave執行Info信息bash

  • 發現Slave節點
  • 確認主從關係

2 每隔2s對每一個Sentinel經過Master節點的Channel交換信息(pub/sub),注意是Master節點分佈式

  • 經過__ sentinel __:hello 頻道交互,Sentinel交互數據的方式,新的Sentinel節點會自動的註冊這個頻道
  • 交互對節點的「見解」和自身信息

3 每隔1S對其它Sentinel和Redis節點執行pingui

  • 心跳檢測,失敗判斷依據

客戶端鏈接Sentinel原理

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

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>
複製代碼

Spring Redis配置

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。如:

image.png

@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的配置與使用就到這裏了。

相關文章
相關標籤/搜索