ようへいの日々精進XP

よかろうもん

redis-router を試してみる

redis-router を試してみる

概要

redis-router という python で書かれた redis のインターフェースがあるらしいので試す。きっかけは @sawanoboly さんのツイート。

redis-router とは


セットアップ

検証環境

  • Debian 7(Wheezy)
  • localhost にポートで分けた redis server を 2 個起動する

トポロジ

今回は以下のような構成で検証を行う。

f:id:inokara:20130630115106p:plain

※図は blockdiag を使って生成しました。

redis server の準備

redis server を localhost に chef を使ってセットアップする。

sudo chef-solo -c ~/path/to/solo.rb -j ~/path/to/localhost.json

cookbook はこちらの cookbook を使い、JSON ファイルは以下のように設定した。

インストール後、redis の tar ball に含まれていた redis.conf を /usr/local/etc/ 以下にコピーして以下のルールに従い起動するポート番号ごとに設定を行う。また、合わせてデーモンモードで起動する為の設定も合わせて行う。

ホスト ポート番号
localhost 6379
localhost 6380

以下は設定変更箇所。

port 6379

port に続く番号を任意の番号に設定する。また、デーモンモードで起動する為に以下のように設定する。

daemonize yes

それぞれの redis.conf を設定後、以下のようにして redis server を起動する。

sudo /usr/local/bin/redis-server /usr/local/etc/6379.conf
sudo /usr/local/bin/redis-server /usr/local/etc/6380.conf

特にエラーも無く起動した場合には redis-cli -p 6379 及び redis-cli -p 6380 として、それぞれの redis server にアクセス出来ることを確認しておく。

pip のインストール

redis-router は python のモジュールとして提供される為、python モジュールの管理ツールである pip を利用してインストールする。尚、検証環境には pip がインストールされていないため pip のインストールから行う。

sudo apt-get install python-pip

あら、簡単。

redis-router のインストール

READMEを見ると install libketama/ketama_python first. とあるので、以下のようにインストールする。

python_ketama のインストールが終わったら、本命の redis-router のインストール。これは、先ほどインストールした pip にて行う。

pip install redis-router

redis-router を試すにあたって...

検証環境において redis-router のインストール後、README に書かれている内容を試すにあたり以下のパッケージを追加でインストールする必要があった。環境によってはすでにインストールされているかもしれないので適宜読み替えること。

Debian パッケージ。

sudo apt-get install libevent-dev

pip パッケージ。

sudo pip install gevent
sudo pip install greenlet
sudo pip install ketama
sudo pip install flask

telnet でアクセスしてみる

tcp インターフェースサーバーを起動

README の通り、以下のような python コードを書いてみる。

どうやらこれで redis-router の tcp インターフェースを立ち上げることが出来るらしい。

以下のように起動する。

python tcp.py &

アクセスしてみる

アクセスしてみる。

telnet localhost 5000

以下のように telnet を介してキーと値の登録が出来る。

Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
set hoge test1
True
get hoge
test1
^]

登録の状態を redis-cli で確認する。

$ redis-cli -p 6379 get hoge
"test1"
$ redis-cli -p 6380 get hoge
(nil)

6379 ポートで起動している redis server に書き込まれている。

http リクエストでアクセスしてみる

http インターフェースサーバーの起動

telnet と同様に README の通り、以下のような python コードを書いてみる。

また、/etc/redis_router/servers.config を設定する必要があるので、下記のように redis server の IP と Listen しているポート、重み付けを設定する。

# IP address:port weight
127.0.0.1:6379 100
127.0.0.1:6380 100

このファイルのパスは /usr/local/lib/python2.7/dist-packages/redis_router/http_interface.py に直書きされているので、修正することで任意のパスに記載することが可能かと思われる。(以下、抜粋)

以下のように起動する。

python httpd.py &

アクセスしてみる

curl を使って先ほど登録したデータを取得してみる。

