使用Spring Data Redis实现Redis的负载平衡
以前我尝试将Spring Data Redis和Redis Sentinel进行集成,但由于只能通过Sentinel访问主节点,所以要访问从节点需要准备一个专用的Slave Redis模板。因此,如果想要在Redis上分散读取操作并准备多个从节点时,需要另外创建一个机制。
访问分散的方法 de
使用专用的负载均衡器
使用负载均衡器为读取目的提供VIP,并准备相应的RedisTemplate。
负载均衡和健康检查将由负载均衡器代替,因此应用程序的代码会变得简单。
然而,由于RedisCacheManager只能使用一个RedisTemplate,因此在使用Spring的缓存机制(如@Cacheable)时仍然需要进行一些调整。
在RedisTemplate的层面上进行负载均衡。
由于准备一个负载均衡器需要大量工作,我们决定仅通过应用程序来完成所有功能。
我创建了一个用于解决这个问题的库。
<repositories>
<repository>
<id>nysd.maven</id>
<name>nysd maven repository</name>
<url>http://nysd.github.io/archivar/</url>
</repository>
</repositories>
<deppendencies>
<dependency>
<groupId>spring.support</groupId>
<artifactId>spring-data-redis-support</groupId>
<version>1.6.0.1</version>
</dependency>
</dependencies>
-
- 読み取り対象ノードに対して定期的にinfo replicationを発行する。(書き込みの方はSentinel利用するので考慮不要)
-
- info replicationの結果エラーとなるかmaster_sync_in_progressが1の場合、対象ノードは利用不能にマーク。
-
- Redis操作時には利用可能なノードに対応するRedisTemplateをランダムに一つ選択して処理を実行。
@Cacheable利用時にGET操作のみ読み取り専用のRedisTemplateを利用する。