Redis レプリケーション (master-slave) を docker-compose で環境構築して、検証してみたのでご紹介します。
Redis レプリケーション (master-slave) 環境下で、master を stop したとき、slave を stop したときの挙動をそれぞれ動作確認したいという背景があります。
Redis master-slave 環境構築は、以下のような docker-compose.yml ファイルを用意して docker-compose up すれば完了です。
docker-compose.yml
version: '3.7'
services:
redis-master:
image: redis:5.0.6
hostname: redis-master
volumes:
- redis_master:/data
ports:
- '6379:6379'
redis-slave:
image: redis:5.0.6
hostname: redis-slave
volumes:
- redis_slave:/data
ports:
- '6479:6479'
command: redis-server --slaveof redis-master 6379
volumes:
redis_master:
redis_slave:
docker-compose up
docker-compose up して以下の状態とします。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6495327c911d redis:latest "docker-entrypoint.s…" 5 minutes ago Up 5 minutes 6379/tcp, 0.0.0.0:6479->6479/tcp docker-redis-master-slave_redis-slave_1
3b79546041d3 redis:latest "docker-entrypoint.s…" 5 minutes ago Up 5 minutes 0.0.0.0:6379->6379/tcp docker-redis-master-slave_redis-master_1
別々の Terminal で docker コンテナへログインして redis-cli を実行して Redis REPL で操作できるようにします。
docker exec -it docker-redis-master-slave_redis-master_1 bash
root@redis-master:/data# redis-cli -p 6379
127.0.0.1:6379>
docker exec -it docker-redis-master-slave_redis-slave_1 bash
root@redis-slave:/data# redis-cli -p 6379
127.0.0.1:6379>
hostname: redis-master
127.0.0.1:6379> INFO
# Replication
role:master
connected_slaves:1
slave0:ip=172.26.0.2,port=6379,state=online,offset=1607,lag=1
master_replid:251580f17a37d03a60443c7d458c4f0ffb5bcc58
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1607
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1607
hostname: redis-slave
127.0.0.1:6379> INFO
# Replication
role:slave
master_host:redis-master
master_port:6379
master_link_status:up
master_last_io_seconds_ago:6
master_sync_in_progress:0
slave_repl_offset:1593
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:251580f17a37d03a60443c7d458c4f0ffb5bcc58
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1593
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1593
master の hoge に値を SET して slave の hoge から値を GET できて、同期できていることを以下の手順で確認しました。
hostname: redis-master, redis-slave
127.0.0.1:6379> GET hoge
(nil)
hostname: redis-master
127.0.0.1:6379> SET hoge 1
OK
hostname: redis-slave
127.0.0.1:6379> GET hoge
"1"
最後に、検証が終わったら docker-compose down で使ったコンテナ、ネットワークなどを削除して、後片付けしておきましょう。
$ docker-compose down
Stopping docker-redis-master-slave_redis-slave_1 ... done
Stopping docker-redis-master-slave_redis-master_1 ... done
Removing docker-redis-master-slave_redis-slave_1 ... done
Removing docker-redis-master-slave_redis-master_1 ... done
Removing network docker-redis-master-slave_default
以上、Redis のレプリケーション環境を構築して検証した、現場からお送りしました。