redis之哨兵集群搭建

一:哨兵集群工作概览图
在这里插入图片描述
1.监控:sentinel通过心跳监控redis的master和slave实例是否正常工作
2.故障转移:假如master出现故障,sentinel会选举一个slave作为新的master,当故障实例恢复后身份会变成slave,会以新的master为主

二:哨兵的选举机制原理
在这里插入图片描述
sentinel基于心跳形式监控redis集群服务,每秒向每个redis实例发送ping命令
1:主观下线:sentinel发现某redis实例在规定时间内没有心跳响应则认为该实例下线
2:客观下线:超过配置的指定数量(quorum) 的sentinel都认为该redis主观下线,则该实例为客观下线,quorum的数量最好为sentinel数量的一半,例如这里3个sentinel实例,quorum则应该配置为2

三:sentinel故障转移原理
在这里插入图片描述
1:sentinel向选举的slave节点发送slaveof no one命令使其变为master节点
2:sentinel向其他slave节点发送slaveof ip port,使其他slave节点认新的master节点为主节点,之后开始同步数据
3:sentinel把故障节点标记为slave节点,故障节点恢复后成为新master节点的从节点

四:使用docker compose搭建哨兵集群(三redis实例三哨兵)
redis1配置文件

#绑定端口
bind 0.0.0.0
#端口
port 63799
#保护模式关闭
protected-mode no
#注释掉daemonize yes,或者配置成 daemonize no。因为该配置和 docker run中的 -d 参数冲突,会导致容器一直启动失败
daemonize no
##设置日志级别,如debug、verbose、notice、warning等。
loglevel notice
#logfile:指定日志文件的路径
logfile /var/log/redis/redis.log
# 设置密码,这样只有输入正确的密码后才能访问服务器。默认为空,表示没有密码。
requirepass ming
#从节点与主节点通信的密码
masterauth ming
#redis能使用的最大内存
maxmemory 1gb
#是否在将rdb文件持久化到磁盘时,进行压缩操作。设置为 "yes" 可以提高数据安全性,但可能会降低性能。默认为 "no"。
rdbcompression yes
#rdb文件名
dbfilename rdb_dump.rdb
#指定Redis服务器存储数据(比如RDB快照文件)的目录
dir /data
#rdb持久化,快照可以用一个空字符串参数完全禁用:save “”
#在900秒(15分钟)内,如果有至少1个键被改变,则bgsave进行RDB持久化
#在300秒(5分钟)内,如果有至少10个键被改变,则bgsave进行RDB持久化
#在60秒内,如果有至少10000个键被改变,则bgsave进行RDB持久化
save 900 1          
save 300 10          
save 60 10000        
#开启aof持久化,关闭为no
appendonly yes
#aof持久化刷盘策略
appendfsync everysec

redis2配置文件

bind 0.0.0.0
#保护模式关闭
protected-mode no
#注释掉daemonize yes,或者配置成 daemonize no。因为该配置和 docker run中的 -d 参数冲突,会导致容器一直启动失败
daemonize no
#端口
port 63800
##设置日志级别,如debug、verbose、notice、warning等。
loglevel notice
#logfile:指定日志文件的路径
logfile /var/log/redis/redis.log
#redis能使用的最大内存
maxmemory 1gb
#是否在将rdb文件持久化到磁盘时,进行压缩操作。设置为 "yes" 可以提高数据安全性,但可能会降低性能。默认为 "no"。
rdbcompression yes
#rdb文件名
dbfilename rdb_dump.rdb
#指定Redis服务器存储数据(比如RDB快照文件)的目录
dir /data
#rdb持久化,快照可以用一个空字符串参数完全禁用:save “”
#在900秒(15分钟)内,如果有至少1个键被改变,则bgsave进行RDB持久化
#在300秒(5分钟)内,如果有至少10个键被改变,则bgsave进行RDB持久化
#在60秒内,如果有至少10000个键被改变,则bgsave进行RDB持久化
save 900 1          
save 300 10          
save 60 10000        
#开启aof持久化,关闭为no
appendonly yes
#master实例地址
slaveof 192.168.1.9 63799
# 设置密码,这样只有输入正确的密码后才能访问服务器。默认为空,表示没有密码。
requirepass ming
#这个密码用于主从节点间的连接
masterauth ming  

redis3配置文件

