首页 > 数据库 >如何保证Redis的HA高可用

如何保证Redis的HA高可用

时间:2023-10-04 22:11:08浏览次数:54  
标签:可用 0.1 Redis Cluster Sentinel Gossip HA 节点

目录

本文主要介绍Redis如何保证高可用。

1.关于Redis

Redis(Remote Dictionary Server)是一个开源的,基于内存的数据结构存储系统,它可以用作数据库、缓存和消息中间件。

Redis支持多种类型的数据结构,如字符串(Strings)、哈希(Hashes)、列表(Lists)、集合(Sets)、有序集合(Sorted Sets)以及位图(Bitmaps)、HyperLogLogs和地理空间索引半径查询等。

Redis具有以下特性:

  1. 性能高效:由于所有数据都存储在内存中,因此Redis能提供高速的读写速率。
  2. 持久化:Redis可以将内存中的数据持久化到磁盘,用于防止数据丢失。
  3. 支持多种数据结构:Redis支持多种数据结构,可以满足不同的数据存储需求。
  4. 支持事务:Redis支持事务,可以保证一系列命令的原子性。
  5. 支持发布订阅模式:Redis支持发布订阅模式,可以用于实现消息队列。
  6. 支持Lua脚本:Redis支持Lua脚本,可以在服务器端执行复杂的操作。
  7. 支持主从复制:Redis支持主从复制,可以用于数据备份或提高读取性能。
  8. 支持高可用和分区:通过Redis Sentinel和Redis Cluster,Redis支持高可用和数据分区。

2.Redis 的使用场景

Redis可以用于多种场景,以下是一些常见的用途:

  1. 缓存系统:由于Redis的高性能和丰富的数据结构,它经常被用作缓存系统,可以有效地减少对后端数据库的访问,提高应用的响应速度。
  2. 消息队列:Redis的发布订阅功能可以用来实现消息队列,用于在不同的应用程序之间异步传递消息。
  3. 排行榜:Redis的有序集合(Sorted Sets)非常适合用来实现排行榜功能,可以快速地获取排名和分数,并实时更新。
  4. 会话缓存:Redis可以用来存储Web应用的会话信息,比如用户的登录状态、购物车信息等。
  5. 实时分析:Redis的快速读写和丰富的数据结构使得它非常适合用来进行实时分析,例如统计网站的访问量、用户行为等。
  6. 地理空间数据:Redis的地理空间索引可以用来存储地理位置信息,并进行位置的查询和距离计算。
  7. 计数器:Redis的INCR和DECR命令可以用来实现计数器功能,例如统计网站的点击量、下载量等。
  8. 分布式锁:Redis可以用来实现分布式锁,用于在分布式环境中对资源的互斥访问。

以上只是Redis的一部分用途,由于Redis的灵活性和高性能,它可以用于更多的场景。

Redis有丰富的应用场景,保证其高可用,是重中之重。
接下来介绍 Redis 高可用。

3.Redis的高可用

Redis的高可用主要是两种:哨兵模式(Sentinel) 和 集群模式(Cluster)。

3.1 哨兵模式(Sentinel)

Redis Sentinel是Redis官方推荐的高可用解决方案,它可以监控Redis主从服务器,进行故障转移,以及发送通知。

Redis主从复制,可以将一个Redis服务器的数据复制到一个或多个Redis服务器,在配置文件中,使用slaveof指令指定主节点的IP地址和端口。
slaveof <masterip> <masterport>

Redis Sentinel 配置过程如下:

首先需要在每个Sentinel节点上创建一个配置文件,例如sentinel.conf,并设置监控的Redis服务器,以及其他选项。

sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000

其中,mymaster是主服务器的名称,
127.0.0.1 6379是主服务器的地址和端口,
2是判断主服务器失效所需的Sentinel数量,5000是判断主服务器失效的超时时间,10000是故障转移的超时时间。

然后使用配置文件启动每个Sentinel节点。

redis-sentinel ./sentinel.conf

3.2 集群模式(Cluster)

Redis Cluster是Redis的分布式解决方案,它可以自动将数据分片,进行故障转移,以及重新分配分片。

  1. 数据分片:Redis Cluster将所有的数据分成16384个槽(slot),每个槽对应一部分键。每个Redis节点负责一部分槽,也就是一部分数据。当需要获取或设置一个键的值时,Redis Cluster会根据键的哈希值计算出对应的槽,然后找到负责这个槽的节点。这种方式可以将数据均匀地分布在所有的节点上,提高存储和处理的效率。
  2. 故障检测:Redis Cluster的每个节点都会定期与其他节点进行通信,检查其他节点的状态。这种通信是通过Gossip协议实现的,每个节点都会定期地向其他节点发送ping消息,如果在指定的时间内没有收到回应,那么这个节点会被标记为失效。
  3. 故障转移:当一个节点被标记为失效后,Redis Cluster会选择一个从节点来接管失效节点的数据。这个从节点会被提升为主节点,并接管失效节点的所有槽。在故障转移过程中,Redis Cluster可能会拒绝部分写操作,以保证数据的一致性。这个过程是自动进行的,不需要人工干预。
  4. 数据一致性:Redis Cluster使用异步复制,但是在进行故障转移时,会尽可能地保证数据的一致性。当一个主节点失效时,只有当至少一个从节点完成了数据同步,才会进行故障转移。这样可以保证在主节点失效后,至少有一个从节点拥有最新的数据。

