目录
一、分布式
概念
场景
二、分布式理论
CAP原则
BASE理论
三、分布式事务
分布式锁
为了共享资源的能被安全访问,可以使用互斥操作方式来进行保护 - 锁。
分布式锁具有普通锁的特性,另外增加了高效能、锁失效机制
- 互斥性
- 可重入性
- 非阻塞
- 高效能
- 锁失效机制
解决方案
刚性事务(强一致性 满足CP)
满足XA协议:参与者发送消息给协调者,根据协调者返回的结果,参与者决定是提交事务还是回滚事务
2PC
步骤
- 第一阶段:提交事务请求(发送操作通知)
- 第一阶段:执行事务提交(接收到反馈后提交事务)
原理
以数据库为例,因为很多数据库是这种方案- 准备阶段:
- 提交阶段:
可能出现的问题- 单点故障:
- 同步阻塞:
- 数据不一致:
3PC
是对2PC的加强,解决单点故障、同步阻塞问题
原理
canCommit:
perCommit:
doCommit:
可能出现的问题
柔性事务(满足AP)
补偿性的,例如TCC、本地消息表、最大努力通知、引入消息队列(异步确保)
四、分布式ID
五、分布式锁解决方式
基于关系型数据库Mysql
一般使用排他锁方式 或者 唯一索引实现。
- 步骤
唯一索引创建表,表中存放字段:主键、方法名、锁名、重入次数
行级锁(for update)
基于缓存Redis
SetNX命令+LUR脚本
setnx key val 命令:当key不存在的时候,插入数据,否则不插入数据
- 步骤
SetNx key val、Expire key 10 命令,在操作资源前加锁,操作资源结束后释放锁。
设置过期事件后,有看门狗机制监控
不存在,就设置成功,否则,设置失败 上锁:成功执行 setnx key value 解锁: delete key
避免死锁:需要设置过期时间 expore key timeout
4.0之后,直接使用线程指令,他在设置数据的时候,同事设置时间 避免无锁:释放锁时候,检查锁是否是自己的
基于注册中心Zookeeper
Zookeeper是一个目录型树结构,规定每个目录下只能有一个唯一的文件名。
步骤
在Zookeeper下创建一个目录,线程A为获取锁,会在该目录下创建一个临时顺序节点,
会比较该目录下的所有节点,是否有比自己小的节点,没有的话,就获取到锁了,
有的话,就设置监控那些比自己小的节点,根据变更时间查看自己是不是最小节点
获取到锁的线程,会在处理完后 断开与该节点的连接(客户端断开连接后,节点自动删除)
好处
高可用缺点
实现难
7、es
写请求是写入 primary shard,然后同步给所有的 replica shard;读请求可以从 primary shard 或 replica shard 读取,采用的是随机轮询算法。
(1)写数据
客户端选择一个节点发送请求,这个节点就叫协调节点,协调节点对document进行路由,转发给对应的节点,对应节点向主节点请求,并拷贝的备份节点,当全部复制完成后,响应给客户端
(2)读数据