bind 0.0.0.0
#保护模式关闭
protected-mode no
#注释掉daemonize yes,或者配置成 daemonize no。因为该配置和 docker run中的 -d 参数冲突,会导致容器一直启动失败
daemonize no
#端口
port 63801
##设置日志级别,如debug、verbose、notice、warning等。
loglevel notice
#logfile:指定日志文件的路径
logfile /var/log/redis/redis.log
#redis能使用的最大内存
maxmemory 1gb
#是否在将rdb文件持久化到磁盘时,进行压缩操作。设置为 "yes" 可以提高数据安全性,但可能会降低性能。默认为 "no"。
rdbcompression yes
#rdb文件名
dbfilename rdb_dump.rdb
#指定Redis服务器存储数据(比如RDB快照文件)的目录
dir /data
#rdb持久化,快照可以用一个空字符串参数完全禁用:save “”
#在900秒(15分钟)内,如果有至少1个键被改变,则bgsave进行RDB持久化
#在300秒(5分钟)内,如果有至少10个键被改变,则bgsave进行RDB持久化
#在60秒内,如果有至少10000个键被改变,则bgsave进行RDB持久化
save 900 1          
save 300 10          
save 60 10000        
#开启aof持久化,关闭为no
appendonly yes
#master实例地址
slaveof 192.168.1.9 63799
# 设置密码,这样只有输入正确的密码后才能访问服务器。默认为空,表示没有密码。
requirepass ming
#这个密码用于主从节点间的连接
masterauth ming  

sentinel1配置文件

# 设置绑定地址,使之可以被外部访问(绑定哨兵所在机器的ip地址)
bind 0.0.0.0
#默认端口
port 26379 
#注释掉daemonize yes,或者配置成 daemonize no。因为该配置和 docker run中的 -d 参数冲突,会导致容器一直启动失败
daemonize no  
#日志文件
logfile /logs/sentinel26379.log
#指定别名  主节点地址  端口  哨兵个数(有几个哨兵监控到主节点宕机执行转移)
sentinel monitor mymaster 192.168.1.9 63799 2
# 如果哨兵3s内没有收到主节点的心跳,哨兵就认为主节点宕机了,默认是30秒
sentinel down-after-milliseconds mymaster 30000
# 选举出新的主节点之后,可以同时连接从节点的个数
sentinel parallel-syncs mymaster 1
# 如果10秒后,master仍没活过来,则启动failover,默认180s
sentinel failover-timeout mymaster 180000
# 配置连接redis主节点密码(如果需要的话进行配置)
sentinel auth-pass mymaster ming

sentinel2配置文件

# 设置绑定地址,使之可以被外部访问(绑定哨兵所在机器的ip地址)
bind 0.0.0.0
#默认端口
port 26380
#注释掉daemonize yes,或者配置成 daemonize no。因为该配置和 docker run中的 -d 参数冲突,会导致容器一直启动失败
daemonize no  
#日志文件
logfile /logs/sentinel26380.log
#指定别名  主节点地址  端口  哨兵个数(有几个哨兵监控到主节点宕机执行转移)
sentinel monitor mymaster 192.168.1.9 63799 2
# 如果哨兵3s内没有收到主节点的心跳,哨兵就认为主节点宕机了,默认是30秒
sentinel down-after-milliseconds mymaster 30000
# 选举出新的主节点之后,可以同时连接从节点的个数
sentinel parallel-syncs mymaster 1
# 如果10秒后,master仍没活过来,则启动failover,默认180s
sentinel failover-timeout mymaster 180000
# 配置连接redis主节点密码(如果需要的话进行配置)
sentinel auth-pass mymaster ming

sentinel3配置文件

# 设置绑定地址,使之可以被外部访问(绑定哨兵所在机器的ip地址)
bind 0.0.0.0
#默认端口
port 26381
#注释掉daemonize yes,或者配置成 daemonize no。因为该配置和 docker run中的 -d 参数冲突,会导致容器一直启动失败
daemonize no  
#日志文件
logfile /logs/sentinel26381.log 
#指定别名  主节点地址  端口  哨兵个数(有几个哨兵监控到主节点宕机执行转移)
sentinel monitor mymaster 192.168.1.9 63799 2
# 如果哨兵3s内没有收到主节点的心跳,哨兵就认为主节点宕机了,默认是30秒
sentinel down-after-milliseconds mymaster 30000
# 选举出新的主节点之后,可以同时连接从节点的个数
sentinel parallel-syncs mymaster 1
# 如果10秒后,master仍没活过来,则启动failover,默认180s
sentinel failover-timeout mymaster 180000
# 配置连接redis主节点密码(如果需要的话进行配置)
sentinel auth-pass mymaster ming