上面提到Gossip协议,这里简单介绍下。

在Redis Cluster中,Gossip协议主要用于节点之间的信息交换,包括节点的发现、故障检测和配置信息的传播。

  1. 节点发现:新加入的节点通过Gossip协议可以快速地被集群中的其他节点发现,同时,已经存在的节点也可以通过Gossip协议发现新加入的节点。
  2. 故障检测:节点通过定期向其他节点发送ping消息,并等待pong回复来检测其他节点的状态。如果在一定时间内没有收到pong回复,那么该节点会被标记为失效。
  3. 配置信息传播:节点之间可以通过Gossip协议传播配置信息,例如节点的角色(主节点或从节点)、数据槽的分配情况等。
    Gossip协议是一种基于"流言"传播的信息交换协议,它可以在大规模分布式系统中实现高效的信息交换。在Redis Cluster中,Gossip协议是实现节点管理和故障转移的重要机制。

Redis Cluster 配置过程如下:

在每个Redis节点上创建一个配置文件,例如redis.conf,并设置cluster-enabled为yes,以及其他选项。

cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000

然后使用redis-cli工具创建Cluster。

redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1

以上是保证Redis高可用的基本方法,具体的配置和使用可以根据实际需求进行调整。在实际使用中,可能还需要考虑其他因素,例如网络分区、数据一致性等

4.参考

Redis文档

Redis的所有官方文档,包括快速入门指南、命令参考、主题指南等。你可以在这里找到关于Redis的所有信息,包括安装、配置、使用方法等。

标签:可用,0.1,Redis,Cluster,Sentinel,Gossip,HA,节点
From: https://www.cnblogs.com/lanyangsh/p/17742837.html

相关文章

  • 【中秋国庆不断更】OpenHarmony组件内状态变量使用:@State装饰器
    【中秋国庆不断更】OpenHarmony组件内状态变量使用:@State装饰器@State装饰的变量,或称为状态变量,一旦变量拥有了状态属性,就和自定义组件的渲染绑定起来。当状态改变时,UI会发生对应的渲染改变。在状态变量相关装饰器中,@State是最基础的,使变量拥有状态属性的装饰器,它也是大部分状态......
  • 【中秋国庆不断更】HarmonyOS对通知类消息的管理与发布通知(下)
    【中秋国庆不断更】HarmonyOS对通知类消息的管理与发布通知(下)一、发布进度条类型通知进度条通知也是常见的通知类型,主要应用于文件下载、事务处理进度显示。HarmonyOS提供了进度条模板,发布通知应用设置好进度条模板的属性值,如模板名、模板数据,通过通知子系统发送到通知栏显示。......
  • 【中秋国庆不断更】OpenHarmony组件内状态变量使用:@State装饰器
    【中秋国庆不断更】OpenHarmony组件内状态变量使用:@State装饰器@State装饰的变量,或称为状态变量,一旦变量拥有了状态属性,就和自定义组件的渲染绑定起来。当状态改变时,UI会发生对应的渲染改变。在状态变量相关装饰器中,@State是最基础的,使变量拥有状态属性的装饰器,它也是大部分状态......
  • Redis
    1、概述是一个由C语言开发的基于key-value形式的非关系型数据库key-value:键值对【键:String,值:五种数据类型】非关系数据库:NoSQL【NotOnlySQL】关系型数据库:由二维表的形式来存储数据不是关系型数据库,就是非关系型数据库存储介质默认是内存可以持久......
  • 稳定婚姻问题(Gale-Shapley算法)
    前言今天duck、香饽饽老板和彬彬一起出了个模拟赛,赛时T2想到了跟正解很接近的做法,但最后还是打挂了then喜提0pts,后面duck讲题的时候才知道是稳定婚姻板题。看完证明之后觉得很妙,遂开坑。只是简单整理,图一乐子吧算是。说是稳定婚姻问题,但其实我觉得更合适的叫法是属性稳定分......
  • HashMap
    ......
  • springboot+Uniapp+redis开发的AI医疗智能导诊系统源码
    AI+医疗的智能导诊系统源码 自主版权 支持二开一、什么是智能导诊系统?智能导诊系统是一种基于人工智能和大数据技术开发的医疗辅助软件,它能够通过对患者的症状、病史等信息进行计算分析,快速推荐科室和医生。通过简单的描述自身症状,系统即可找到最适合的科室,实现线上高效挂号,线下......
  • Sentinel系列之SlotChain、NodeSelectorSlot、ClusterBuilderSlot分析
    本文基于Sentinel1.8.6版本分析1.SlotChain我们从入口com.alibaba.csp.sentinel.SphU#entry(java.lang.String)开始分析。一路走读下来,会进入到这个方法com.alibaba.csp.sentinel.CtSph#lookProcessChain,查找该资源对应的SlotChain。接下来看如何构建这个SlotChain.Se......
  • 探索Redis的字符串设计思想
    探索Redis的字符串设计思想作者:沈自在1引言​ 在Redis中的字符串和我们平时Java中所写的字符串是不一样的,在Java的设计中String是由final修饰的,因此也就成就了他不可变的特性。此外,在C语言的字符标准形式中是以NULL结尾的,但是要通过strlen函数去获取长度的复杂度却是O(n)的,......
  • 点赞功能改进-Redis数据结构设计
        ......