使用Spring Data Redis来利用Redis Sentinel
上一次我们写了如何使用Spring Boot和Spring Data Redis来使用Redis。
这一次我们将介绍如何在Redis Sentinel架构中使用Spring Data Redis。
使用方式
- 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来进行。
简单描述流程如下图所示。
创建到 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操作,就需要自己创建一个。