使用Spring Data Redis实现Redis的负载平衡

以前我尝试将Spring Data Redis和Redis Sentinel进行集成,但由于只能通过Sentinel访问主节点,所以要访问从节点需要准备一个专用的Slave Redis模板。因此,如果想要在Redis上分散读取操作并准备多个从节点时,需要另外创建一个机制。

访问分散的方法 de

使用专用的负载均衡器

使用负载均衡器为读取目的提供VIP,并准备相应的RedisTemplate。

スクリーンショット 2015-10-10 8.15.56.png

负载均衡和健康检查将由负载均衡器代替,因此应用程序的代码会变得简单。
然而,由于RedisCacheManager只能使用一个RedisTemplate,因此在使用Spring的缓存机制(如@Cacheable)时仍然需要进行一些调整。

在RedisTemplate的层面上进行负载均衡。

由于准备一个负载均衡器需要大量工作,我们决定仅通过应用程序来完成所有功能。

スクリーンショット 2015-10-10 8.27.13.png

我创建了一个用于解决这个问题的库。

<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を利用する。

广告
将在 10 秒后关闭
bannerAds