redis哨兵模式(Sentinel)安装部署(学习)

在 redis主从模式(读写分离)安装部署(学习) 基础之上进行配置

环境

部署1主2从3哨兵

为什么至少3个sentinel

在 sentinel 启动故障转移(failover)时需要满足两个条件:

  • 确定 master 不可用的 sentinel 数量必须大于等于 quorum
  • 大多数的 sentinel 之间必须可以通信(大多数的意思是两台就是2,三台也是2,五台就是3)

这里通信目的是选出谁来执行 failover 操作
知道了这两点也就明白为什么不推荐使用两台 sentinel 做哨兵了。因为如果两台中的其中一台哨兵宕掉后,就算你的 quorum 设置的是1,但是还是无法满足第二个条件。

所以部署 sentinel 高可用的时候至少部署三台。

配置

创建文件夹

创建redis_sentinel_1文件夹,在该文件夹内执行下面命令:

wget http://download.redis.io/redis-stable/sentinel.conf

监控 主redis

sentinel monitor mymaster <master-redis-ip> <master-redis-port> <quorum>

mymaster:自定义集群名,如果需要监控多个redis集群,只需要配置多次并定义不同的集群名
<master-redis-ip>:主redis ip。一台linux部署多个docker redis,这里是主redis的docker内网ip
<master-redis-port>:主redis的port
<quorum>:最小投票数,由于有三台redis-sentinel实例,所以可以设置成2

例子:

sentinel monitor mymaster 106.13.165.100 6379 2

设置登录主从redis密码(注意)

sentinel auth-pass mymaster redispassword

注意:

  • sentinel不能分别为master和slave设置不同的密码,因此master和slave的密码应该设置相同。

  • 必须放在sentinel monitor mymaster的下面,否则启动报错:

    *** FATAL CONFIG FILE ERROR (Redis 6.0.5) ***
    Reading the configuration file, at line 144
    >>> 'sentinel auth-pass mymaster ceshi'
    No such master with specified name.
    

设置sentinel登录密码

requirepass <password>

修改myid(关键)

由于是从官网下载的配置文件,所以myid都是一样的,根据该配置启动多个sentinel时,myid就冲突了,所以必须 改成不同的 或 注释掉(删除掉)

sentinel myid 6f9758fe4c2dac0b4b642651ab20a78b1ee274c3

失效时间

n毫秒后,master才会被sentinel主观地认为是不可用。 单位是毫秒,默认为30秒

sentinel down-after-milliseconds <master-name> <milliseconds>

不要后台运行

daemonize no

端口

在一台linux部署多个sentinel,建议改成不同端口

port 26379

启动第1个容器

docker run -p 26379:26379 \
-v /root/redis_sentinel_1/sentinel.conf:/etc/redis/sentinel.conf \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
--name redis_sentinel_1 \
-d redis:6.0 redis-sentinel /etc/redis/sentinel.conf
命令解释:
  • -p 6379:6379 端口映射,:前表示宿主机,在一台机器上部署主从,此端口必须不一样;:后表示容器
  • --name redis_slave_1:指定容器名称
  • -v /root/docker_slave_1/data:/data:挂载数据目录,规则与端口映射相同
  • -v /root/docker_slave_1/redis.conf:/etc/redis/redis.conf:挂载配置文件
  • -v /etc/localtime:/etc/localtime:ro \ 设置系统时间时区
    -v /etc/timezone:/etc/timezone:ro \ 设置时区
  • -d:表示后台启动redis
  • redis:6.0:根据镜像redis:6.0创建并运行容器
  • redis-server:执行的命令,redis-server是redis服务命令
  • /etc/redis/redis.conf:根据/etc/redis/redis.conf配置文件启动redis,加载容器内的conf文件,最终找到的是挂载的目录/root/docker_redis6.0/conf/redis.conf

查看日志

执行命令:

docker logs -f redis_sentinel_1

执行结果如下,可以看到检测到master和slave:

启动第2个容器

复制文件夹

根据redis_sentinel_1文件夹复制redis_sentinel_2文件夹和redis_sentinel_3文件夹

 cp -r redis_sentinel_1/ redis_sentinel_2
 cp -r redis_sentinel_1/ redis_sentinel_3

启动容器

docker run -p 26380:26380 \
-v /root/redis_sentinel_2/sentinel.conf:/etc/redis/sentinel.conf \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
--name redis_sentinel_2 \
-d redis:6.0 redis-sentinel /etc/redis/sentinel.conf

查看该容器日志

执行命令:

docker logs -f redis_sentinel_1

执行结果如下,可以看到检测到master和slave、第一个sentinel,说明sentinel之间通信成功:

注意: sentinel的ip是172.x.x.x,是docker内网的ip

查看第1个sentinel的日志

查看上面打开的 redis_sentinel_1 日志,发现检测到 刚启动的第2个sentinel,说明sentinel之间通信成功

注意: sentinel的ip是172.x.x.x,是docker内网的ip

启动第3个容器

复制文件夹

启动容器

docker run -p 26381:26381 \
-v /root/redis_sentinel_3/sentinel.conf:/etc/redis/sentinel.conf \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
--name redis_sentinel_3 \
-d redis:6.0 redis-sentinel /etc/redis/sentinel.conf

登录sentinel查看信息

用redis客户端redis-cli连接sentinel服务器:

redis-cli -h IP地址 -p 26379

输入登录密码:

auth 密码

查看master信息

查看所有masters

sentinel masters

查看某个master

sentinel master mymaster

查看sentinel信息

info sentinel

执行结果:

# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=106.13.165.100:6379,slaves=2,sentinels=3

最后一行可以看出 master redis的状态、ip、slave数量,sentinel数量

查看slave信息

sentinel slaves mymaster

查看所有sentine信息

sentinel sentinels mymaster

测试

停掉 master redis

模拟master redis意外退出,停掉master redis:

docker stop redis6.0

sentinel日志显示如下(每个sentinel日志显示内容可能不一样,主要内容基本一样):

最后选举端口是6399的redis作为master,其他slave redis连接新的master

重启 master redis

重启 master redis,其角色也是slave,要连接新master

网络问题

https://blog.csdn.net/qq_14869093/article/details/102453390

感谢:
https://blog.csdn.net/qq_28804275/java/article/details/80938659
https://www.jianshu.com/p/76bc6ca5405c


原文出处:/show_1EF5pon7kYFn.html