首页 > 数据库 >Redis的哨兵和集群实现高可用

Redis的哨兵和集群实现高可用

时间:2024-07-12 17:58:02浏览次数:16  
标签:Redis 哨兵 故障 集群 服务器 节点

一个典型的高可用Redis集群示例配置

1个主服务器
2-3个从服务器
3-5个哨兵

哨兵和集群就是为了高可用

哨兵

哨兵的功能:监听和故障转移

(1)客户端可以从哨兵获得集群的状态。
(2)当主服务器断开,哨兵可以进行选举主服务器。

哨兵的工作流程

  1. 在配置中,设置master的ip和端口
  2. 创建master之间的命令连接和订阅连接

命令连接:发送命令
订阅连接:即发布与订阅功能的订阅功能,订阅了_sentinel_:hello频道,用来发布配置变更等
当一个哨兵通过命令连接向服务器发送一条命令后,服务器会再哨兵频道发布这条命令,此时订阅的所有哨兵都能感知到

  1. sentinel默认10秒一次通过命令连接向主服务器获取当前集群消息。(从服务器的ip,port,状态,offset等)
  2. 建立从服务器的命令连接和订阅哨兵频道
  3. 和其他哨兵建立命令连接
  4. 主服务器主观下线和客观下线

因为哨兵的超时下线时间配置不同,当一个哨兵检测到下线那么就是主观下线,当多个哨兵(个数需要配置)同时同意主服务器下线,那么就是客观下线

  1. 选举领头哨兵(随机)
  2. 领头哨兵进行故障转移(raft)
    将一个从服务器转为主服务器,掉线主服务器重连后作为从服务器。
    即向新主服务器发送slaveof no one,其他服务器发送slaveof 新主服务器的ip port

集群

redis的主从框架是为了备份和高可用,集群是为了分布式集群扩容。
集群就是将数据发布到不同的redis程序中。
使用集群功能时只能使用0号数据库。

数据分片

所有的信息都分布到槽中:
Redis 集群使用 CRC16 哈希函数来计算每个键的哈希值,然后对 16384 取模,以确定该键属于哪个槽。具体公式为:
计算一个key的hash值:slot=CRC16(key)%16384

要想集群工作,需要将1万6的槽都分配

如果 Redis 集群中的所有 16384 个槽没有被分配完,那么集群将无法正常工作。每个槽都需要被分配给一个节点,否则集群会认为它尚未完全初始化,导致集群状态为不健康。

重定向

当客户端请求的键不在当前节点负责的槽范围内时,需要进行重定向,以确保请求被正确处理。
客户端只需发送一次 GET 命令,Redis 集群会处理重定向并将结果返回给客户端。

节点间通信

Redis 集群中的所有节点(主节点和从节点)需要互相通信以交换状态信息、检测故障以及协调数据分片和故障转移。主要的通信方式包括:

Gossip 协议:节点之间使用 Gossip 协议交换集群状态信息。每个节点会定期向其他节点发送 PING 消息,并接收 PONG 响应,以检测节点的健康状况和状态变化。
Pub/Sub 机制:节点之间使用发布/订阅机制来传播集群配置更改和槽分配信息。

故障检测和转移

Redis 集群通过节点间的心跳消息和故障检测机制来实现高可用性。当主节点发生故障时,集群会自动进行故障转移(failover),具体步骤如下:

故障检测:集群中的每个节点都会定期向其他节点发送 PING 消息,以检测节点的健康状态。如果一个节点在一定时间内未能响应 PING 消息,该节点将被标记为下线。
故障确认:其他节点也会检查该节点的状态,如果大多数主节点都认为该节点下线,则该节点会被标记为故障节点。
选举新的主节点:从节点中选举一个新的主节点。选举过程由集群中的节点协同完成,通常选择拥有最新数据的从节点作为新的主节点。
角色转换:被选中的从节点会转换为主节点,并接管故障主节点的槽。其他从节点会重新配置,开始复制新的主节点的数据。
新的主节点接管了故障主节点的槽,客户端请求会被重定向到新的主节点。

开放通信端口

Redis 节点需要开放两个端口,一个是标准的 Redis 端口(默认 6379),另一个是集群总线端口(通常是 Redis 端口加 10000,例如 16379)。集群总线端口用于节点间的 Gossip 通信和故障检测。

集群配置

配置 Redis 集群时,需要确保各个节点可以正确识别和通信。常见的配置步骤包括:
配置文件:在每个 Redis 实例的配置文件中启用集群模式,并指定节点间的通信端口。例如:
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
启动集群:使用 redis-cli 工具创建和初始化集群时,确保所有节点的 IP 地址和端口正确,并且节点间可互相访问。例如:
redis-cli --cluster create 192.168.1.1:6379 192.168.1.2:6379 192.168.1.3:6379 --cluster-replicas 1

从节点加入集群

