Codis与RedisCluster的原理详解

redis哨兵&codis 文章概述1. 什么是哨兵模式2. redis哨兵集群(功能、作用) 简要回答3. redis重点阐述容灾机制(为什么需要哨兵)4. redis哨兵-原理5. redis-sentinel集群6. redis主流集群方案7.codis 1. 什么是哨兵模式 哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis... 阅读详情

背景介绍#

我们先来看一下为什么要做集群,如果我们要部署一个单节点Redis,很明显会遇到单点故障的问题。

首先能想到解决单点故障的方法,就是做主从,但是当有海量存储需求时,单一的主从结构就会出问题,说问题之前要先了解一下主从之间是如何复制的。

我们把Redis分为三个部分,分别是客户端、主节点以及从节点,如果从节点要同步主节点的数据,它首先会发Sync指令给主节点,主节点收到指令之后会执行BGSAVE命令生成RDB文件,这个RDB文件指的是快照文件,它是Redis两种备份方式的其中一种,另一种叫AOF,它的原理是将所有的写入指令存入文件,mysql的binlog原理是一样的。

如果主节点在生成RDB的过程当中,客户端发来了写入指令,这个时候主节点会把指令全部写入缓冲区,等RDB生成完了,会把RDB文件发送给从节点,最后再把缓冲区的指令发送给从节点。这样就完成了整个的复制。

我们刚才说单纯地做主从是有缺陷的,这个缺陷就是如果我们要存储海量的数据,那么BGSAVE指令生成的RDB文件会非常巨大,这个文件传送给从节点也会非常慢,如果缓冲区命令很多的话,从节点同步数据时也会执行很久,所以,要解决单点问题和海量存储问题,还是要考虑做集群。

Redis常见集群方案#

Redis集群方案目前主流的有三种,分别是Twemproxy、Codis和Redis Cluster。

Twemproxy,是推特开源的,它最大的缺点就是无法平滑的扩缩容,而Codis解决了Twemproxy扩缩容的问题,而且兼容了Twemproxy,它是由豌豆荚开源的,和Twemproxy都是代理模式。其实Codis能发展起来的一个主要原因是它是在Redis官方集群方案漏洞百出的时候率先成熟稳定的。以现在的Redis官方集群方案,这两个好像没有太大差别了,不过我也没有去做性能测试,不清楚哪个最好。

Redis Cluster是由官方出品的,用去中心化的方式实现,不属于代理模式,今天主要讲codis,redis cluster后面也会过一下。下面,来看一下Codis的实现原理。

Codis原理#

我们换一种方式去讲,就按照Codis的架构演进一下,这样理解会比较清晰一点,假如现在只有一个Redis Server,怎么让它变得高可用?

开篇的时候也有讲,首先,能想到的就是做主从,这样就算主宕机了,从节点也能马上接替主节点的位置。

我们现在已经做成主从结构了,那到底是谁来负责主从之间的切换?

就是它,Sentinel,中文名叫哨兵,它呢,在Redis里面主要负责监控主从节点,如果主节点挂了,就会把从拉起来。但是哨兵本身也存在单点问题,所以它也需要做集群。

那么问题来了,哨兵是如何做主从切换呢?来看下哨兵的运行机制。

假如有三个哨兵和一主两从的节点,下面是一主多从,哨兵之间会互相监测运行状态,并且会交换一下节点监测的状态,同时哨兵也会监测主从节点的状态。

如果检测到某一个节点没有正常回复,并且距离上次正常回复的时间超过了某个阈值,那么就认为该节点为主观下线。

这个时候其他哨兵也会来监测该节点是不是真的主观下线,如果有足够多数量的哨兵都认为它确实主观下线了,那么它就会被标记为客观下线,这个时候哨兵会找下线节点的从节点,然后与其他哨兵协商出一个从节点做主节点,并将剩余的从节点指向新的主节点。

关于主从节点的切换有两个环节,第一个是哨兵要选举出领头人来负责下线机器的故障转移,第二是从Slave中选出主节点,领头人的选举规则是谁发现客观下线谁就可以马上要求其他哨兵认自己做老大,其他哨兵会无条件接受第一个发过来的人,并告知老大,如果超过一半人都同意了,那他老大的位置就坐实了。

关于从节点选举,一共有四个因素影响选举的结果,分别是断开连接时长、优先级排序、复制数量、进程id,如果连接断开的比较久,超过了某个阈值,就直接失去了选举权,如果拥有选举权,那就看谁的优先级高,这个在配置文件里可以设置,数值越小优先级越高,如果优先级相同,就看谁从master中复制的数据最多,选最多的那个,如果复制数量也相同,就选择进程id最小的那个。

