首页 > 数据库 >Redis-哨兵(sentinel)

Redis-哨兵(sentinel)

时间:2024-01-27 23:24:46浏览次数:29  
标签:Redis redis 哨兵 6379 repl master sentinel

Redis-哨兵(sentinel)

说明

吹哨人巡查监控后台master主机是否故障,如果故障了则根据投票数自动将某一个从库转换为新主库,继续对外服务。

配置哨兵

前置条件:

开启三台虚拟机。

架构:每台虚拟机各启动一个redis服务以及各1个redis哨兵

首先配置1主2从的redis关系

修改redis.conf配置文件,将虚拟机中第一台机器的redis端口命名为6379;

第二台机器的redis端口命名为6380;

第三台机器的redis端口命名为6381。

 6379--master主机的配置文件

 6380--slave的配置文件

 6381--slave的配置文件

 ESC---: ---wq保存退出

分别启动三台redis-server

启动6479master

redis-server redis-6379.conf # 启动master主机

 

启动6380slave

redis-server redis-6380.conf # 启动6380slave主机

 

启动6381slave

redis-server redis-6381.conf # 启动6381slave主机

 

测试主从复制

# 6379添加一个key
127.0.0.1:6379> set k1 helloword
OK
127.0.0.1:6379> get k1
"helloword"

# 6380进行get操作
127.0.0.1:6380> get k1
"helloword"

# 6381进行get操作
127.0.0.1:6381> get k1
"helloword"

 

验证结果:主从复制,配置正常。

配置哨兵

将各虚拟机的/opt/redis-7.0.0/目录下的sentinel.conf配置文件复制到/myredis/目录下

分别做修改:

第一台虚拟机中的哨兵端口号命名为26379:

bind 0.0.0.0
daemonize yes
protected-mode no
port 26379
logfile "/myredis/sentinel26379.log"
pidfile /var/run/redis-sentinel26379.pid
dir /myredis
sentinel monitor mymaster 192.168.111.169 6379 2
sentinel auth-pass mymaster 111111

 

第二台虚拟机的哨兵端口号命名为26380:

bind 0.0.0.0
daemonize yes
protected-mode no
port 26380
logfile "/myredis/sentinel26380.log"
pidfile /var/run/redis-sentinel26380.pid
dir "/myredis"
sentinel monitor mymaster 192.168.111.169 6379 2
sentinel auth-pass mymaster 111111

第三台虚拟机的哨兵端口号命名为26381:

bind 0.0.0.0
daemonize yes
protected-mode no
port 26381
logfile "/myredis/sentinel26381.log"
pidfile /var/run/redis-sentinel26381.pid
dir "/myredis"
sentinel monitor mymaster 192.168.111.169 6379 2
sentinel auth-pass mymaster 111111

 

启动哨兵

# 第一台虚拟机中执行命令
[root@192 myredis]# redis-sentinel sentinel26379.conf --sentinel

# 第二台虚拟机中执行命令
[root@192 myredis]# redis-sentinel sentinel26380.conf --sentinel

# 第三台虚拟机中执行命令
[root@192 myredis]# redis-sentinel sentinel26380.conf --sentinel

案例演示

shutdown master主机,模拟6379挂了,看看会发生什么

127.0.0.1:6379> shutdown now
not connected> quit

 

谁成为新的master?

登录6380,执行info replication命令

127.0.0.1:6380> info replication
# Replication
role:master ###########6380成为新的master
connected_slaves:1
slave0:ip=192.168.1.13,port=6381,state=online,offset=648478,lag=0
master_failover_state:no-failover
master_replid:a1d36222666d130cf5464b3d529dfa3e456b4996
master_replid2:d1e6b81d26acc4c26b624bfc8d666222b5fd1a3b
master_repl_offset:648617
second_repl_offset:642979
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:719
repl_backlog_histlen:647899

 

登录6381,执行info replication命令

127.0.0.1:6381> info replication
# Replication
role:slave######6381还是slave
master_host:192.168.1.12
master_port:6380 ###新的master已经成为6380
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_read_repl_offset:658445
slave_repl_offset:658445
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:a1d36222666d130cf5464b3d529dfa3e456b4996
master_replid2:d1e6b81d26acc4c26b624bfc8d666222b5fd1a3b
master_repl_offset:658445
second_repl_offset:642979
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:578475
repl_backlog_histlen:79971

原来的master6379重新启动之后,是什么角色?

[root@192 myredis]# redis-server redis-6379.conf  # 启动6379
[root@192 myredis]# redis-cli -a 111111 -p 6379 # 登录

127.0.0.1:6379> info replication # 查看
# Replication
role:slave ###slave角色
master_host:192.168.1.12
master_port:6380
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_read_repl_offset:673217
slave_repl_offset:673217
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:a1d36222666d130cf5464b3d529dfa3e456b4996
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:673217
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:671791
repl_backlog_histlen:1427

 