(1)正确配置 slaveof 命令:
从节点需要通过 slaveof 命令将自己配置为某个主节点的从节点。例如:
slaveof
(2)从节点需要开启集群模式:
在 Redis 集群中,所有的节点(主节点和从节点)都需要在配置文件中启用集群模式。这可以通过设置 cluster-enabled yes 来实现。
(3)集群握手和加入:
当从节点正确配置了 slaveof 命令并启用了集群模式后,它会尝试连接主节点,并进行握手和加入集群的过程。主节点会识别连接的从节点,并将其加入到集群中。从节点会从主节点同步数据,并参与集群中的数据复制和故障转移。
(4)自动发现其他节点:
一旦从节点成功加入集群,它会通过集群的 gossip 协议与其他节点通信,获取集群的配置信息和状态。

集群客户端:lettuce

在 Java 中连接 Redis 集群,通常使用的是 lettuce 或 Jedis Cluster 这两个主要的客户端库。它们都支持 Redis 集群模式,并提供了自动的节点发现、数据分片管理和自动重定向功能。

标签:Redis,哨兵,故障,集群,服务器,节点
From: https://blog.csdn.net/qq_35693377/article/details/140376229

相关文章

  • Java-Redis缓存穿透、缓存击穿及缓存雪崩(配解决方案及代码示例)
    前言在现代高并发的互联网应用中,缓存技术已成为提升系统响应速度与减轻后端数据库压力的关键手段。Redis,以其卓越的性能和丰富的数据结构,成为众多开发者构建缓存层的首选。然而,随着业务复杂度的增加,Redis缓存层也可能遭遇“缓存穿透”、“缓存击穿”以及“缓存雪崩”等现......
  • MySQL与Redis优化
    MySQL优化策略:查询优化:使用EXPLAIN分析查询语句,优化JOIN操作,减少子查询和复杂的WHERE条件。索引优化:合理创建索引以加快查询速度,同时避免过度索引导致写性能下降。数据类型优化:使用合适的数据类型,避免冗余和浪费,例如使用TIMESTAMP代替DATETIME。表结构优化:如垂直分割和水平......
  • Redis部署与使用
    一、关系型数据库与非关系型数据库1.关系型数据库关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一般面向于记录。SQL语句(标准数据查询语言)就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操作。主流的关系型数据库包括Oracle、MySQ......
  • Redis数据结构—跳跃表 skiplist 实现源码分析
    Redis是一个开源的内存数据结构存储系统,它可以用作数据库、缓存和消息中间件。Redis的数据结构非常丰富,其中跳跃表(skiplist)是一种重要的数据结构,它被用来实现有序集合(sortedsets)。跳跃表是一种概率型数据结构,它通过多层链表来实现快速的查找操作。跳跃表的结构类似于多层索引,......
  • Redis学习笔记
    目录启动图形化工具StringListSETSortedSetHash启动redis-sever.exeredis-cliredis-cli--raw----ctrl+c停止图形化工具redisinsightStringSETnamekwq//键值对GETname//键区分大小写DELname//删除EXISTSname//是否存在KEYS*//查找键FLUSHALL......
  • Java Redis多限流
    JavaRedis多限流在Java中实现Redis多限流通常涉及使用Redis的某些特性,如INCR、EXPIRE、Lua脚本或者更高级的Redis数据结构如RedisBitmaps、RedisStreams结合RedisPub/Sub,或者使用Redis的第三方库如RedisRateLimiter(基于Lua脚本或Redis自身功能实现)。然而,为了直接和易于实现......
  • 编译安装Kubernetes 1.29 高可用集群(9)--Harbor私有仓库部署
    1.环境说明操作系统:openEuler22.03软件版本:harbor2.10.32.Harbor软件安装2.1安装前准备#systemctldisablefirewalld.service#systemctlstopfirewalld.service#sed-i's/SELINUX=enforcing/SELINUX=disabled/'/etc/selinux/config#setenforce0#hostnamec......
  • Redis巡检检查 redis-check-aof
    一、AOF1、AOF 是什么以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,Redis启动之初会读取该文件重新构建数据,换言之,Redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。2、AOF默认......
  • .NET/C#、Netcore、数据库、Redis 、RabbitMQ&kafka、Docker ⾯试题汇总系列目录
    .NET/C#⾯试题汇总系列.NET/C#⾯试题汇总系列:ASP.NET常见面试题001.NET/C#⾯试题汇总系列:ASP.NET常见面试题002.NET/C#⾯试题汇总系列:ASP.NET常见面试题003.NET/C#⾯试题汇总系列:基础语法.NET/C#⾯试题汇总系列:ASP.NETMVC.NET/C#⾯试题汇总系列:多线程.NET/C#⾯......
  • 7.10日学习打卡----初学Redis(五)
    7.10日学习打卡目录:7.10日学习打卡一.redis功能流水线pipeline什么是流水线?pipeline实现使用pipeline发布与订阅Redis的发布与订阅发布订阅命令行实现慢查询Redis命令执行的整个过程如何进行配置实践建议二.redis的持久化机制RDB持久化机制触发机制-主要三种方式......