现在继续回过来,刚才讲痛点的时候说了,如果有存储海量数据的需求,同步会非常缓慢,所以我们应该把一个主从结构变成多个,把存储的key分摊到各个主从结构中来分担压力。

就像这样,代理通过一种算法把要操作的key经过计算后分配到各个组中,这个过程叫做分片,我们来看一下分片的实现原理。

分片算法#

在Codis里面,它把所有的key分为1024个槽,每一个槽位都对应了一个分组,具体槽位的分配,可以进行自定义,现在如果有一个key进来,首先要根据CRC32算法,针对key算出32位的哈希值,然后除以1024取余,然后就能算出这个KEY属于哪个槽,然后根据槽与分组的映射关系,就能去对应的分组当中处理数据了。

CRC全称是循环冗余校验,主要在数据存储和通信领域保证数据正确性的校验手段,我去看了这个算法的原理,还没理解透彻,这里就先不讲了,省得误导大家。

我们继续回过来,刚才所讲的槽位和分组的映射关系就保存在codis proxy当中,但是codis proxy它本身也存在单点问题,所以需要对proxy做一个集群。

部署好集群之后,有一个问题,就是槽位的映射关系是保存在proxy里面的,不同proxy之间怎么同步映射关系?

在Codis中使用的是Zookeeper来保存映射关系,由proxy上来同步配置信息,其实它支持的不止zookeeper,还有etcd和本地文件。在zookeeper中保存的数据格式就是这个样子。除了这个还会存储一些其他的信息,比如分组信息、代理信息等,感兴趣可以自己去了解一下。

现在还有一个问题,就是codis proxy如果出现异常怎么处理,这个可能要利用一下k8s中pod的特性,在k8s里面可以设置pod冗余的数量,k8s会严格保证启动的数量与设置一致,所以只需要一个进程监测Proxy的异常,并且把它干掉就可以了,k8s会自动拉起来一个新的proxy。

codis给这个进程起名叫codis-ha,codis-ha实时监测proxy的运行状态,如果有异常就会干掉,它包含了哨兵的功能,所以豌豆荚直接把哨兵去掉了。

但是codis-ha在Codis整个架构中是没有办法直接操作代理和服务,因为所有的代理和服务的操作都要经过dashboard处理。所以部署的时候会利用k8s的亲和性将codis-ha与dashboard部署在同一个节点上。

除了这些,codis自己开发了集群管理界面,集群管理可以通过界面化的方式更方便的管理集群,这个模块叫codis-fe,我们可以看一下这个界面。

最后就是redis客户端了,这个没什么好讲的,客户端是直接通过代理来访问后端服务的。

Redis Cluster原理#

下面来看一下redis cluster的原理,它和codis不太一样,Codis它是通过代理分片的,但是Redis Cluster是去中心化的没有代理,所以只能通过客户端分片,它分片的槽数跟Codis不太一样,Codis是1024个,而Redis cluster有16384个,槽跟节点的映射关系保存在每个节点上,每个节点每秒钟会ping十次其他几个最久没通信的节点,其他节点也是一样的原理互相PING ,PING的时候一个是判断其他节点有没有问题,另一个是顺便交换一下当前集群的节点信息、包括槽与节点映射的关系等。客户端操作key的时候先通过分片算法算出所属的槽,然后随机找一个服务端请求。

但是可能这个槽并不归随机找的这个节点管,节点如果发现不归自己管,就会返回一个MOVED ERROR通知,引导客户端去正确的节点访问,这个时候客户端就会去正确的节点操作数据。

这是RedisCluster大概的原理,下面看一下Codis跟RedisCluster简要的区别。

cJSON库用完后内存泄漏?手把手教你正确使用cJSON_Delete和free释放资源 本文深入解析cJSON库的内存管理机制,重点解决使用后的内存泄漏问题。通过详细讲解cJSON_Delete和free的正确使用方法,帮助开发者在处理JSON数据时有效释放资源,避免内存泄漏。特别适用于嵌入式系统和资源受限环境,提升开发效率和系统稳定性。 阅读详情

相关推荐

大模型LLM部署方式

建议根据实际需求选择方案,企业级服务优先考虑vLLM或TGI,个人用户可尝试Ollama或Hugging Face本地加载。若需完整代码示例,可参考网页2的VLLM实战或网页5的TGI部署案例。:高并发、低延迟的API服务,需分布式推理支持。:快速创建可分享的Web应用。:个人开发、快速原型验证。

u010249118的博客 516

Redis集群(Cluster和Codis)

reids集群:Cluster和Codis

zz18532164242的博客 939

手把手教你为STM32设备生成自定义MAC地址(基于芯片ID的5种算法对比)

