gemのredis-sentinelを導入してみた
今回はRedis Sentinelの構築ではなくこちらのgemの導入に関してです。
Redis sentinelの詳しい説明に関してはこちらのドキュメントを確認ください。
※今後Redis Sentinelのセットアップ等も書くかも
Redis Sentinelとは
簡単に説明するとレプリ構成のredisにて、
masterが何らかの障害で落ちた際にRedis Sentinelが検知してslaveをmasterに昇格してくれるやーつ。
安心してねむれるようになるやーつ。
gemを使用する準備
Gemfileに記述する
+ gem 'redis-sentinel' # 使用しているredisのversionが2.6.10未満ならgemのversionの指定が必要なようです。 + gem 'redis-sentinel', '~> 1.3.0'
gemをインストールする
$ bundle install
gemを使用してみる
前提条件
- Redis Serverをlocalhost, port 6379, 6380で立ち上げている
- Redis Serverのmasterはport 6379, slaveはport 6380
- redis-sentinelをlocalhost, portは26379, 26380の2つで立ち上げている
- sentinel.confにてmaster_nameをmaster_redisに設定してredis-sentinelを起動している
Redis.newをする際
- Redis.new({host: "localhost", port: 6379}) + Redis.new(master_name: "master_redis", sentinels: [{host: "localhost", port: 26379}, {host: "localhost", port: 26380}])
cache_storeで指定する
- config.cache_store = :redis_store, 'redis://localhost:6379/0' + config.cache_store = :redis_store, { master_name: "master_redis", sentinels: [{host: "localhost", port: 26379}, {host: "localhost", port: 26380}] }
session_storeで指定する
- config.session_store :redis_store, - servers: { - host: "localhost", - port: 6379, - db: 0, - namespace: 'sessions', - key: '_hoge_session' - }, - expire_after: 1.days + config.session_store :redis_store, + servers: { + master_name: "master_redis", + sentinels: [{host: "localhost", port: 26379}, {host: "localhost", port: 26380}], + db: 0, + namespace: 'sessions', + key: '_hoge_session' + }, + expire_after: 1.days
sidekiqで指定する
- Sidekiq.configure_server do |config| - config.redis = { url: "redis://localhost:6379" } - end - Sidekiq.configure_client do |config| - config.redis = { url: "redis://localhost:6379" } - end + redis_conn = proc { + Redis.new(master_name: "master_redis", sentinels: [{host: "localhost", port: 26379}, {host: "localhost", port: 26380}]) + } + Sidekiq.configure_server do |config| + config.redis = ConnectionPool.new(size: 10, &redis_conn) + end + Sidekiq.configure_client do |config| + config.redis = ConnectionPool.new(size: 10, &redis_conn) + end
こんな感じで設定を記述した後は
アプリケーションを立ち上げるだけ
障害時の挙動
上記の設定を行った際のアプリケーション側の挙動
redis-sentinelは接続エラーが発生した時にRedis Sentinel側にmasterがどのredisかを問い合わせて
問い合わせて返って来た情報を元にRedisの接続を変更するイメージの様です。
masterが落ちた
Rails側で接続エラーが発生し、Redis Sentinelでの新master切り替えが発生
その後Rails側で新master側のredisに接続が行われる。
旧masterを立ち上げなおしてチェックして終わり。
slaveが落ちた
Railsアプリケーションに大きな影響はない。
slaveを立ち上げなおしてデータとかチェックして終わり。