Redis Replication (Master-Slave) Environment Setup [docker-compose Edition]

Tadashi Shigeoka ·  Tue, November 19, 2019

I’ll introduce how I set up and tested a Redis replication (master-slave) environment using docker-compose.

redis

Background: Want to Test Behavior in Redis Master-Slave Environment

The background is wanting to test the behavior when stopping the master and when stopping the slave in a Redis replication (master-slave) environment.

Redis Master-Slave Environment Setup

Setting up a Redis master-slave environment is completed by preparing a docker-compose.yml file like the following and running 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 Testing

After running docker-compose up, set up the following state:

$ 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

Redis-cli Operations in Docker Container

Log into docker containers in separate terminals and run redis-cli to enable operations in 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> 

Check Replication Status with INFO Command

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

Confirm Master -> Slave Synchronization

I confirmed synchronization by setting a value to hoge on master and being able to GET the value from hoge on slave, following these steps:

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"

Cleanup: Delete Docker Containers and Networks

Finally, after testing is complete, run docker-compose down to delete the used containers, networks, etc., and clean up.

$ 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

That’s all from the Gemba.

Reference Information