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部署redis哨兵集群 docker搭建redis哨兵模式_docker部署redis哨兵集群

下面,让我们进入主节点容器内部查看一下:

docker exec -it redis /bin/bash
redis-cli
info replication

可以看到,该redis集群中,主节点下已经有两个从节点了。

docker部署redis哨兵集群 docker搭建redis哨兵模式_docker部署redis哨兵集群_02

这里我们做个测试,在主节点中set一个num:

docker部署redis哨兵集群 docker搭建redis哨兵模式_redis集群_03

下面我们来看一下从节点的情况:

docker部署redis哨兵集群 docker搭建redis哨兵模式_docker部署redis哨兵集群_04

注意上面的slave_read_only:1,说明从节点只可读,不可写入,这也是搭建主从的目的之一。

docker部署redis哨兵集群 docker搭建redis哨兵模式_docker_05

docker部署redis哨兵集群 docker搭建redis哨兵模式_docker部署redis哨兵集群_06

测试成功,从节点只可读不可写,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 <容器对外开放的端口>

对于上面的容器网络部分的设置,这里参考了另一篇文章:,具体可以参考这篇博客进行设置。

配置好后启动三个哨兵:

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部署redis哨兵集群 docker搭建redis哨兵模式_docker部署redis哨兵集群_07

接着,我们来重启刚刚的主节点,观察一下主节点的变化:

docker restart redis
docker exec -it redis /bin/bash
redis-cli
info replication

docker部署redis哨兵集群 docker搭建redis哨兵模式_docker_08

此时我们发现,原来的主节点已变为从节点。这时,我们再来看看原来的从节点属性:

docker部署redis哨兵集群 docker搭建redis哨兵模式_redis集群_09

可以看到哨兵的状态是正确的,发现了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主从和哨兵模式的搭建已全部完成。