最近、マイクロサービスでRedisの使い方について考える機会があったので。
#キャッシュとは
ざっくり言うと、キャッシュとはメモリー内に保存されているデータです。
そのため、データベース等のディスクに保存されているデータよりも速いCRUDオペレーションが可能です。
#マイクロサービスでのstate管理
マイクロサービスでキャッシュシステムを導入する動機の多くはstate管理にあると思います。
これはkubernetes等のオーケストレーションサービスを使用した場合、インスタンス同士でのstate共有が困難なためです。
例えば、下記のデザインがあったとします。
micorservice: blog_service
pod: blog_service_1, blog_service_2
もし blog_service_1, blog_service_2 が各自のstateをサービス内のみで管理していると
blog_service_1からのレスポンスはblog_service_2からのものとは、別になってしまう可能性があるからです。
そのためstate管理の責任をキャッシュに任せることで
blog_service_1, blog_service_2 は同等のstateを参照することが可能になります。
#なぜ分散キャッシュを使用するのか
###理由1. メモリー容量以上のデータサイズに対応するため
キャッシュのメモリー内にデータを保存するという特性上、単一のキャッシュシステムのみではメモリーサイズ以上のデータを保存することが出来ません。
例えばサーバーのRAMが16GBだったとしたらキャッシュできるデータの上限は16GBということになります。
キャッシュデータを複数のノードで共有することで、この上限を伸ばすことが可能です。
###理由2. データレプリケーション
分散キャッシュは複数のノード使用するので、各ノードがお互いのデータを複製して保存することが可能です。
これにより、データロスプリベンションが可能です。
###理由3. HA (High Availability)
複数のノードが存在するため、master-slaveの関係をノード同士で構築することが可能です。
よって万が一、masterノードがダウンした時にでも、slaveノードを次のmasterに選出が可能です。
#分散キャッシュの王道: Redis
##Redisとは
Redisはin-memoryのデータストラクチャーを保存するシステムです。
特徴としては、データをメモリー内で処理するので高速です。
キャッシュやNoSQLデータベース、メッセージブローカーなど使用用途は様々です。
スナップショットやデータをディスク上に保存することも可能なので、in-memoryに限らない使用も可能です。
Twitterなどのサービスでキャッシュシステムとして採用されています。
##Redis Cluster とは
Clusterは複数のRedisインスタンス上にデータ保存を共有するシステムです。
なのでCluster自体はHAやデータの複製は行いませんが、データを複数のインスタンスに分散して保存することを可能にします。
Culsterを取り扱うはデータのサイズに応じて見極めるのが良いと思います。
##Redis Sentinel とは
Sentinelの主な役割はFailoverに自動的に対応することです。
master node がダウンしたときに、slave node のプロモーションを行うのはsentinelです。
なので、sentinel無しではHAは成し得ません。
加えて、nodeのモニタリングやアラートも対応してくれます。
プロダクションでは最低3つのsentinelインスタンスのデプロイが推奨されています。
個人的にはプロダクションでのsentinelの使用はマストだと考えています。
##参照
https://redis.io
http://23.253.120.235/sentinel-or-cluster/
https://thinkpalm.com/blogs/introduction-redis-sentinel-features-work/