分布式互斥
对排他性的资源访问方式,称为分布式互斥。而这种被互斥访问的排他性资源,就叫做临界资源
- 如何访问
- 霸道总载:集中式算法
优点:直观、简单,信息交互量少、易于实现
问题:协调者会成为系统性能瓶颈;单点故障
增加主备备分,应用比较广泛 - 民主协商:分布式算法
先到先得、投票全票通过机制
适合节点数量少且变动不频繁的系统,且由于每个程序均需通信交互,适合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分布式锁的可靠性最高,有封装好的框架,很容易实现分布式锁的功能,几乎解决数据库锁和缓存锁的不足,是首选方法。
为了确保分布式锁的可用性,在设计时应考虑:
- 互斥性
- 具备锁失效机制
- 可重入性
- 有高可用的获取锁和释放锁的功能
如何解决分布式锁的羊群效应问题
??