Deployment plan
Start three machines, 6379 container as master node, the rest as slave node
Start preparations
directory structure
├── conf │ ├── redis_6379.conf │ ├── redis_6380.conf │ ├── redis_6381.conf │ ├── sentinel_26379.conf │ ├── sentinel_26380.conf │ └── sentinel_26381.conf ├── data_6379 │ ├── appendonly.aof │ └── dump.rdb ├── data_6380 │ └── dump.rdb ├── data_6381 │ └── dump.rdb └── scripts ├── run.sh └── sentinel.sh
Redis.conf configuration file
Download the configuration file. The specific configuration can be adjusted separately
https://raw.githubusercontent.com/antirez/redis/5.0/redis.conf
Sentinel.conf configuration file
port 26379 dir "/etc/redis" sentinel monitor mymaster 172.17.0.2 6379 1 sentinel down-after-milliseconds mymaster 60000 sentinel failover-timeout mymaster 180000
run.sh startup script file
#!/usr/bin/env bash set -e # Script current directory cPath=$(cd $(dirname "$0") || exit; pwd) # root directory dirPath=$(dirname "$cPath") # Get port port="$1" if [[ ! "$port" ]]; then port=6379 fi # Create data directory mkdir -p "$dirPath"/data_"$port" # Delete started services containerId=$(docker ps -a | grep "redis_$port" | awk -F' ' '') if [[ "$containerId" ]]; then echo "Deleting service: $" docker rm -f $ > /dev/null fi # Start service docker run -itd --privileged=true -p "$port":6379 --name redis_"$port" \ -v="$dirPath"/conf/redis_"$port".conf:/etc/redis/redis.conf \ -v="$dirPath"/data_"$port":/data \ redis \ redis-server /etc/redis/redis.conf
sentinel.sh startup script file
#!/usr/bin/env bash set -e # Script current directory cPath=$(cd $(dirname "$0") || exit; pwd) # root directory dirPath=$(dirname "$cPath") # Set port port=$1 if [[ ! "$port" ]]; then port=26379 fi # Delete started services containerId=$(docker ps -a | grep "sentinel_$port" | awk -F' ' '') if [[ "$containerId" ]]; then echo "Deleting service: $" docker rm -f $ > /dev/null fi # Start service docker run -itd --privileged=true -p "$port":26379 --name "sentinel_$port" \ -v="$/conf/sentinel_$.conf":/etc/redis/sentinel.conf \ -w=/etc/redis/ \ redis \ redis-server /etc/redis/sentinel.conf --sentinel
be careful
Start the sentinel service if the following error occurs
1:X 10 May 2020 08:10:48.234 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 1:X 10 May 2020 08:10:48.235 # Sentinel config file /etc/redis/sentinel.conf is not writable: Permission denied. Exiting...
Solution
- Add = = - w=/etc/redis / = = = in docker run. See sentinel.sh script for details
- Modify directory permissions
docker run -it --rm --privileged=true -v=/root/docker-config/redis/conf/:/etc/redis/ redis chown -R redis /etc/redis
Main statement: = = chown -R redis /etc/redis==
View modified permissions
root@DESKTOP-Q13EI52:~/docker-config/redis# docker run -it --rm --privileged=true -v=/root/docker-config/redis/conf/:/etc/redis/ redis ls -l /etc/redis/ total 204 -rw-r--r-- 1 redis root 61793 May 10 07:41 redis_6379.conf -rw-r--r-- 1 redis root 61864 May 10 12:52 redis_6380.conf -rw-r--r-- 1 redis root 61890 May 10 12:52 redis_6381.conf -rw-r--r-- 1 redis root 459 May 10 12:52 sentinel_26379.conf -rw-r--r-- 1 redis root 161 May 10 07:56 sentinel_26380.conf -rw-r--r-- 1 redis root 161 May 10 10:16 sentinel_26381.conf
Start Redis service
Start main service
sh scripts/run.sh 6379
Start slave service
sh scripts/run.sh 6380 sh scripts/run.sh 6381
Access from service
docker exec -it redis_6380 bash docker exec -it redis_6381 bash # Execute command after entering container redis-cli # Set to slave slaveof 172.17.0.2 6379
design sketch
Start Sentinel service
sh scripts/sentinel.sh
design sketch
Manually stop the main service
- The current machine service structure is as follows
root@DESKTOP-Q13EI52:~/docker-config/redis# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e518580ce8eb redis "docker-entrypoint.s..." About a minute ago Up About a minute 6379/tcp, 0.0.0.0:26379->26379/tcp sentinel_26379 e2ef253d3513 redis "docker-entrypoint.s..." 2 hours ago Up 2 hours 0.0.0.0:6381->6379/tcp redis_6381 15fdc81eb530 redis "docker-entrypoint.s..." 2 hours ago Up 2 hours 0.0.0.0:6380->6379/tcp redis_6380 77f4fdc84cb1 redis "docker-entrypoint.s..." 2 hours ago Up 2 hours 0.0.0.0:6379->6379/tcp redis_6379
Execute command: docker stop redis
1:X 10 May 2020 12:52:15.634 # +sdown master mymaster 172.17.0.2 6379 1:X 10 May 2020 12:52:15.634 # +odown master mymaster 172.17.0.2 6379 #quorum 1/1 1:X 10 May 2020 12:52:15.634 # +new-epoch 1 1:X 10 May 2020 12:52:15.634 # +try-failover master mymaster 172.17.0.2 6379 1:X 10 May 2020 12:52:15.649 # +vote-for-leader 6905a137af7baedbdfce4978d1d9126fdaad4faf 1 1:X 10 May 2020 12:52:15.649 # +elected-leader master mymaster 172.17.0.2 6379 1:X 10 May 2020 12:52:15.649 # +failover-state-select-slave master mymaster 172.17.0.2 6379 1:X 10 May 2020 12:52:15.725 # +selected-slave slave 172.17.0.3:6379 172.17.0.3 6379 @ mymaster 172.17.0.2 6379 1:X 10 May 2020 12:52:15.725 * +failover-state-send-slaveof-noone slave 172.17.0.3:6379 172.17.0.3 6379 @ mymaster 172.17.0.2 6379 1:X 10 May 2020 12:52:15.781 * +failover-state-wait-promotion slave 172.17.0.3:6379 172.17.0.3 6379 @ mymaster 172.17.0.2 6379 1:X 10 May 2020 12:52:16.798 # +promoted-slave slave 172.17.0.3:6379 172.17.0.3 6379 @ mymaster 172.17.0.2 6379 1:X 10 May 2020 12:52:16.798 # +failover-state-reconf-slaves master mymaster 172.17.0.2 6379 1:X 10 May 2020 12:52:16.845 * +slave-reconf-sent slave 172.17.0.4:6379 172.17.0.4 6379 @ mymaster 172.17.0.2 6379 1:X 10 May 2020 12:52:17.837 * +slave-reconf-inprog slave 172.17.0.4:6379 172.17.0.4 6379 @ mymaster 172.17.0.2 6379 1:X 10 May 2020 12:52:17.837 * +slave-reconf-done slave 172.17.0.4:6379 172.17.0.4 6379 @ mymaster 172.17.0.2 6379 1:X 10 May 2020 12:52:17.937 # +failover-end master mymaster 172.17.0.2 6379 # Generate execute failover 1:X 10 May 2020 12:52:17.937 # +switch-master mymaster 172.17.0.2 6379 172.17.0.3 6379 1:X 10 May 2020 12:52:17.938 * +slave slave 172.17.0.4:6379 172.17.0.4 6379 @ mymaster 172.17.0.3 6379 1:X 10 May 2020 12:52:17.938 * +slave slave 172.17.0.2:6379 172.17.0.2 6379 @ mymaster 172.17.0.3 6379 1:X 10 May 2020 12:53:18.010 # +sdown slave 172.17.0.2:6379 172.17.0.2 6379 @ mymaster 172.17.0.3 6379
be careful
172.17.0.2:6379 the primary node will automatically switch to the slave service after it is online again
For more information, please visit: