まっしろけっけ

めもてきなやーつ

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を立ち上げなおしてデータとかチェックして終わり。

Redis Sentinel Serverが落ちた

Railsアプリケーションに大きな影響はない。
ただしこの状態でmasterが落ちると、当たり前だがRails側で接続エラーが発生するよ。


先週末の会社での合宿ネタも記事書いた方がいいんだろうなー( ꒪⌓꒪)