2014年5月24日土曜日

redisでmaster-slave構成を組んでみた

■環境
CentOS release 6.3 (Final)
redis 2.8.9

※master用, slave用で2台作成します
※master(192.168.0.1)、slave(192.168.0.2)とします

■redisインストール
yum -y update
yum -y groupinstall "Development Tools"
yum -y install tcl tcl-devel

wget http://www.canonware.com/download/jemalloc/jemalloc-3.6.0.tar.bz2
bzip2 -dc jemalloc-3.6.0.tar.bz2 | tar xvf -
cd jemalloc-3.6.0
./configure
make
make install

wget http://download.redis.io/releases/redis-2.8.9.tar.gz
tar zvxf redis-2.8.9.tar.gz
cd redis-2.8.9/deps
make hiredis lua jemalloc linenoise
cd ../
make
make test
make install

cp redis-2.8.9/redis.conf /etc/

■slave側設定
redisでslaveサーバを登録する場合はslave側から
「私はこのmasterのslaveになります」
というコマンドを発行します

nohup redis-server /etc/redis.conf &
redis-cli
> SLAVEOF 192.168.0.1 6379
> INFO REPLICATION
# Replication
role:slave
master_host:192.168.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_repl_offset:267
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
と指定したmasterのスレーブとなっていることを確認します

■master側確認
特にmaster側で作業することはないですが、念のためslaveが登録されているか確認します
nohup redis-server /etc/redis.conf &
redis-cli
> INFO REPLICATION
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.0.2,port=6379,state=online,offset=366,lag=0
master_repl_offset:366
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:365
とslaveが接続されていることを確認します

■動作確認
master側のredisに対してデータを投入してみます
・master側作業
redis-cli
> set key1 value
OK
> keys *
1) "key1"

・slave側確認
redis-cli
> keys *
1) "key1"

slave側にもデータが同期されていることを確認します
また、slave側に書き込みを行おうとすると以下のようなエラーとなります
> set key2 value
(error) READONLY You can't write against a read only slave.
これはslaveがread onlyで起動しているためであり、設定によってはslave側に書き込みを行うことも可能です(今回は紹介しません)

また、今回の場合はコマンドでslave登録したのでslave側を再起動するとまたmasterに戻ってしまいます
起動するためにslaveとして登録するのは大変なので、その場合は設定ファイルにslaveの情報を記載しておくことができます

■手動fail over
masterがダウンしてしまった場合を想定してslaveをmasterに昇格させてみます
masterをkillコマンドでダウンさせてください
この状態でslave側で「INFO REPLICATION」を実行すると master_link_status:down となっていることがわかります

slaveをmasterに昇格させてみます
・slave側作業
redis-cli
> SLAVEOF NO ONE
OK
> INFO REPLICATION
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

masterに昇格していることがわかります
ダウンした元masterサーバ次回起動時にはmasterではなくslaveとして起動、登録する必要がありますのでご注意ください

単純にredisのmaster <-> slave間でデータを同期させる方法は以上です
次回は redis-sentinel を使った、自動fail over の仕組みを試してみたいと思います

■参考サイト

0 件のコメント:

コメントを投稿