天天看点

redis搭建主、从、哨兵集群(docker构建)

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写入数据

[email protected]:~$ 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查看数据

[email protected]:~$ 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

继续阅读