本文详细介绍了基于STM32芯片ID生成自定义MAC地址的5种算法,包括直接截取、异或折叠、CRC32哈希、自定义混合运算及SHA-256摘要。通过对比分析各算法的计算复杂度、唯一性及适用场景,帮助嵌入式开发者根据项目规模与资源,选择最合适的方案,确保设备MAC地址的唯一性与合规性。

weixin_29170327的博客 527

codis的主从同步及RDB备份

文章目录redis的主从同步过程redis主从同步失败的原因客户端超时时间codis dashboard页面几个键的功能 redis的主从同步过程 主从同步是全量的还是增量的? slave在刚初始化时全量,后续都是增量 slave多久从主一次? master上每执行一次写命令,都会向slave发送一次 全量同步过程 1)从机向主机发起一个同步指令sync 2)主机redis收...

我的博客 1284

磁感应强度B、磁场强度H、矢量磁位A的study

学完电磁场很久了但是对电磁场中磁感应强度B⃗\vec{B}B、磁场强度HHH、矢量磁位A⃗\vec{A}A,这几个变量所表征的含义一直很模糊,所以就总结了一下

sinat_42386289的博客 1万+

MATLAB和S7-1200PLC水箱液位高度PID控制联合仿真(KEPserverOPC通信应用)

SMART PLC 向导PID的详细介绍请查看下面文章链接:S7-200 SMART PLC PID向导详细介绍(如何实现P、PD、PID控制器)-优快云博客文章浏览阅读1k次。这篇博客主要介绍SMART PLC PID向导的使用,PID控制相关的其它内容请查看专栏系列文章,常用链接如下:SMART PLC PID负压控制(过程量为负数)_负压控制pid控制程序_RXXW_Dor的博客-优快云博客1、如何实现PID反作用调节?S7-1200PLC和KEPserver OPC通信-优快云博客。

RXXW_Dor的博客 1781

redis之codis和redis cluster对比

codis和都是Redis的集群方案,本文就一起来看下。

wang0907的博客 2717

ubuntu22.04下对使用linuxdeployqt发布的qt程序进行deb打包操作

【代码】ubuntu22.04下对使用linuxdeployqt发布的qt程序进行deb打包操作。

十三阿哥的博客 1402

Redis集群详解

在了解Redis集群之前尽量先了解清楚Redis的主从复制和哨兵机制。读写分离,性能扩展,降低主服务器的压力容灾,快速恢复,主机挂掉时,从机变为主机Redis 主从模式不具备自动容错和恢复功能,如果主节点宕机,Redis 集群将无法工作,此时需要人为干预,将从节点提升为主节点。哨兵机制作用主要是监控主从节点,当主节点挂掉,通过内部投票机制,从 从节点当中选出一个主节点,这样可以避免人工成本。虽然主从+哨兵采用了多节点,但是他们存在的目的主要是解决容灾问题,而并非性能问题。

怪咖@的博客 2万+

搭建自己的MQTT服务器,实现设备上云(Ubuntu+EMQX)

这篇文章教大家在ECS云服务器上部署EMQX,搭建自己私有的MQTT服务器,配置EMQX实现设备上云,设备数据转发,存储;服务器我采用的华为云的ECS服务器,系统选择Ubuntu系统。

2万+

无限泛化!AI背景文字识别,腾讯文字六宫格

本文介绍了生成大规模文字验证码数据集的方法,通过使用上百种字体和2万+字库,结合随机背景和数十种图像增强技术,生成了2000万+的多样化样本。该方法采用二阶段训练策略,确保模型对字体、形态、形变等具有强泛化能力,可适配腾讯、咸鱼等多种平台的文字验证码识别,包括生僻字和复杂形变情况。生成的模型在多种验证码场景下表现优异,但强调该方法仅用于技术研究,严禁非法用途。

码王吴彦祖的博客 562

Redis核心技术与实战【学习笔记】 - 24.Redis 数据分片方案选择:Codis 和 Redis Cluster

Redis 的切片集群使用多个实例保存数据,能很好的应对大数据量的场景。在《》中,介绍了 Redis 官方提供的切片集群方法 Redis Cluster。本章,再来学习下,在方案正式发布前,业界广泛使用的Codis。

chenjian723122704的专栏 1593

PyTorch 最新安装教程(2021-07-27)

PyTorch 最新安装教程(2021-07-27)前言1. 安装 Anaconda2. 检查显卡,更新驱动3. 创建PyTorch环境4. 配置清华TUNA镜像源5. 安装 PyTorch6. 测试 前言 万事开头难! 这句话又一次被我验证。 记得前不久刚陷入Tensorflow2.0的安装困境,这一次又被PyTorch 搞哭辽。 孩子太难了o(╥﹏╥)o,不过还好最终成功安装,感谢全网资源,感谢大佬们的博客!被我一次一次试了出来。 1. 安装 Anaconda Anaconda 是一个用于科学计算的 P

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 23万+

