分布式理论

CAP

CAP定理中的一些概念与通常理解并不一致, 围绕CAP有很多的困扰和误解

stateDiagram-v2  [*] --> Nginx  Nginx --> 节点A(主数据)  Nginx --> 节点B(副本数据)  Nginx --> 节点C(副本数据)

CAP针对的只是系统级别,落地到应用级别, 需要对不同的数据确定是要满足CP还是AP

202031017918

分布式系统中,分区容忍性必不可少,因为需要总是假设网络是不可靠的,所以CAP理论实际上是要在可用性和一致性之间做权衡,但分区容忍性又不是一直存在的,大部分时间网络是正常的,在正常的这段时间,是满足CA的

---title: 强一致性 破坏可用性---stateDiagram-v2  direction LR  Client --> MasterRedis: set k1 a  MasterRedis --> SlaveRedis1: 同步阻塞  MasterRedis --> SlaveRedis2: 同步阻塞

脑裂: 同时出现多台主节点

---title: 弱一致性 丢失数据---stateDiagram-v2  direction LR  Client --> MasterRedis: set k1 a  MasterRedis --> SlaveRedis1: 异步  MasterRedis --> SlaveRedis2: 异步

只有在网络出现问题时,才会有AP 和 CP 二选一的情况

BASE

CAP 理论是忽略延时的,而实际应用中延时是无法避免的,所以BASE是 AP 方案的一个补充

stateDiagram-v2  direction LR  Client --> MasterRedis: set k1 a  MasterRedis --> Kafka: 同步阻塞  Kafka --> SlaveRedis1  Kafka --> SlaveRedis2  Client1 --> SlaveRedis1: get k1  Client1 --> SlaveRedis2: get k1  note right of SlaveRedis1    有可能取不到一致的数据 但最终数据会变得一致  end note

BASE与幂等性与可用性

通过无状态得到设计来实现幂等性,幂等性可保证请求可重试、数据的健壮性,从而能实现最终一致性

BASE能达到数据的最终一致性,以最新写入的数据为准还是以第一次写入的数据为准,

还需要通过错误修正来进行,其中这种错误可以在读时、写时,或者通过治理、监控进行异步巡检修正,从而达到正确的一致性

在设计分布式写入时,可以自定义写一致性级别,支持 All、Quorum、One、Any 4 种写一致性级别,满足不同的一致性要求

Lease机制