こんにちは、hoge太郎です。
もうすっかり寒くなってきましたがプロジェクトのお陰でだいぶ暖かい今日この頃です。

さて、今回は最近のプロジェクトで良く導入しているredisについて記載したいと思います。

https://redis.io/
redis、使っていますか?

一昔前はmemcachedが良く使われていましたが、
memcachedよりも豊富な機能があって最近はどんどんredisに変わってきているようです。

弊社でも色々な用途で利用しているのですが、
redisのプロセスが落ちるとサービス障害に繋がるという状況を避ける為に
redis sentinelを利用して監視、自動フェールオーバーを実現しております。

しかしあまりにガッツリ利用していると単一のredisサーバーに接続が集中してしまい、
そろそろ負荷分散を考える必要が出てきました。
アプリケーション側でキーによって接続先のredisを変えるようにすればいいのですが、
出来ればミドルウェアでどうにかしたいと思って探したら見つかった物が「redis-mgr」でした。

なので今回は「redis-mgr」を紹介しようと思います。
https://github.com/idning/redis-mgr

redis-mgrとは

deploy.py を実行するだけで設定ファイルに基づくredisのクラスタを構築する事が出来て、冗長化、負荷分散、一括コマンド実行などが実現出来る優れ物です。

あまり日本語の情報は少ないですね。
詳しくはgithubを参照して下さい。

動かしてみる

何はともあれ「やってみれば分かる」という事で、まずは動かしてみましょう。
とりあえず簡単に動作検証可能なように、vagrantを利用してサーバーを5台を用意しました。

「vagrant up」 でdebianサーバーが5台立ち上がります。

今回は下記のような構成にしてみようと思います。

mgr 192.168.60.1 deploy, proxy用
redis1 192.168.60.11 master, sentinel
redis2 192.168.60.12 master, sentinel
redis3 192.168.60.13 slave(redis1), sentinel
redis4 192.168.60.14 slave(redis2), sentinel

1. redis-mgrの導入

githubに記載されている通りでは出来なかったので少しだけ修正しています。
rootユーザーで作業しました。

次に「_binaries」ディレクトリ以下に必要なバイナリをコピーします。
どうやらここに置いたバイナリファイルを各deploy先に転送する仕組みの様です。

2. twemproxy(nutcracker)の導入

twemproxy(nutcracker)とは
https://github.com/twitter/twemproxy

ミドルウェアでredisの水平分散を実現するソリューションです。
水平分散だけであればこれを導入すれば出来ます。
こちらはそこそこ記事がありますので、導入方法はそちらに任せます。

makeして出来上がったnutcrackerをredis-mgrの_binariesディレクトリ以下にコピーします。

3. redis-serverの導入

普通にapt-getで入れます。

/usr/bin/redis-* を_binariesディレクトリ以下にコピーします。

deploy

redis1〜redis4へdeployする為に、redis-mgrのconfファイルを下記のようにしました。

またmgrからredis1〜redis4へパスワード無しでssh接続出来るように予め鍵認証の準備をしておきましょう。

実行

deployされましたね。

start.

status.

ものすごく簡単でしたが、これでredisの冗長化と負荷分散が実現されました。
一括でログを見たり状態をチェックしたりする管理機能まで付いています。
素晴らしい!

負荷分散の確認

適当にデータを追加していって、分散されているかを確認してみましょう。

redis1-3とredis2-4に分散されていますね。

冗長化の確認

redis1を停止したらどうなるかを見てみましょう。

redis1, redis2がmaster、
redis3, redis4はslaveになっています。

redis1を停止します。

redis1死亡。
しばらくするとredis3がmasterに昇格します。

その後元masterであるredis1を起動してみるとslaveで立ち上がります。

slaveで立ち上がっています。

まとめ

sentinelを使うと冗長化、twemproxyを使うと負荷分散が可能となりますが、
実際の運用では両方使いたい筈です。
その為には、sentinelがslaveをmasterへ昇格させた時に
twemproxyの設定を変更しなければならなかったりして面倒ですが、
redis-mgrを使うと簡単にこれらを導入する事が出来ます。

構成の変更も設定ファイルの変更で簡単に出来るので
今後のプロジェクトで導入してみては如何でしょうか。

Follow me!