在 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:表示后台启动redisredis: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



