Redis Replication (Master-Slave) Environment Setup [docker-compose Edition]
I’ll introduce how I set up and tested a Redis replication (master-slave) environment using docker-compose.
The background is wanting to test the behavior when stopping the master and when stopping the slave in a Redis replication (master-slave) environment.
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:
docker-compose up
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
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>
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
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"
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.