More Related Content Similar to Spring Framework / Boot / Data 徹底活用 〜Spring Data Redis 編〜 Similar to Spring Framework / Boot / Data 徹底活用 〜Spring Data Redis 編〜(20) Spring Framework / Boot / Data 徹底活用 〜Spring Data Redis 編〜1. Spring Framework / Boot / Data 徹底活用
August 28, 2015
Spring in Summer 夏なのにSpring
!
Naohiro Yoshida
Recruit Technologies Co.,Ltd.
∼Spring Data Redis 編∼
2. 自己紹介
(def
me
{:name
"吉田
尚弘"
:job
"アーキテクト"
:lang
["Java"
"Clojure"
"Scala"
"golang"]
:spring-‐use
{"流通系企業基幹システム"
"高校生向け学習アプリAPIサーバ"})
7. Spring Data Redis ∼Cache利用∼
// RedisCacheManagerで指定したexpiresのkeyをvalue属性に
// 指定することにより有効期限が設定される、expiresにないvalue属性の場合は無期限
@Override
@Cacheable(value = "cache.expire.180", key = "'cache.master.seatTypes'")
public List<CodeAndName> selectSeatTypes() {
return selectList("sqlfilename");
}
!
// この場合redisでのkeyは
//「cache.master.selectRailroad/ + 引数のrailroadCode値」
@Cacheable(value = "cache.permanent.selectRailroad",
key = "'cache.master.selectRailroad/' + #railroadCode")
public CodeAndName selectRailroad(String railroadCode) {
return selectOne("sqlfilename", railroadCode);
}
■ キャッシュとして戻り値を保持したいメソッドにCachableアノテーションを定義
■ Redisに存在しない場合のみメソッドの中身が呼び出される
■ 下のコードはSQL実行結果をキャッシュとしてRedisに乗せる例
8. Spring Boot Application
Spring Bootで利用するには
■ spring-boot-starter-redisとspring-boot-autoconfigureを依存関係に追加するだけ
■ RedisAutoConfigurationがRedisTemplate作成する
■ とりあえず使ってみるのは非常に簡単
Jedis
RedisTemplate
アプリケーションコード
Redis
Properties
RedisAuto
Configuration
Redis
spring:
data:
redis:
host: localhost
port: 6379
pool:
max-active:20
application.yml
11. Node 1 Node 2 Node 3
Redisの構成の選択肢 ∼Redis Sentinel∼
■ Master判定専用のプロセス(sentinel)を用いたMaster/Slave構成
■ 複数のsentinelによる投票によりMasterが決定される(複数クラスタ管理可)
■ 多数決によるMaster障害検知なので3台は必要
Redis
Master
Redis
Slave #1
Redis
Slave #2
Sentinel1 sentinel2 sentinel3
Client
1.Master
問い合わせ
2.Master Node
の場所返却
3.データSET
12. Redisの構成の選択肢 ∼Load Balancer∼
!
Load Balancer
VIP1 VIP 2
Redis
Master
Redis
Slave #2
Redis
Slave #1
■ LBにWrite用のVIPとRead用のVIPを用意
■ クライアントからはVIPにアクセスしノードダウン/Master昇格を意識しない
■ Master 1台 / Slave 1台でも構成可能
Client
SET GET
Sentinel1 sentinel2 sentinel3
Master障害検知と
昇格の1手段として
バックエンドで
sentinelを利用する
14. Spring + Redis Cluster
■ Jedis 2.7.2からRedis Clusterにも安定版のRedis 3.0.Xに対応している
■ しかし現在Spring Data RedisはRedis Clusterに対応していない
15. Spring Boot Application
Spring + Redis Sentinel
RedisTemplate
Jedis Sentinel Pool
JedisConnectionFactory
Jedis Pool
sentinel1 sentinel2
sentinel3
Redis
Master
■ JedisSentinelPoolがsentinelプロセスからMasterのHostAndPort取得
■ MasterのHost And Portを取得してMasterに接続
全sentinelから定期的に
Maserの情報を取得
Maserに対してアクセス
16. Spring Boot Application
Spring + Redis Sentinel Master 判定
JedisSentinelPool
JedisConnectionFactory
■ 起動時にSentinelに対する専用のListenerを生成してMasterのAddrを取得
■ SentinelからのMaster変更を検知する毎にメモリ内のMasterのAddrを変更
■ 起動時に最低1つのsentinelにアクセスできる必要がある
Master
Listener
Master
Listener
Sentinel1 Sentinel2 Sentinel3
Master
Listener
Sentinelに対してsubscribe処理
Master情報を受け取る
Sentinel数分のMasterListenerを
それぞれ別スレッドで起動。
最初にget-master-addr-by-name
でsentinelから直接masterの
Host/Portを取得。ここで取得で
きないと無限ループ
Spring Boot Applicaton起動時
19. Spring Boot Application
Spring + VIP
JedisConnectionFactory
JedisPool
Redis
Master
Redis
Slave #1
Redis
Slave #2
Load Balancer
VIP1 VIP 2
RedisTemplate
JedisConnectionFactory
JedisPool
■ 死活監視やアクセス分散をLBに委譲する
■ 読取用と書込用のJedisConnectionFactoryはそれぞれ必要