本人docker挂载目录结构如下,按需创建即可
在这里插入图片描述
docker-compose-redis-sentinel.yml文件内容,文件名,文件中内容的目录路径换成自己的即可

version: '3.7'
services:
  redie-1:
   environment:
     - TZ=Asia/Shanghai
   image: "redis:7.4"
   container_name: redis1
   restart: always
   ports:
     - 63799:63799
   command: redis-server /usr/local/etc/redis/redis.conf  
   volumes:
     - /Applications/java_dev_util/dockerData/redis-sentinel/redis1/data:/data 
     - /Applications/java_dev_util/dockerData/redis-sentinel/redis1/logs:/var/log/redis 
     - /Applications/java_dev_util/dockerData/redis-sentinel/redis1/redis.conf:/usr/local/etc/redis/redis.conf 
  redie-2:
   environment:
     - TZ=Asia/Shanghai
   image: "redis:7.4"
   container_name: redis2
   restart: always
   ports:
     - 63800:63800
   volumes:
     - /Applications/java_dev_util/dockerData/redis-sentinel/redis2/data:/data 
     - /Applications/java_dev_util/dockerData/redis-sentinel/redis2/logs:/var/log/redis 
     - /Applications/java_dev_util/dockerData/redis-sentinel/redis2/redis.conf:/usr/local/etc/redis/redis.conf 
   command: redis-server /usr/local/etc/redis/redis.conf
  redie-3:
   environment:
     - TZ=Asia/Shanghai
   image: "redis:7.4"
   container_name: redis3
   restart: always
   ports:
     - 63801:63801
   volumes:
     - /Applications/java_dev_util/dockerData/redis-sentinel/redis3/data:/data 
     - /Applications/java_dev_util/dockerData/redis-sentinel/redis3/logs:/var/log/redis 
     - /Applications/java_dev_util/dockerData/redis-sentinel/redis3/redis.conf:/usr/local/etc/redis/redis.conf 
   command: redis-server /usr/local/etc/redis/redis.conf

  sentinel-1:
   environment:
     - TZ=Asia/Shanghai # 设置时区
   image: "redis:7.4" #redis 镜像源
   container_name: sentinel1   # 容器的名字
   restart: always
   command: redis-sentinel /usr/local/etc/redis/conf/sentinel.conf
   ports:
     - 26379:26379 
   volumes:
     - /Applications/java_dev_util/dockerData/redis-sentinel/sentinel1/data:/data
     - /Applications/java_dev_util/dockerData/redis-sentinel/sentinel1/logs:/logs
     - /Applications/java_dev_util/dockerData/redis-sentinel/sentinel1/sentinel.conf:/usr/local/etc/redis/conf/sentinel.conf  
  sentinel-2:
   environment:
     - TZ=Asia/Shanghai
   image: "redis:7.4"
   container_name: sentinel2
   restart: always
   command: redis-sentinel /usr/local/etc/redis/conf/sentinel.conf
   ports:
     - 26380:26380
   volumes:
     - /Applications/java_dev_util/dockerData/redis-sentinel/sentinel2/data:/data
     - /Applications/java_dev_util/dockerData/redis-sentinel/sentinel2/logs:/logs
     - /Applications/java_dev_util/dockerData/redis-sentinel/sentinel2/sentinel.conf:/usr/local/etc/redis/conf/sentinel.conf
  sentinel-3:
   environment:
     - TZ=Asia/Shanghai
   image: "redis:7.4"
   container_name: sentinel3
   restart: always
   command: redis-sentinel /usr/local/etc/redis/conf/sentinel.conf
   ports:
     - 26381:26381
   volumes:
     - /Applications/java_dev_util/dockerData/redis-sentinel/sentinel3/data:/data
     - /Applications/java_dev_util/dockerData/redis-sentinel/sentinel3/logs:/logs
     - /Applications/java_dev_util/dockerData/redis-sentinel/sentinel3/sentinel.conf:/usr/local/etc/redis/conf/sentinel.conf
 
 

docker compose启动

#进入到docker-compose-redis-sentinel.yml文件目录运行
docker compose -f ./docker-compose-redis-sentinel.yml up -d

已经跑起来了
在这里插入图片描述
redis命令查看信息
在这里插入图片描述
到此为止哨兵集群搭建成功,生产环境redis实例应该部署在单独服务器上,这样才能真正的分担读写压力,而且哨兵集群模式虽然可以实现高可用,解决高并发读的问题,但高并发写和海量数据存储的问题依然没有解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值