首页 > 数据库 >细扣Redis Cluster原理

细扣Redis Cluster原理

时间:2024-02-14 09:55:39浏览次数:47  
标签:Redis Cluster 细扣 集群 一致性 数据 节点

细扣Redis Cluster原理

Redis Cluster 是 Redis 提供的一种分布式数据存储解决方案,它能够将大量数据分布到多个节点上,实现高可用性和水平扩展。以下是 Redis Cluster 的工作原理及其如何保证数据安全、一致性以及避免脏数据问题的详细解释:

工作原理

  1. 数据分片(Slot 分配)
    Redis Cluster 使用了哈希槽(Hash Slot)的概念,将整个键空间划分为 16384 个槽位。每个键通过 CRC16 算法计算得出一个槽位号,并将其分配给集群中的某个节点。这样,当客户端请求一个键时,可以通过同样的算法找到对应的节点进行操作。

  2. 主从复制与故障转移
    每个槽由一个主节点负责,主节点可以有零个或多个从节点。主节点负责处理对该槽的所有写入和读取操作,而从节点则实时复制主节点的数据以提供冗余和读负载均衡。当主节点发生故障时,集群会自动选举新的主节点(从节点提升为主),确保服务的连续性。

  3. Gossip 协议
    集群内部各节点之间使用 Gossip 协议来传播状态信息和配置更新。每个节点都有一个全局视图,用于追踪集群中其他节点的状态,如主从关系、槽归属等。通过定期心跳和消息交换,集群能够在不引入中心化组件的情况下保持配置的一致性。

  4. 客户端直连与重定向
    客户端直接连接到任意集群节点发起请求,如果目标键所在的槽不属于该节点,节点会返回 MOVED 或 ASK 错误提示,引导客户端重新连接到正确的节点执行命令。这种机制使得客户端可以在不知道集群完整拓扑的情况下透明地访问数据。

数据安全、一致性和避免脏数据问题

  1. 数据持久化
    Redis 支持 RDB 快照和 AOF 日志两种持久化方式。即使在集群环境下,单个节点上的数据也可以被持久化到磁盘,从而防止意外重启导致数据丢失。不过,在集群层面,需要考虑数据分布的情况,通常推荐对关键业务数据设置合理的副本数量以提高数据安全性。

  2. 强一致性
    Redis Cluster 不支持跨多个键事务操作,因此不保证强一致性(ACID 中的 C)。但在单个键的操作上,Redis 可以实现线性一致性,因为集群内部是通过主从复制来同步数据的。一旦主节点完成写操作并确认响应客户端,这个修改会逐渐传播到所有从节点。

  3. 避免脏数据

    • 故障转移时的数据完整性:Redis Cluster 在故障转移过程中,新当选的主节点会等待足够的从节点与自己达到同步状态后,才会正式成为主节点对外提供服务,这有助于减少数据不一致的风险。
    • 防脑裂保护:Redis Cluster 引入了 Epoch 和 Node Timeout 机制来尽量避免脑裂现象(split-brain),即在网络分区期间集群出现两个独立的“领导者”。在多数情况下,集群会选择关闭连接较少的那一部分,以维持数据的一致性。
  4. 集群配置一致性
    集群中的每个节点都维护了一份关于集群整体状态的配置信息,这些信息通过 Gossip 协议传播和更新,最终在集群内达成一致,以确保各个节点对于槽位分配和主从关系的理解是一致的。

综上所述,Redis Cluster 通过数据分片、主从复制、Gossip 协议、客户端重定向机制以及一系列内部保障措施,在一定程度上保证了数据的安全性、一致性和可靠性,同时尽可能减少由于网络问题、节点失效等情况产生的数据不一致和脏数据。然而,要完全实现分布式系统中的强一致性,可能还需要结合应用层的事务控制或其他手段。



欢迎关注公-众-号【TaonyDaily】、留言、评论,一起学习。