对redis cluster的实现原理的理解,以及与codis,corvus的对比

Redis Cluster是一个分布式系统。由多个Redis实例组成的整体,数据按照Slot存储分布在多个Redis实例上,通过Gossip协议来进行节点之间通信。 整理理解 redis cluster整体上还是一个哈希分布的方案,与twemproxy,codis没有本质区别, 不同的地方在于,客户请求不在通过代理节点转发,而是直接与对应槽位的节点处理 通过gossip来使得集群中的节点互...

weixin_34348111的博客 304

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Redis(十一)集群:Sentinel、Codis、Cluster

文章目录一、Sentinel1、消息丢失2、Sentinel 基本使用 一、Sentinel     目前我们讲的 Redis 还只是主从方案、最终一致性,如果主节点凌晨 3 点突发宕机怎么办?坐等运维从床上爬起来,然后手工进行从主切换,再通知所有的程序把地址统统改一遍重新上线?毫无疑问,这样的人工运维效率太低,事故发生时估计得至少 1 个小时才能缓过来。如果是一个大型公司,这样的事故足以上新闻了。     所以我们必须有一个高

weixin_41750142的博客 1055

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Redis-切片集群

切片集群,也叫分片集群,就是指启动多个 Redis 实例组成一个集群,然后按照一定的规则,把收到的数据划分成多份,每一份用一个实例来保存。本篇主要讲述了,切片集群在保存大量数据方面的优势,以及基于哈希槽的数据分布机制和客户端定位键值对的方法。在应对数据量大的数据,数据扩容时,虽然增加内存这种纵向扩展的方式简单直接,但是会造成内存过大,导致性能变慢。同事也受到硬件和成本的限制。

Recently祝祝的博客 2034

redis 集群模式原理

主从切换的过程中会丢失数据,因为只有一个master,只能单点写,没有解决水平扩容的问题。而且每个节点都保存了所有数据,一个是内存的占用率较高,另外就是如果进行数据恢复时,非常慢。而且数据量过大对数据IO操作的性能也会有影响。所以我们同样也有对Redis数据分片的需求,所谓分片就是把一份大数据拆分成多份小数据,在3.0之前,我们只能通过构建多个redis主从节点集群,把不同业务数据拆分到不冉的集群中,这种方式在业务层需要有大量的代码来完成数据分片、路由等工作,导致维护成本高、增加、移除节点比较繁琐。Redi

weixin_40980639的博客 3388

深入剖析Redis - Redis集群模式搭建与原理详解

1. Redis集群方案 Redis Cluster 集群模式通常具有高可用、可扩展性、分布式、容错等特性。Redis 分布式方案一般有两种: 1.1 客户端分区方案 客户端就已经决定数据会被存储到哪个 redis 节点或者从哪个 redis 节点读取数据。其主要思想是采用哈希算法将 Redi...

weixin_34008933的博客 598

【Redis】分布式Redis与高可用性——主从同步、哨兵模式、集群模式

35-CodisVSRedisCluster:我该选择哪一个集群方案? Redis(9)——史上最强【集群】入门实践教程 目录一、主从同步CAP原理同步策略:指令同步、快照同步二、Sentinel哨兵模式自动故障转移配置提供三、集群部署:Codis、ClusterCodisRedis ClusterCodis与Redis Cluster的对比 一、主从同步 即使一些企业没有使用Redis集群,但至少都做了主从。当Master节点挂掉的时候,让Slave节点过来接管,服务就可以继续。否则主节点需要经过数据.

sun_tantan的博客 1055

阿里面试官:Redis分片集群都不懂?还来面试?

哭了,差点就被吊打

3y 1381

Redis(十四):Redis集群方案

Redis集群是Redis 3.0版本中新加入的分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移功能。 1. 集群节点 2. 槽指派 3. 集群中执行命令 4. 重新分片 5. ASK错误 6. 复制和故障转移 7. 集群消息 8. 槽数量16384 1. 集群节点 1.1 启动节点 一个节点就是一个运行在集群下的Redis服务器,Redis服务器在启动时会根据cluster-enabled配置选项是否为yes来决定是否开启服务器的集群模式。运行在集群...

蓬莱道人的博客 1235

聊聊Redis的各种集群方案、及优缺点对比

redis高并发集群解决方案

david屌丝的人生 416
上一篇: 走进JavaWeb技术世界17:web安全攻防详解
下一篇: Nginx多种负载均衡策略搭建
wrr-cat
博客等级 码龄9年 128粉丝 302原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值