akishin999の日記

調べた事などを書いて行きます。

Redis でお手軽に複数台構成の検証環境を作る

最近 Redis の Sharding 構成やレプリケーション構成を検証するために複数の Redis インスタンスを起ち上げる事が多いのですが、その度に一々設定を変更した redis.conf を用意するのが結構面倒でした。

という事でちょっと調べてみると、どうやら redis-server は起動時に設定ファイルと個別の設定項目の両方を指定でき、設定ファイルの指定内容を個別項目の指定で上書きできるようです。

というわけで、最近はお手軽にパラメータを指定したシェルスクリプトを書いて使っています。

本体のインストール(CentOS 6.3 x86_64)

まずは本体のインストールですが、remi リポジトリに最新版(2.6.13) の RPM があるのでそちらを使うと楽です。

remi 版の Redis は gperftools の tcmalloc を使っているので、最初に gperftools-libs をインストールします。
RPM が EPEL にあったので、そちらを使うと簡単です。

# yum install -y http://dl.fedoraproject.org/pub/epel/6/x86_64/gperftools-libs-2.0-3.el6.2.x86_64.rpm
# yum install -y http://rpms.famillecollet.com/enterprise/6/remi/x86_64/redis-2.6.13-1.el6.remi.x86_64.rpm

mem_allocator に tcmalloc ではなく jemalloc を使いたい場合には、以前書いたように EPEL の SRPM をベースにリビルドして作っています。

Sharding 用

Sharding 用に三台起動する時には以下のようなスクリプトを使っています。

  • start-redis.sh
#!/bin/sh
/usr/sbin/redis-server ./redis.conf --port 6379 --pidfile ./redis1.pid --logfile ./redis1.log --dbfilename dump1.rdb &
/usr/sbin/redis-server ./redis.conf --port 6380 --pidfile ./redis2.pid --logfile ./redis2.log --dbfilename dump2.rdb &
/usr/sbin/redis-server ./redis.conf --port 6381 --pidfile ./redis3.pid --logfile ./redis3.log --dbfilename dump3.rdb &

pid ファイルや log ファイルのパスはインスタンス毎に個別にしておきます。
redis.conf はデフォルトのまま使う事が多いですが、全インスタンスに共通する設定項目がある場合は予め設定ファイル側に書いておきます。

個別に指定するパラメータは、設定ファイル内での項目名に「--」を付けて指定するだけです。

例えば一つ目のインスタンスの maxmemory だけ 2G に変更したい、といった場合は以下のような感じ。

#!/bin/sh
/usr/sbin/redis-server ./redis.conf --port 6379  --maxmemory 2G --pidfile ./redis1.pid --logfile ./redis1.log --dbfilename dump1.rdb &
/usr/sbin/redis-server ./redis.conf --port 6380 --pidfile ./redis2.pid --logfile ./redis2.log --dbfilename dump2.rdb &
/usr/sbin/redis-server ./redis.conf --port 6381 --pidfile ./redis3.pid --logfile ./redis3.log --dbfilename dump3.rdb &

レプリケーション

レプリケーション環境を用意したい場合も、以下のようにスレーブにしたい redis-server のパラメータに slaveof を指定するだけです。

  • start-repli.sh
#!/bin/sh
/usr/sbin/redis-server ./redis.conf --port 6379 --pidfile ./redis1.pid --logfile ./redis1.log --dbfilename dump1.rdb &
/usr/sbin/redis-server ./redis.conf --port 6380 --slaveof 127.0.0.1 6379 --pidfile ./redis2.pid --logfile ./redis2.log --dbfilename dump2.rdb &
/usr/sbin/redis-server ./redis.conf --port 6381 --slaveof 127.0.0.1 6380 --pidfile ./redis3.pid --logfile ./redis3.log --dbfilename dump3.rdb &

停止用

停止は起動時に指定した pid ファイルを利用した以下のようなスクリプトで行っています。
大したスクリプトではありませんが、台数が多い時は一発で止められるので便利です。

  • stop-redis.sh
#!/bin/sh
kill -TERM `cat ./redis1.pid`
kill -TERM `cat ./redis2.pid`
kill -TERM `cat ./redis3.pid`

もし他に停止してはいけない redis-server が動いていたりしない場合は以下のように pkill を使ってもいいと思います。

#!/bin/sh
pkill -TERM redis

確認用

その他、確認用として、複数インスタンスに redis-cli でコマンドを実行する以下のようなスクリプトも書いたりしています。

  • keyspaces.sh
#!/bin/sh
/usr/bin/redis-cli -p 6379 INFO Keyspace
/usr/bin/redis-cli -p 6380 INFO Keyspace
/usr/bin/redis-cli -p 6381 INFO Keyspace
  • flushdb.sh
#!/bin/sh
/usr/bin/redis-cli -p 6379 -n 0 FLUSHDB
/usr/bin/redis-cli -p 6380 -n 0 FLUSHDB
/usr/bin/redis-cli -p 6381 -n 0 FLUSHDB

上は全インスタンス上の Key の数を確認したい時用、下は全インスタンスの 0 番の DB をクリアしたい時用、といった感じです。

もっと便利な管理ツールとかも探せばあるかも知れませんが、ちょっとした検証の場合には大袈裟なので、上記のようなスクリプトをいくつか作って使ってます。

こんな感じでお手軽に複数台構成の検証環境が作れるのはいいですね。


Redis Cookbook
Redis Cookbook
posted with amazlet at 13.06.07
O'Reilly Media (2011-07-25)

Redis in Action
Redis in Action
posted with amazlet at 13.06.07
Josiah L. Carlson
Manning Pubns Co
売り上げランキング: 45,530