redis主从:
主从复制,从只读模式。
哨兵sentinel:
- 监控(Monitoring): Sentinel会不断地检查你的主服务器和从服务器是否运作正常。
- 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
- 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作,它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器;
当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。
主从切换过程:
(1) slave leader升级为master
(2) 其他slave修改为新master的slave
(3) 客户端修改连接
(4) 老的master如果重启成功,变为新master的slave
搭建过程
安装docker-ce(略)
拉取镜像:
docker pull redis
主配置文件:
bind 0.0.0.0
daemonize no
pidfile "/var/run/redis.pid"
port 6379
timeout 300
loglevel warning
logfile "redis.log"
databases 16
rdbcompression yes
dbfilename "redis.rdb"
dir "/data"
requirepass "12345678"
masterauth "12345678"
maxclients 10000
maxmemory 1000mb
maxmemory-policy allkeys-lru
appendonly no
appendfsync always
启动一个master:
- 这里虽然在前面dir中设置了工作目录dir,但是在redis启动命令加载配置文件的时候,还是加载不到,所以,我给配置文件加了容器内的路径,才得以找到配置文件。
docker run --name redis_master \
-p 6379:6379 \
-v /qj/redis/master/:/data/ \
-v /etc/localtime:/ete/localtime \
-v /etc/timezone:/etc/timezone \
--restart=always -d redis:latest \
redis-server /data/redis_master.conf --appendonly yes
从配置文件:
bind 0.0.0.0
daemonize no
pidfile "/var/run/redis.pid"
port 6380
timeout 300
loglevel warning
logfile "redis.log"
databases 16
rdbcompression yes
dbfilename "redis.rdb"
dir "/data"
requirepass "12345678"
masterauth "12345678"
maxclients 10000
maxmemory 1000mb
maxmemory-policy allkeys-lru
appendonly no
appendfsync always
slaveof 172.17.0.1 6379#master的容器地址和端口
启动一个slave:
- 因为是同一个宿主机,所以端口我改成了6380,企业生产环境或者虚拟机中不必这样。
docker run --name redis_slave \
-p 6380:6380 \
-v /qj/redis/slave/:/data/ \
-v /etc/localtime:/ete/localtime \
-v /etc/timezone:/etc/timezone \
--restart=always -d redis:latest \
redis-server /data/redis_slave.conf --appendonly yes
主从搭建完成。
sentinel配置文件
daemonize no
protected-mode no
port 26379
dir "/tmp"
sentinel monitor mymaster 172.17.0.1 6379 1
sentinel down-after-milliseconds mymaster 10000
sentinel auth-pass mymaster 12345678
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
启动sentinel:
docker run --name sentinel --network host \
-p 26379:26379 \
-v /qj/redis/sentinel/sentinel.conf:/data/sentinel.conf \
-v /etc/localtime:/ete/localtime \
-v /etc/timezone:/etc/timezone \
--restart=always -d redis:latest redis-sentinel sentinel.conf
哨兵搭建完成。
测试:
进入主redis写入数据
docker@master:~$ docker exec -it redis_master bash
redis-cli \\进入redis终端
172.17.0.1:6379> AUTH 12345678 \\登录
OK
172.17.0.1:6379> info replication \\查看role角色是否为master
172.17.0.1:6379> set aaa 123 \\设置键值对
OK
172.17.0.1:6379> keys * \\查看所有数据
1) "aaa"
OK
172.17.0.1:6379>exit
进入从redis查看数据
docker@slave:~$ docker exec -it redis_slave bash
redis-cli -p 6380 \\进入redis终端
172.17.0.1:6380> AUTH 12345678 \\登录
OK
172.17.0.1:6380> info replication \\查看role角色是否为slave
172.17.0.1:6380> keys * \\查看所有数据
1) "aaa"
172.17.0.1:6380>exit
主从复制成功。
先动态加载sentinel日志:
docker logs -f sentinel
停掉master的容器:
docker stop redis_master
观看日志变化。
再次进入从redis,用info replication
查看状态,这里省略,参考上面。
master再次启动,进入master容器,info replication
查看状态为slave。
这个简单的实验,可以理解redis主、从、哨兵的工作机制。
更多详细资料参考:
https://www.cnblogs.com/kevingrace/p/9004460.html