分布式设计(二)协调与同步

分布式互斥

对排他性的资源访问方式,称为分布式互斥。而这种被互斥访问的排他性资源,就叫做临界资源
  • 如何访问
    • 霸道总载:集中式算法

      优点:直观、简单,信息交互量少、易于实现
      问题:协调者会成为系统性能瓶颈;单点故障
      增加主备备分,应用比较广泛
    • 民主协商:分布式算法

      先到先得、投票全票通过机制
      适合节点数量少且变动不频繁的系统,且由于每个程序均需通信交互,适合P2P系统
      应用场景:Hadoop
    • 轮值CEO:令牌环算法

      更加公平的算法
      非常适合通信模式为令牌环方式的分布式系统
      场景:移动自组织网络,无人机通信

分布式选举

集群多节点组成,多个节点到底怎么协同,怎么管理。
主节点:在一个集群中负责对其他节点的协调和管理,可以保证其他节点有序运行,数据一致性。

  • 选举算法
    • 长者为大:Bully算法
    • 民主投票:Raft 算法
    • 优先级的民主投票:ZAB算法

      多数派选主算法通常采用奇数节点:ZooKeeper 、etcd、Kubernetes

分布式共识

分布式共享地就是在多个节点均可独自操作或记录的情况下,使用得所有节点针对某个状态达成一致的过程
分布式共识的本质就是“存异求同”
从本质上看,分布式选举问题,其实就是传统的分布式共识方法,主要基于多数投票策略实现的。
分布式在线记帐,是指在没有集中的发行方,也就是没有银行参与的情况下,如何保证交易的一致性。

  • PoW (Proof of Work) 工作量证明
  • PoS (Proof of Stake) 权益证明
  • DPos (Delegated Proof of Stake) 委托权益证明

一致性是指,分布式系统中的多个节点之间,给定一系列的操作,在约定协议的保障下,对外界呈现的数据或状态是一致的。
共识是指,分布式系统中多个节点之间,彼此对某个状态成达一致结果的过程

分布式事务

分布式事务,就是在分布式系统中运行的事务,由多个本地事务组合而成

  • ACID
    • 原子性 (Atomicity)
      要么成要么败
    • 一致性 (Consistency)
      事务操作前和操作后,数据完整性保持一致
    • 隔离性 (Isolation)
      多个事务不会相互干扰
    • 持久性 (Durability)
      永久保存
  • 如何实现分布式事务
    • 二阶段锁
      同步阻塞问题
      单点故障问题
      数据不致问题
    • 三阶段锁
      锁定资源,降低性能
    • 消息队列
  • BASE 理论
    • 基本可用 Base Available
      分布式系统出现故障时,允许损失一部分功能的可用性
    • 柔性状态 Soft State
      允许系统存在中间状态,但不会影响系统整体可用性。比如,数据库读写分离,写库同步到读库会有一个延时,其实就是一种柔性状态
    • 最终一致性 Eventual Consistency
      事务在操作过程中可能会由于同步延迟等问题导致不一致,但最终状态下,数据都是一致的。

基于XA协议的2PC和3PC采用强一致性,基于消息的最终一致性方法,遵从BASE理论

分布式锁

锁是实现多线程同时访问同一共享资源,保证同一时刻只有一个线程可访问共享资源所做的一种标记

  • 实现方式
    • 基于数据库实现分布式锁
      创建一张锁表,为申请者在锁表里建立一条记录,记录建立成功则获得锁,消除记录则释放锁
    • 基于缓存实现分布式锁

      Redis 通过队列来维持进程访问共享资源的先后顺序
      • 性能更好,数据存放于内存
      • 很多缓存可跨集群部署
      • 很多缓存都提供可以用来实现分布锁的方法
      • 可以直接设置超时来控制锁的释放
    • 基于ZooKeeper 实现分布式锁
      可以完美解决设计分布式锁时遇到的各种问题。

ZooKeeper分布式锁的可靠性最高,有封装好的框架,很容易实现分布式锁的功能,几乎解决数据库锁和缓存锁的不足,是首选方法。

为了确保分布式锁的可用性,在设计时应考虑:

  • 互斥性
  • 具备锁失效机制
  • 可重入性
  • 有高可用的获取锁和释放锁的功能

如何解决分布式锁的羊群效应问题
??

猜你喜欢

转载自www.cnblogs.com/yeni/p/11757767.html
今日推荐