【谈一谈】Redis是AP还是CP?
再说这个话题之前,这里的是
AP
和CP
不是"A片"和"C骗"啊 !~哈哈哈,就离谱,博文后面我会解释下的我说下自己对
Redis
的感觉,我一直很好奇Redis
,不仅仅是当缓存用那么简单,包括的它的底层设计所以,思考再三,我决定先从
Redis
基础开始写(基础是王道!万丈高楼平地起,我米开始!嘿嘿)
一、总纲图:
二、什么是CAP?
要想谈一谈我们本文的主题
AP
和CP
,可能有的小伙伴会说: 这我也不是 怎么熟悉啊!那么我们先复习下大名鼎鼎的
CAP
理论
CAP
理论
看下面的这张图,我们会发现
CAP
对应的三个单词【建议自己画画图,印象深刻】
C
: 一致性(Consistency)–
- 每次读取都会收到最新的写入数据或者错误信息
- (
注
:这里面的一致性,指的是强一致性
,不是市面上所说的所有节点在相同时间看到是一样的数据)
A
:可用性(Availability)–
- 每个请求都会收到非错误地响应,但是这个响应的信息不保证是最新的 ,只保证可用
P
:分区容错性(Partition Tolerance)–
- 就是网络节点间丢弃或者延迟一定数量(就是任意数量)信息,也不影响大局,系统还是能够正常运行
好了,我们言归正传,回到我们的主题上面
三、为啥说Redis是AP?不是CP?
我们知道,
Redis
是一个开源的内存数据库,且是执行单线程处理但是网上,若是喜欢读博客的小伙伴,会发现很多人说这样一句话:
- 单机的
Redis
是CP
的,集群的REDIS
是AP
的
这句话真的对吗? 大家在看下文前,倾思考思考!~我当时读到第一反应就是疑惑,于是我就去查询大量资料
有的人说:
CAP
是针对分布式场景中,如果是单机REDIS
,就压根儿和什么分布式不着边,都没P
了!!还说哈AP
和CP
??- 在单机的
REDIS
中,应为只有一个实例,那么他的一致性是有保障的,如果这个节点挂了,就没有可用性可言了,所以他是CP
系统我在这里说下,以上两个观点都特么错的!!!以偏概全,混淆是非!~就是AP!!
~哈哈哈!你可能会说:我去,那你证明啊,这特么为啥是错的啊!,别急嘛!我们往下读,让你心服口服,嘿嘿
REDIS
是AP
的理由
第一点: 一致性
我们都知道,
REDIS
的设计目标是高性能,高扩展和高可用性 ,而且
REDIS
的一致性模型是最终一致性:(什么意思呢?)就是在某个时间点读取的数据可能不是最新的,但殊途同归,最终会达到一致的状态
为什么Redis
无法保持强一致性??
主要原因: 异步复制
-
因为
Redis
在分布式的设计中采用的是异步复制
,者导致在节点之间存在数据在同步和延迟不一致的情况存在 -
换句话说:
- 当某个节点的数据发生改变,
Redis
会将这个节点的修改操作发送给其他节点进行同步~(这是正常步骤,没毛病是不,我们继续往下看) - 但是(不怕一万,就怕万一来了,哈哈哈)因为网络传输的延迟,拥塞等原因,这些操作没有立即被被其他节点收到和执行,
- 从而产生节点之间数据不一致的情况!!!
- 当某个节点的数据发生改变,
-
抛开上面的影响点,
节点故障
对Redis
的一致性影响也是很大的举个例子:
当一个节点宕机时,这个节点的 数据就可能同步不到其他节点上,这就会导致数据在节点间不一致
你可能有疑惑?那
Redis
不是有哨兵和复制等机制吗?但是,问题就是但是,哈哈~这些机制是能提高系统的可用性和容错性,能完全解决吗?
~(你没看错,就是完全解决,能吗??)不能吧,自己主观推下也能想到那种万一场景吧!!!
你说既然异步不行,那么我就用同步机制就不好了!!不就是
CP
了???~no!no!NO !哈哈哈,年轻人,想的太简单了哈!~
我们看看官网是怎么说的()
-
Redis
客户端可以使用WAIT
命令请求特定数据进行同步复制 -
使用
WAIT
,只能说发生故障时丢失写操作的概率会大大降低,且是在难以触发的故障模式情况下 -
但是!!
-
WAIT
只能确保数据在Redis
实例中有指定数量的副本被确认不能将一组
REdis
转换为具有强一制性的CP
系统 -
什么意思?
在故障转移期间,由于
Redis
的持久化配置,当中已确认的写操作,仍然可能会丢失
针对有些读者的优秀的问题,我在这里进行专门解释下:
1.副本(Replicas)
在Redis
的上下文中,“副本”通常指的是“从节点”(Slave Nodes)。
Redis
支持主从复制(Master-Slave Replication)架构,这是一种数据冗余策略,用于提高系统的可靠性和可用性。- 在这种架构中,数据在一个主节点(Master Node)上进行写入操作,然后自动(异步或半同步方式)复制到一个或多个从节点上。
- 这些从节点保存的数据是主节点数据的一个副本,它们可以用来提供读服务,或者作为故障切换时提升为主节点的候选者。
- 所以,当提到“特定数据进行同步复制”时,意味着将主节点上的数据更新同步到其关联的从节点上,以保持数据的一致性。
2.一组Redis
当提到“一组Redis”时,这里通常指的是一个Redis
集群或者是一个包含多个Redis
实例(包括主节点和从节点)的部署环境。
- 在分布式系统中,为了提高处理能力和容错能力,不是单一地使用一个
Redis
服务器,而是部署多个Redis
实例协同工作,形成一个整体系统。 - 这组
Redis
实例可能包括了多个主节点和它们各自的从节点,通过复制和分片等机制来分散负载和提高数据的可靠性。
3. 转变为具有强一致性的CP
系统
提到“将一组Redis
实例转变为具有强一致性的CP
系统”,这是在讨论系统设计的理论模型。
首先我们看下如下的解释:
Redis本身设计倾向于高可用性和分区容错性(AP),
- 这意味着在某些故障场景下,它可能无法立即保证所有客户端都能看到最新的数据(即弱一致性)。
- 而“强一致性”要求所有节点上的数据在任何时候都是一样的,任何成功的写操作对于后续的读操作都是可见的。
所以:,我们再来看看wait
- 使用
WAIT
命令可以在某种程度上增强Redis
集群间的数据一致性, - 但要达到严格的强一致性,还需要额外的机制和配置,比如更严格的持久化策略和网络分区后的处理逻辑,
- 这也就是为什么说
WAIT
不能单方面将Redis
集群转变为严格意义上的CP
系统的原因。
完结!~
士不可以不弘毅,任重而道远,诸君共勉!~