Redis cluster with Docker Compose
Using Docker Compose to setup a redis cluster with sentinel.
This project is inspired by the project of https://github.com/mdevilliers/docker-rediscluster
Install Docker and Docker Compose in testing environment
If you are using Windows, please execute the following command before "git clone" to disable changing the line endings of script files into DOS format
git config --global core.autocrlf false
The template defines the topology of the Redis cluster
master:
image: redis:3
slave:
image: redis:3
command: redis-server --slaveof redis-master 6379
links:
- master:redis-master
sentinel:
build: sentinel
environment:
- SENTINEL_DOWN_AFTER=5000
- SENTINEL_FAILOVER=5000
links:
- master:redis-master
- slave
There are following services in the cluster,
- master: Redis master
- slave: Redis slave
- sentinel: Redis sentinel
The sentinels are configured with a "mymaster" instance with the following properties -
sentinel monitor mymaster redis-master 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 5000
The details could be found in sentinel/sentinel.conf
The default values of the environment variables for Sentinel are as following
- SENTINEL_QUORUM: 2
- SENTINEL_DOWN_AFTER: 30000
- SENTINEL_FAILOVER: 180000
Build the sentinel Docker image
docker-compose build
Start the redis cluster
docker-compose up -d
Check the status of redis cluster
docker-compose ps
The result is
Name Command State Ports
--------------------------------------------------------------------------------------
rediscluster_master_1 docker-entrypoint.sh redis ... Up 6379/tcp
rediscluster_sentinel_1 docker-entrypoint.sh redis ... Up 26379/tcp, 6379/tcp
rediscluster_slave_1 docker-entrypoint.sh redis ... Up 6379/tcp
Scale out the instance number of sentinel
docker-compose scale sentinel=3
Scale out the instance number of slaves
docker-compose scale slave=2
Check the status of redis cluster
docker-compose ps
The result is
Name Command State Ports
--------------------------------------------------------------------------------------
rediscluster_master_1 docker-entrypoint.sh redis ... Up 6379/tcp
rediscluster_sentinel_1 docker-entrypoint.sh redis ... Up 26379/tcp, 6379/tcp
rediscluster_sentinel_2 docker-entrypoint.sh redis ... Up 26379/tcp, 6379/tcp
rediscluster_sentinel_3 docker-entrypoint.sh redis ... Up 26379/tcp, 6379/tcp
rediscluster_slave_1 docker-entrypoint.sh redis ... Up 6379/tcp
rediscluster_slave_2 docker-entrypoint.sh redis ... Up 6379/tcp
Execute the test scripts
./test.sh
to simulate stop and recover the Redis master. And you will see the master is switched to slave automatically.
Or, you can do the test manually to pause/unpause redis server through
docker pause rediscluster_master_1
docker unpause rediscluster_master_1
And get the sentinel infomation with following commands
docker exec rediscluster_sentinel_1 redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
[https://github.com/AliyunContainerService/redis-cluster] [AliyunContainerService/redis-cluster]
[https://registry.hub.docker.com/u/joshula/redis-sentinel/] 2
[https://www.cnblogs.com/qinghe123/p/9547884.html] 3
Apache 2.0 license