• 分布式集群理论


    CAP 理论

    CAP 也就是 Consistency(一致性)、Availability(可用性)、Partition Tolerance(分区容错性) 这三个单词首字母组合,对于一个分布式系统来说,当设计读写操作时,只能满足 CP 或者 AP

    • 一致性(Consistency) : 所有节点访问同一份最新的数据副本
    • 可用性(Availability): 非故障的节点在合理的时间内返回合理的响应(不是错误或者超时的响应)
    • 分区容错性(Partition tolerance) : 分布式系统出现网络分区的时候,仍然能够对外提供服务

    分布式系统理论上不可能选择 CA 架构,只能选择 CP 或者 AP 架构。 为啥呢? 举个例子:若系统出现“分区”,系统中的某个节点在进行写操作。为了保证 C, 必须要禁止其他节点的读写操作,这就和 A 发生冲突了。如果为了保证 A,其他节点的读写操作正常的话,那就和 C 发生冲突了

    选择 CP 还是 AP 的关键在于当前的业务场景,没有定论,比如对于需要确保强一致性的场景如银行一般会选择保证 CP

    另外,需要补充说明的一点是: 如果网络分区正常的话(系统在绝大部分时候所处的状态),也就说不需要保证 P 的时候,C 和 A 能够同时保证

    ZK 就是著名的 CP 架构,它的 ZAB 协议可以保证系统强一致性

    ZAB 协议

    当 ZK 集群中存在 Leader 时,自动进入消息广播模式,流程如下:

    客户端发起一个写操作请求,从机收到请求后会将该请求发给主机

    Leader 服务器将求转化为事务提案,同时为每个提案分配一个全局的 ID,Leader 服务器为每个 Followe 服务器分配一个单独的队列,然后将需要广播的提案依次放到队列中,并且根据 FIFO 策略进行消息发送

    Follower 接收到提案后,会首先将其以事务日志的方式写入本地磁盘中,写入成功后 Leader 反馈一个响应消息

    Leader 接收到超过半数以上 Follower 的成功响应消息后,即认为消息发送成功,发送提交消息,自身也会完成事务提交

    Leader 服务器与每一个 Follower 服务器之间都维护了一个单独的 FIFO 消息队列进行收发消息,使用队列消息可以保证数据传输的顺序性。请求处理的顺序不同就会导致数据的不同,从而产生数据不一致问题

    BASE 理论

    BASE 是 Basically Available(基本可用) 、Soft-state(软状态) 和 Eventually Consistent(最终一致性) 三个短语的缩写

    BASE 理论的核心思想是即使无法做到强一致性,但每个应用都可以根据自身业务特点,采用适当的方式来使系统达到最终一致性,这样就可以保持系统整体“主要可用”

    • 基本可用:系统出现故障时,处理用户请求的时间可能变长,或者系统的部分非核心功能无法使用
    • 软状态:软状态指允许系统中的数据存在中间状态,允许一段时间内集群中数据不一致的情况发生
    • 最终一致性:强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态

    高可用架构-RedisCluster

    redis 使用集群分摊压力、实现扩容,获得更多的内存空间,并且保证了一定的高可用性

    采用无中心化集群(每个redis都有从机,与其他redis可以相互通信,每个redis都可以被访问),而数据的分配一般使用数据分片来实现(并非哈希一致性算法实现,虽然这两者几乎差不多)

    所谓数据分片,就是一个有16384个slot(槽),数据库中的每个键都能通过算法(使用公式 CRC16(key) % 16384来计算)算出需要操作的数据属于这16384个哈希槽的哪一个

    而集群中的每个节点负责处理一部分哈希槽,这些节点又叫redis分片,比如:

    • 节点 A 负责处理 0 号至 8000 号哈希槽
    • 节点 B 负责处理 8001 号至 16384 号哈希槽

    而如果想要添加或者删除节点的话,将其他节点的槽放入或者增加就行了,槽中的数据也会一并转移

    Redis分片之间通过Gossip协议进行通讯,Gossip协议简单点说是一种弱最终一致性算法,主要用于解决大规模去中心化 P2P 网络中的数据一致性问题

    该协议发送数据只干两件事:

    1,随机选择 N 个尚未发送过消息的邻接节点发送消息
    2,收到信息的节点等待一段时间,再重复上述步骤

  • 相关阅读:
    VB开发OCX控件的属性之自定义列表项
    事件解析树Drain3使用方法和解释
    Java 网络编程 —— RMI 框架
    Codeforces 1255B. Fridge Lockers
    手写数字识别——算法
    【python项目推荐】键盘监控--统计打字频率
    生成树STP中的概念
    Java基础之数组、堆栈、变量、重载、权限修饰符、JavaBean、string、stringbuilder、ArrayList、泛型、单例设计模式
    Qt 实战(9)窗体 | 9.2、QDialog
    正则表达式概念
  • 原文地址:https://blog.csdn.net/sekever/article/details/126282826