使用Spring Data Redis来利用Redis Sentinel

上一次我们写了如何使用Spring Boot和Spring Data Redis来使用Redis。
这一次我们将介绍如何在Redis Sentinel架构中使用Spring Data Redis。

スクリーンショット 2015-09-13 17.24.29.png

使用方式

    applicaion.ymlにSentinelの情報を記載する。
spring:
    data:
        redis:
            Sentinel: 
                  master: cluster1
                  nodes: localhost:26379,localhost:26380,localhost:26381
    • masterプロパティはSentinelに設定したクラスタの名称。

 

    以下はSentinelのログ、Sentinelで認識しているクラスタの名称と同じにする必要がある。
[1] 13 Sep 07:41:51.043 # Sentinel runid is 2510f2561aff03a249726db05e195efc8ee80920
[1] 13 Sep 07:41:51.046 # +monitor master cluster1 192.168.59.103 6379 quorum 2
[1] 13 Sep 07:41:52.047 * +slave slave 172.17.42.1:6380 172.17.42.1 6380 @ cluster1 192.168.59.103 6379
    • nodesプロパティはSentinelの接続先をカンマ区切りで指定する。

 

    Sentinel構成では無い時に指定していたhost/portの設定は不要。

只要使用上述的设置,Spring Data Redis可以从Sentinel的进程中获取主节点的信息,因此可以像非Sentinel配置一样使用RedisTemplate来操作Redis。

追踪掌握Master的判定方法。

请确认如何从Spring Data Redis中获取主节点的信息。
在确认的过程中,使用Spring Data Redis默认使用的Redis客户端Jedis来进行。
简单描述流程如下图所示。

スクリーンショット 2015-09-13 20.33.01.png

创建到 Sentinel 的连接池

当Spring Boot启动时,在JedisConnectionFactory作为Bean进行初始化的时机上,如果在application.yml中已经进行了Sentinel的配置,那么就会创建适用于Sentinel的连接池JedisSentinelPool。以下是JedisConnectionFactory源代码的部分摘录。

public void afterPropertiesSet() {

    // 略

    if (usePool) {
        this.pool = createPool();
    }
}

private Pool<Jedis> createPool() {

    if (isRedisSentinelAware()) {
        return createRedisSentinelPool(this.SentinelConfig);
    }
    return createRedisPool();
}

大师的评判

在JedisSentinelPool的构造函数中进行以下处理。

Sentinelに対して順番にMasterが見つかるまで以下のコマンドを発行

SENTINEL get-master-addr-by-name cluster1

一つ以上のSentinelからmasterの情報が取得できなければ例外
そのため、JedisConnectionFactory初期化のタイミングでは必ず1台のSentinelには接続できなければならない。
見つかったMasterに対してコネクションプールを生成

开始订阅Sentinel

同时,对于每个Sentinel进程,启动一个名为MasterListener的线程。
MasterListener订阅并处理每个对应的Sentinel进程的主节点变更。

SUBSCRIBE +switch-master

当Master被Sentinel更改时

MasterListener收到新Master的连接信息。然后,JedisSentinelPool为新Master创建连接池。

障碍时的行为 ‘ài shí de

    • Redisのマスターが停止してからSpring Data Redis側でコネクションプールを再生成するまではRedisTemplateでのRedisへのアクセスはエラーとなる。

 

    • Sentinelが全停止していてもMasterが停止していなければRedisTemplateでエラーになることはない。

 

    Sentinelが停止してもMasterListenerはデフォルトで5秒毎に再接続試行しているため、Sentinelを再起動すれば接続が復旧する。

其他

可以访问Master,但没有专门用于访问Slave的机制,因此如果想要在Slave上执行Read操作,就需要自己创建一个。

广告
将在 10 秒后关闭
bannerAds