公众号

Don’t reinvent the wheel, library code is there to help.

文章来源:刘俊涛的博客


若有帮助到您,欢迎点赞、转发、支持,您的支持是对我坚持最好的肯定(_)

标签:Redis,Cluster,细扣,集群,一致性,数据,节点
From: https://www.cnblogs.com/lovebing/p/18015052

相关文章

  • Redis
    ubuntu安装redis:sudoapt-getupdatesudoapt-getinstallredis-serverredis-server即可启动从打印的信息可以看到端口信息netstat-tulnp也可查看程序的端口号redis-cli连上redissetname"alexli"setage22getnamegetagekeys*查看所有的keysets......
  • dotnet aspnet redis 缓存 分布式缓存
    分布式缓存\appsettings.Development.json{"Logging":{"LogLevel":{"Default":"Information","Microsoft.AspNetCore":"Warning"}}}分布式缓存\appsettings.json{"Logg......
  • springboot整合redis报错:链接失败;org.springframework.data.redis.RedisConnectionFai
    错误原因:开启了保护模式解决方案:关闭保护模式和防火墙具体步骤:1、打开你的redis配置文件,做出如下修改2.开启进程守护yes代表开启守护进程模式。在该模式下,redis会在后台运行,并将进程pid号写入至redis.conf选项pidfile设置的文件中,此时redis将一直运行,除非手动kill该进程。3.......
  • Mac电脑安装RedisCluster集群(非Docker模式)
    第1步,新建redis.confredis.conf内容如下:port7021cluster-enabledyes              //启用集群模式cluster-config-filenodes.conf     //集群的配置文件cluster-node-timeout5000appendonlyyesdaemonizeyesbind0.0.0.0   ......
  • Start a kubernetes cluster
    1.checkifserviceofcontainerruntime--containerd--isrunningonallcomputerswhowanttojointhekubernetescluster.$systemctlstatuscontainerd●containerd.service-containerdcontainerruntimeLoaded:loaded(/usr/local/lib/systemd/syst......
  • SpringBoot 报错无法连接到Redis (Unable to connect to Redis)
    UnabletoconnecttoRedisSpringBoot3.1.2报错:UnabletoconnecttoRedis背景在搭建项目开发环境的时候,进行Redis相关的单元测试时发现无法连接到远程的Redis服务器。并且报错UnabletoconnecttoRedisRedis所在服务器UbuntuService64位20.04.06问题排查:检查基......
  • redis基础知识梳理
    性能测试工具redis-benchmark-hhost-pport-cconnections-nrequests-hhost:指定Redis服务器的主机名或IP地址。-pport:指定Redis服务器的端口号。-cconnections:指定并发连接数,即同时向服务器发起的连接数量。-nrequests:指定总的请求数量,即测试期间每个连接向服务......
  • Redis基础命令集
    一、基础命令1、ping(心跳命令)若看到PONG响应,则说明客户端与Redis的连接时正常的。2、select(切换数据库)redis默认有16个数据库,默认使用的是0号DB。3、dbsize(查看key数量)查看当前数据库中key的数量。4、flushdb(删除当前库中所有数据)清楚当前DB中的所有数据,不影响其他DB......
  • redis做成服务
    #默认服务名D:\soft\Redis6380\redis-server.exe--service-installD:\soft\Redis6380\redis.windows.conf--loglevelverbose#指定服务名sccreateRedis6380binPath="D:\soft\Redis6380\redis-server.exe--service-runD:\soft\Redis6380\redis.windows.co......
  • RedissonRedLock写一个加锁方式,实现自动延时、程序停止就停止延时
    要使用Redisson的RedLock实现加锁,并实现自动延时以及在程序停止时停止延时,你可以按照以下示例代码进行操作:importorg.redisson.Redisson;importorg.redisson.api.RLock;importorg.redisson.api.RedissonClient;importorg.redisson.config.Config;importjava.util.con......