Redis レプリケーション (master-slave) の環境構築 [docker-compose 編]

Tadashi Shigeoka ·  Tue, November 19, 2019

Redis レプリケーション (master-slave) を docker-compose で環境構築して、検証してみたのでご紹介します。

redis

背景 Redis master-slave 環境で動作確認したい

Redis レプリケーション (master-slave) 環境下で、master を stop したとき、slave を stop したときの挙動をそれぞれ動作確認したいという背景があります。

Redis master-slave 環境構築

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:

Add docker-compose.yml for Redis master-slave without sentinel · Pull Request #1 · codenote-net/docker-redis-master-slave

docker-compose up

Redis master-slave 検証

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

docker コンテナで redis-cli 操作

別々の 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> 

INFO コマンドで Replication の状態確認

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 -> slave 同期確認

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 コンテナ、ネットワーク削除

最後に、検証が終わったら 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 のレプリケーション環境を構築して検証した、現場からお送りしました。

参考情報