Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Spring Framework / Boot / Data 徹底活用
August 28, 2015
Spring in Summer 夏なのにSpring
!
Naohiro Yoshida
Recruit Technologies Co....
自己紹介
(def	
  me	
  {:name	
  "吉田	
  尚弘"	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  :job	
  "アーキテクト"	
  
	
  	
  	
  	
  	
  	...
リクルートにおけるSpringへの取り組み
■ リクルートでは全社標準FWとしてSpringの採用を決定
■ 専門部隊で検証やサイトへの適用を進めている
学んだプラクティスについては随時ブログや勉強会等で公開予定
!
!
!
!
!
!
API...
!
!
!
!
!
!
!
!
!
API/バックエンド
本日の内容
Spring BootでのSpring Data Redisの使い方と

プラクティス
Spring Boot
Spring Framework
Spring Rabbit
...
Spring Data Redis
■ SpringでRedisを操作するためのライブラリ
■ JedisのローレベルAPIを使うのではなく利用しやすいTemplateを提供している
!
@Autowired	
private RedisTem...
Spring Data Redis ∼Cache利用∼
■ RedisCacheManagerを利用することでspring-contextのCache機構と連携可
@Configuration	
@EnableCaching	
public c...
Spring Data Redis ∼Cache利用∼
// RedisCacheManagerで指定したexpiresのkeyをvalue属性に	
 // 指定することにより有効期限が設定される、expiresにないvalue属性の場合は無期...
Spring Boot Application
Spring Bootで利用するには
■ spring-boot-starter-redisとspring-boot-autoconfigureを依存関係に追加するだけ
■ RedisAutoCon...
これだけでは実用には耐えられない
Redisの構成の選択肢 ∼Redis Cluster∼
■ 擬似的なMulti Master構成、最低3台のMaster Nodeが必要
■ データがシャーディングされNode毎に別のデータを保持
■ 可用性をちゃんと考慮すると6台のNode...
Node 1 Node 2 Node 3
Redisの構成の選択肢 ∼Redis Sentinel∼
■ Master判定専用のプロセス(sentinel)を用いたMaster/Slave構成
■ 複数のsentinelによる投票によりMast...
Redisの構成の選択肢 ∼Load Balancer∼
!
Load Balancer
VIP1 VIP 2
Redis
Master
Redis
Slave #2
Redis
Slave #1
■ LBにWrite用のVIPとRead用のV...
Springから使ってみる
Spring + Redis Cluster
■ Jedis 2.7.2からRedis Clusterにも安定版のRedis 3.0.Xに対応している
■ しかし現在Spring Data RedisはRedis Clusterに対応していない
Spring Boot Application
Spring + Redis Sentinel
RedisTemplate
Jedis Sentinel Pool
JedisConnectionFactory
Jedis Pool
sentin...
Spring Boot Application
Spring + Redis Sentinel Master 判定
JedisSentinelPool
JedisConnectionFactory
■ 起動時にSentinelに対する専用のLi...
■ Master判定された後はsentinelから切断された場合でも暫定的に利用可
■ Masterが切り替わった時にはWriteが失敗する
■ sentinel復旧後は自動的に再接続
Spring + Redis Sentinel Senti...
Spring Boot Application
RedisTemplate
JedisConnectionFactory
JedisPool
Redis
Master
■ Slave用のJedisConnectionFactoryを用意する必要...
Spring Boot Application
Spring + VIP
JedisConnectionFactory
JedisPool
Redis
Master
Redis
Slave #1
Redis
Slave #2
Load Bala...
キャッシュ用クラスタ
■ 複数Master/Slaveのクラスタ構成もRepository層以上からは透過
■ 将来的なRedis Clusterへの移行時の影響を低減
■ 標準では対応していないので拡張が必要 -> 現在RTCで開発中
Spr...
まとめ
■ Spring Data RedisのRedisTemplateによりRedis操作は簡単
■ Spring Data RedisでのRedis Clusterは直接サポートされていない
■ 実運用に耐えるRedis構成に合わせるとあ...
Upcoming SlideShare
Loading in …5
×

Spring Framework / Boot / Data 徹底活用 〜Spring Data Redis 編〜

3,546 views

Published on

2015/08/28のjsugでの発表資料

Published in: Technology

Spring Framework / Boot / Data 徹底活用 〜Spring Data Redis 編〜

  1. 1. Spring Framework / Boot / Data 徹底活用 August 28, 2015 Spring in Summer 夏なのにSpring ! Naohiro Yoshida Recruit Technologies Co.,Ltd. ∼Spring Data Redis 編∼
  2. 2. 自己紹介 (def  me  {:name  "吉田  尚弘"                    :job  "アーキテクト"                    :lang  ["Java"  "Clojure"  "Scala"  "golang"]        :spring-­‐use  {"流通系企業基幹システム"                            "高校生向け学習アプリAPIサーバ"})
  3. 3. リクルートにおけるSpringへの取り組み ■ リクルートでは全社標準FWとしてSpringの採用を決定 ■ 専門部隊で検証やサイトへの適用を進めている 学んだプラクティスについては随時ブログや勉強会等で公開予定 ! ! ! ! ! ! API/バックエンド Spring Boot Spring Framework Spring XXX 独自LIB ! フロントエンド node.js
  4. 4. ! ! ! ! ! ! ! ! ! API/バックエンド 本日の内容 Spring BootでのSpring Data Redisの使い方と
 プラクティス Spring Boot Spring Framework Spring Rabbit Spring Boot Autoconfigure Spring JMS Spring Boot Actuator Spring Data Redis Spring Data Elasticsearch Spring ・・・
  5. 5. Spring Data Redis ■ SpringでRedisを操作するためのライブラリ ■ JedisのローレベルAPIを使うのではなく利用しやすいTemplateを提供している ! @Autowired private RedisTemplate<Object, Object> redisTemplate; ! public void access() { // value redisTemplate.opsForValue().set(key, System.currentTimeMillis()); Object value = redisWriterTemplate.opsForValue().get(key); // list redisTemplate.opsForList().rightPush(key, value); value = redisWriterTemplate.opsForList().leftPop(key); // expire Date expireAt = DateUtils.addHours(dateSupplier.get(), 1); redisTemplate.expireAt(key, expireAt); }!
  6. 6. Spring Data Redis ∼Cache利用∼ ■ RedisCacheManagerを利用することでspring-contextのCache機構と連携可 @Configuration @EnableCaching public class RedisConfiguration extends CachingConfigurerSupport { ! @Bean @Autowired public CacheManager cacheManager( RedisTemplate<Object,Object> redisTemplate){ RedisCacheManager manager = new RedisCacheManager(redisTemplate); ! //有効期限設定 (not required) Map<String, Long> expires = new HashMap<String, Long>(); expires.put("cache.expire.180", new Long(3 * 60)); manager.setExpires(expires); return manager; } }
  7. 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. 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
  9. 9. これだけでは実用には耐えられない
  10. 10. Redisの構成の選択肢 ∼Redis Cluster∼ ■ 擬似的なMulti Master構成、最低3台のMaster Nodeが必要 ■ データがシャーディングされNode毎に別のデータを保持 ■ 可用性をちゃんと考慮すると6台のNodeが必要 Node1 !① ⑦ ⑨ Node2 !② ③ ⑥ Node 3 !④ ⑤ ⑧  それぞれ管理しているhash slotを教え合っている Node1 Slave Node2 Slave Node3 Slave Client 1.CLUSTER HINTS 2.hash slotと
 nodeの対応 3.対象ノードからGET
  11. 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. 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を利用する
  13. 13. Springから使ってみる
  14. 14. Spring + Redis Cluster ■ Jedis 2.7.2からRedis Clusterにも安定版のRedis 3.0.Xに対応している ■ しかし現在Spring Data RedisはRedis Clusterに対応していない
  15. 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. 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起動時
  17. 17. ■ Master判定された後はsentinelから切断された場合でも暫定的に利用可 ■ Masterが切り替わった時にはWriteが失敗する ■ sentinel復旧後は自動的に再接続 Spring + Redis Sentinel Sentinel停止 Spring Boot Application Redis Template JedisSentinelPool JedisConnectionFactory JedisPool Redis Master MasterListenerが デフォルトで5秒に 一回接続試行 Master Listener Master Listener Master Listener Sentinel1 Sentinel2 Sentinel3
  18. 18. Spring Boot Application RedisTemplate JedisConnectionFactory JedisPool Redis Master ■ Slave用のJedisConnectionFactoryを用意する必要がある。 ■ Slaveが複数になった場合の分散や生死状態の判定は別途仕組みが必要。 JedisConnection JedisPool Redis Slave Spring + Redis Sentinel Slaveへのアクセス Jedis Sentinel Pool sentinel1 sentinel2 sentinel3 ReadかWriteかに よって利用する ConnectionFactory を切り替える
  19. 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はそれぞれ必要
  20. 20. キャッシュ用クラスタ ■ 複数Master/Slaveのクラスタ構成もRepository層以上からは透過 ■ 将来的なRedis Clusterへの移行時の影響を低減 ■ 標準では対応していないので拡張が必要 -> 現在RTCで開発中 Spring Boot Application Master Slave #1 Slave #2 RedisTemplate JedisConnection Factory JedisConnection Factory JedisConnection Factory JedisConnection Factory Load Balancer VIP1 VIP 2 VIP 3 VIP 4 Master Slave #1 Slave #2 一時データ用クラスタ ・キーのprefixなどでクラスタ判定 ・発行コマンドでWrite/Read判定 Spring + VIP Multiple JedisConnectionFactory
  21. 21. まとめ ■ Spring Data RedisのRedisTemplateによりRedis操作は簡単 ■ Spring Data RedisでのRedis Clusterは直接サポートされていない ■ 実運用に耐えるRedis構成に合わせるとある程度のカスタマイズが必要

×