redisのレプリケーション
redis
のレプリケーションがとても簡単だったのでメモです。勉強も兼ねてdocker
を無駄に使っています。環境は以下です。
とりあえずredis
が入ったAlpine Linux
のイメージを作成します。my-alpine
ディレクトリを作りその中にDockerfile
を以下の内容で作成します;
FROM alpine:latest MAINTAINER ushumpei RUN apk --no-cache add redis CMD ["/bin/sh"]
$ docker build -t my-alpine . $ docker run -it --rm my-alpine
redis
がインストールされた状態でAlpine Linux
が起動しました。
単一マシン上で
先ほどのmy-alpine
を使って、同一ホストで複数のredis
を起動し、master、slaveのレプリケーション構成を行ってみます;
/ # redis-server --port 3679 & / # redis-server --port 3680 --slaveof localhost 3679 &
本当はちゃんと設定ファイルを書いたほうがいいんだと思います。レプリケーションを確認すると;
/ # redis-cli -p 3679 INFO ... # Replication role:master connected_slaves:1 slave0:ip=::1,port=3680,state=online,offset=519,lag=1 ... / # redis-cli -p 3680 INFO ... # Replication role:slave master_host:localhost master_port:3679 ... / # redis-cli -p 3679 set hoge fuga OK / # redis-cli -p 3680 get hoge "fuga"
とちゃんとなっているようです。
docker
docker-compose
でmaster: 1台、slave: 2台の構成を作ってみようと思います。新たにディレクトリ(docker-redis
にしました)を作成し、その中にdocker-compose.yml
を以下のように作成しました。
version: '2' services: master: image: redis:latest restart: always ports: - 3679:3679 slave_1: image: redis:latest restart: always ports: - 3680:3679 command: redis-server --slaveof master 6379 slave_2: image: redis:latest restart: always ports: - 3681:3679 command: redis-server --slaveof master 6379
slave_1
、slave_2
からはmaster
のhost
がmaster
で参照できるようになっているようで、分かるまで悩みました(参考: Compose のネットワーク機能)。docker-compose up
で起動します。
動作確認を先ほどのmy-alpine
から行います。--net
オプションで先ほどのdocker-compose up
で起動したコンテナたちのネットワークに参加します。こうすることで、master
などのホストを参照することができるようになります。
(ネットワーク名はデフォルトではディレクトリ名_default
になるらしく、docker network ls
でも確認できます。ディレクトリのハイフンが無視されています、どういうルールでしょう?)
$ docker run -it --rm --net dockerredis_default my-alpine / # redis-cli -h master INFO ... # Replication role:master connected_slaves:2 slave0:ip=172.19.0.4,port=6379,state=online,offset=2367,lag=1 slave1:ip=172.19.0.2,port=6379,state=online,offset=2367,lag=1 ... / # redis-cli -h slave_1 INFO ... # Replication role:slave master_host:master master_port:6379 ... / # redis-cli -h slave_2 INFO # Replication role:slave master_host:master master_port:6379 ... / # redis-cli -h master set hoge fuga OK / # redis-cli -h slave_1 get hoge "fuga" / # redis-cli -h slave_2 get hoge "fuga"
感想
redis
のレプリケーションってすごく簡単にできるように思えました。pub/sub
使って何か作ってみたいです。