哨兵的运行流程和选举原理

当一个主从配置中的master失效之后,sentinel可以选举出一个新的master用于自动接替原master的工作,主从配置中的其他redis服务器自动指向新的master同步数据般建议sentinel采取奇数台,防止某一台sentinel无法连接到master导致误切换

名词:

sDown:主观下线

单个哨兵自己主观上检测到关于master的状态,从哨兵的角度来看,如果发送PING心跳后,在一定时间内没有收到合法的回复,就达到了sDown的条件。

 

oDown:客观下线

odown需要一定数量的sentinel,多个哨兵达成一致意见才能认为一个master客观上已经宕掉。

流程:

  1. 哨兵认定为客观下线
  2. 需要选举出领导者哨兵
  3. 领导者开始推动故障切换流程并选出一个新的master

选举领导者哨兵的原理

Raft算法:先到先得(哨兵A向B发送成为领导者的申请,如果B没有同意过其他哨兵,则会同意A成为领导者)

 

注意事项

  1. 哨兵节点的数量应该是多个,哨兵本身应该集群,保证高可用。
  2. 哨兵节点的数量应该是奇数
  3. 各个哨兵节点的硬件配置应一致
  4. 如果哨兵节点部署在Docker容器里面,尤其需要注意端口的映射。
  5. 哨兵集群+主从复制,并不能保证数据的零丢失。-------故有了redis集群

 

标签:Redis,redis,哨兵,6379,repl,master,sentinel
From: https://www.cnblogs.com/mingbo-1/p/17992341

相关文章

  • 2,Redis下载与安装
    redis下载与安装#下载redis安装包,https://redis.io/download/,以下为5.0.7版本为例wgethttp://download.redis.io/releases/redis-5.0.7.tar.gz#解压安装包tar-zvxfredis-5.0.7.tar.gz#移动到特定的目录mv./redis-5.0.7/usr/local/rediscd/usr/local/redis/#编译......
  • 为什么 Redis Cluster 是16384个槽位
    为什么RedisCluster是16384个槽位正常的心跳数据包携带节点的完整配置,它能以幂等方式来更新配置。如果采用16384个插槽,占空间2KB(16384/8);如果采用65536个插槽,占空间8KB(65536/8)。RedisCluster不太可能扩展到超过1000个主节点,太多可能导致网络拥堵。16384个插......
  • redis 7.07升级导致spring boot连接不上
    Causedby:org.springframework.data.redis.connection.PoolException:Couldnotgetaresourcefromthepool;nestedexceptionisio.lettuce.core.RedisConnectionException:Unabletoconnect升级springboot、升级jedis<parent> <groupId>org.springfram......
  • Redis安全机制
    如果使用官方配置(如Redis5.0.5配置),新启动的Redis服务,只能在本地访问,其他服务无法与之通信如果通过Docker安装的Redis,宿主机也无法与容器通信原因是Redis默认开启了安全保护机制https://redis.io/docs/management/security/绑定IP支持ipv4和ipv6地址保护模式开......
  • SpringBoot整合Redis
    1、pom.xml中引入redis依赖<!--Redis依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>2、application.yml配置文件中配置Redis连接参数等s......
  • redis未授权
    redis未授权搭建环境ubuntu安装并启动redis服务wgethttp://download.redis.io/releases/redis-3.2.11.tar.gz#下载压缩包tarxzfredis-3.2.11.tar.gz#解压cdredis-3.2.11#进入目录make#编译执行cdsrccpredis-server/usr/bin/cpredis-cli/usr/bin/#把上面两......
  • Redis缓存优化项目
    Redis数据库基础Redis数据库概述Redis是一个基于内存的key-value结构数据库,即非关系型数据库(NoSql)数据库并不是要取代关系型数据库,而是关系型数据库的一种补充。Redis是互联网技术领域使用最为广泛的存储中间件,他是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方......
  • Redis篇-redis使用场景-缓存-缓存雪崩-04
    1缓存雪崩缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。解决方案:给不同Key的TTL添加随机值;利用Redis集群提高服务的可用性;哨兵模式、集群模式给缓存业务添加降级限流策略;ngxin或springcloudGateway给业务添加......
  • go-zero配置DB的redis缓存
    配置定义:#catinternal/config/config.gopackageconfigimport( "github.com/zeromicro/go-zero/rest" "github.com/zeromicro/go-zero/core/stores/cache")typeConfigstruct{ rest.RestConf CacheRediscache.CacheConf}对应的配置文件:#cat......
  • Redis实战篇
    实战篇Redis优秀博客黑马点评项目学习笔记(15w字详解,堪称史上最详细,欢迎收藏)-CSDN博客Redis实战篇|Kyle'sBlog(cyborg2077.github.io)开篇导读hutol工具使用对象bean和JsonStr互转//功能:javabean转jsonstr用途:存入到redisStringjsonstr=JSONUtil.toJsonSt......