curl -X POST --data "command=get&arguments=hoge" http://localhost:5001

POST メソッドで以下のようなレスポンスが返ってくる。

127.0.0.1 - - [2013-06-29 16:04:42] "POST / HTTP/1.1" 200 25 "-" "curl/7.26.0"
{
  "response": "test1"
}

ついでにデータを登録してみる。

curl -X POST --data "command=set&arguments=huga,test2" http://localhost:5001

下記のようなレスポンスが返ってくる。

127.0.0.1 - - [2013-06-29 16:07:44] "POST / HTTP/1.1" 200 22 "-" "curl/7.26.0"
{
  "response": true
}

登録したデータを確認してみる。

curl -X POST --data "command=get&arguments=huga" http://localhost:5001

以下の通り、ちゃんと登録されている。

127.0.0.1 - - [2013-06-29 16:08:52] "POST / HTTP/1.1" 200 25 "-" "curl/7.26.0"
{
  "response": "test2"
}

redis-cli でも確認。

$ redis-cli -p 6379 get huga
(nil)
$ redis-cli -p 6380 get huga
"test2"

今度は 6380 ポートで起動している redis server に登録された。


バランシング

検証環境において redis-router 配下には 2 つの redis server がそれぞれ別ポートで稼働しているところで、重み付けを変えてアクセスしてみる。

同比(1:1)

/etc/redis_router/servers.config を以下のように記載する。

127.0.0.1:6379 100
127.0.0.1:6380 100

リクエストを投げてみる。

$ curl -X POST --data "command=set&arguments=huga,test2" http://localhost:5001 
127.0.0.1 - - [2013-06-29 16:15:38] "POST / HTTP/1.1" 200 22 "-" "curl/7.26.0"
{
  "response": true
}
$ curl -X POST --data "command=set&arguments=hoge,test1" http://localhost:5001
127.0.0.1 - - [2013-06-29 16:15:48] "POST / HTTP/1.1" 200 22 "-" "curl/7.26.0"
{
  "response": true
}

確認してみる。

$redis-cli -p 6379
redis 127.0.0.1:6379> keys *
1) "hoge"
redis 127.0.0.1:6379> quit
$ redis-cli -p 6380
redis 127.0.0.1:6380> keys *
1) "huga"
redis 127.0.0.1:6380> quit

1:2

/etc/redis_router/servers.config を以下のように記載する。

127.0.0.1:6379 100
127.0.0.1:6380 200

リクエストを投げてみる。

$ curl -X POST --data "command=set&arguments=hoge,test1" http://localhost:5001
127.0.0.1 - - [2013-06-29 16:30:31] "POST / HTTP/1.1" 200 22 "-" "curl/7.26.0"
{
  "response": true
}
$ curl -X POST --data "command=set&arguments=huga,test2" http://localhost:5001
127.0.0.1 - - [2013-06-29 16:30:40] "POST / HTTP/1.1" 200 22 "-" "curl/7.26.0"
{
  "response": true
}
$ curl -X POST --data "command=set&arguments=aho,test3" http://localhost:5001
127.0.0.1 - - [2013-06-29 16:30:54] "POST / HTTP/1.1" 200 22 "-" "curl/7.26.0"
{
  "response": true
}

確認してみる。

$ redis-cli -p 6379
redis 127.0.0.1:6379> keys *
1) "aho"
redis 127.0.0.1:6379> quit
$ redis-cli -p 6380
redis 127.0.0.1:6380> keys *
1) "huga"
2) "hoge"

ちゃんと 1:2 の割合で登録されている。


まとめ

という感じで駆け足で redis-router を弄ってみた感想は下記の通り。(追記していく予定)

  • redis server へのアクセスを簡素化してより redis をより使い易い KVS にしてくれてる
  • レスポンスが JSON 形式なので加工とかもしやすそう
  • redis-router を書き込み用のポートと読み込み用のポートを別々で起動することで読み込みの負荷分散を手軽に行えそう