docker 搭建 redis 主从,哨兵
1. redis 主从
本文只展示搭建最简单的主从模式,即一主二从,其他的与此类似。
一、环境
操作系统:centos7
Docker version: 20.10.18
二、具体操作
首先,docker拉取redis镜像:
docker pull redis
拉取镜像后,在构建redis docker之前,我们要先去获取一下redis.conf,方便一会配置:https://redis.io/docs/manual/config/
在redis官网拉取conf文件后,我们需要做一些小配置;
# 关闭保护模式 此处关闭,防止一会哨兵模式选举时,无法真正地切换主节点
protected-mode no
# 让redis服务后台运行(因为使用docker启动时使用了-d参数,所以需要设置为no, 非docker设置为yes)
daemonize no
# 设定密码(可选,如果这里开启了密码要求,slave的配置里就要加这个密码. 只是练习配置,就不使用密码认证了)
# requirepass masterpassword
# logfile "/var/tmp/redis.log"
# 从机需要设置该参数
# (redis2.conf和redis3.conf需要将masterip设置为主机的公网或者局域网ip,masterport为主机公布的端口)
# 注意该参数在早期,redis5及以前的版本为slaveof
replicaof <masterip> <masterport>
# 这两个参数可以强制slave向master声明任意IP和端口对,docker内部网络与外部不同
# 基于docker所构建的redis集群在docker容器内是能够访问的,但是在容器外或者两个无关联的容器间,是无法访问的
# 使用这两个参数后,从节点发送给主节点的ip和端口信息就是在这里设定好了。
replica-announce-ip 5.5.5.5
replica-announce-port 1234
ok,配置完成后,就到了我们最喜欢的构建docker环节:
docker run --name redis \
--privileged=true \ # 使容器具备更多的权限
-p 6379:6379 \
-v /tmp/redis/conf/redis.conf:/etc/redis/redis.conf \ # 这里的挂载地址自己选择,即/tmp/redis/conf/redis.conf
-v /tmp/redis:/data \ # 与上一个同理
-d redis redis-server /etc/redis/redis.conf --appendonly yes # 开启aof
docker run --name redis-slave1 \
--privileged=true \
-p 6380:6379 \
-v /tmp/redis-slave1/conf/redis.conf:/etc/redis/redis.conf \
-v /tmp/redis-slave1:/data \
-d redis redis-server /etc/redis/redis.conf --appendonly yes
docker run --name redis-slave2 \
--privileged=true \
-p 6381:6379 \
-v /tmp/redis-slave2/conf/redis.conf:/etc/redis/redis.conf \
-v /tmp/redis-slave2:/data \
-d redis redis-server /etc/redis/redis.conf --appendonly yes
运行完成后,查看容器运行状态:
下面,让我们进入主节点容器内部查看一下:
docker exec -it redis /bin/bash
redis-cli
info replication
可以看到,该redis集群中,主节点下已经有两个从节点了。
这里我们做个测试,在主节点中set一个num:
下面我们来看一下从节点的情况:
注意上面的slave_read_only:1,说明从节点只可读,不可写入,这也是搭建主从的目的之一。
测试成功,从节点只可读不可写,redis主从搭建成功!
2. redis 哨兵
一、具体操作
在搭建redis哨兵之前,我们也要先写两个配置文件,名为sentinel.conf
# 让服务后台运行(因为使用docker启动时使用了-d参数,所以需要设置为no, 非docker设置为yes)
daemonize no
# docker对外开放的端口
port 26379
# 这里配置的是监控的redis的地址,mymaster为默认的主节点名字,后面的2为客观掉线的票数,一般为集群数除二
sentinel monitor mymaster 101.34.80.114 6379 2
# 超过5秒master还没有连接上,则认为master已经停止,5000ms
sentinel down-after-milliseconds mymaster 5000
# 故障转移超时时间
sentinel failover-timeout mymaster 60000
# 这两个参数可以强制slave向master声明任意IP和端口对,docker内部网络与外部不同
# 基于docker所构建的redis集群在docker容器内是能够访问的,但是在容器外或者两个无关联的容器间,是无法访问的
# 使用这两个参数后,从节点发送给主节点的ip和端口信息就是在这里设定好了。
sentinel announce-ip <服务器ip>
sentinel announce-port <容器对外开放的端口>
对于上面的容器网络部分的设置,这里参考了另一篇文章:https://blog.csdn.net/qq_14869093/article/details/102453390,具体可以参考这篇博客进行设置。
配置好后启动三个哨兵:
docker run --name redis-sentinel-01 \
--privileged=true \
-p 26379:26379 \
-v /tmp/redis/conf/sentinel.conf:/etc/redis/sentinel.conf \
-d redis redis-sentinel /etc/redis/sentinel.conf
docker run --name redis-sentinel-02 \
--privileged=true \
-p 26380:26380 \
-v /tmp/redis-slave1/conf/sentinel.conf:/etc/redis/sentinel.conf \
-d redis redis-sentinel /etc/redis/sentinel.conf
docker run --name redis-sentinel-03 \
--privileged=true \
-p 26381:26381 \
-v /tmp/redis-slave2/conf/sentinel.conf:/etc/redis/sentinel.conf \
-d redis redis-sentinel /etc/redis/sentinel.conf
运行完毕后,我们来通过docker ps查看一下:
接着,我们来重启刚刚的主节点,观察一下主节点的变化:
docker restart redis
docker exec -it redis /bin/bash
redis-cli
info replication
此时我们发现,原来的主节点已变为从节点。这时,我们再来看看原来的从节点属性:
可以看到哨兵的状态是正确的,发现了1个主节点,2个从节点,并且哨兵一共有3个。
主节点崩溃后,其中一个从节点变为主节点,并且另外一个从节点以新主节点做备份。
二、springboot集成
spring:
redis:
lettuce: # 连接池配置
pool:
max-active: 100
max-idle: 16
max-wait: 1000
min-idle: 4
shutdown-timeout: 1000
sentinel: # 哨兵监控配置
master: mymaster
nodes:
- #.#.#.#:26379
- #.#.#.#:26380
- #.#.#.#:26381
至此,redis主从和哨兵模式的搭建已全部完成。