美文网首页
分布式锁

分布式锁

作者: BenjaminCool | 来源:发表于2019-12-21 12:25 被阅读0次

为什么要用分布式锁?

分布式锁是悲观锁的实现;

如果采用乐观锁的方案就用不着分布式锁了。

能用乐观锁的地方尽量用乐观锁, 添加version字段,每次更新version++;

CAP理论: 分布式系统中的不可能三角

1、一致性

2、 可用性

3、 分区容错性

1、 锁的要素: 一致性; 为了一致性可以牺牲掉完全的高可用性

Zookeeper集群: 保证了一致性和分区容错性; 牺牲了完全的高可用

单点Redis: 保证了一致性;不存在网络分布问题;但是牺牲了高可用性

单点MySQL: 保证了一致性;不存在网络分布问题;但是牺牲了高可用性

单点MySQL优缺点:

1、 借助事务行锁实现;
在事务执行期间可以一直锁住,其他连接等待行锁释放;
嵌套事务,在获取锁的事务中嵌套一个执行业务的事务;
缺点是: 占用了一个连接; 牺牲了高可用性;
优点是: 强一致性保证; 客户端挂了会释放锁,事务回滚。

2、 插入一行记录:
缺点:加锁的客户端挂了, 不能及时释放锁;解决方案: 定时任务检测, 移除超时的锁;
问题聚焦于超时时间的选定, 如果超时时间短了, 则同样会导致客户端未挂,但是锁被释放了; 如果超时时间长了, 则客户端挂了, 其他连接等待时间较长;问题又回归到了Zookeeper和Redis实现的分布式锁一样的问题上了;只不过Zookeeper确定是session超时, 而Redis确定锁过期的时间的问题;

优点: 因为客户端改动的就是数据库, 如果客户端挂了, 则改动必将是失败的, 也不会导致数据不一致的问题。

3、 MySQL的优势

简化了参与方:
加锁服务-MySQL,如果加锁服务挂了, 则服务开启的事务也将回滚; 保证了数据一致性;

其他中间件:
加锁服务- 中间件 - MySQL
引入了中间件角色就引入了复杂度;客户端到底是因为挂了导致session会话超时, 还是因为网络抖动导致会话超时, 如果是后者就会导致数据不一致;

chubby的开源实现Zookeeper

image.png

分布式锁服务关键技术和常见解决方案 ( 下)

相关文章

  • 分布式锁

    为什么要用分布式锁 数据库乐观锁redis分布式锁zookeeper分布式锁 使用分布式锁的场景 实现分布式锁的方...

  • 什么是分布式锁?几种分布式锁分别是怎么实现的?

    一、什么是分布式锁: 1、什么是分布式锁: 分布式锁,即分布式系统中的锁。在单体应用中我们通过锁解决的是控制共享资...

  • 4:Redis 分布式锁 (文末有项目连接)

    1:什么是缓存分布式锁 2:分布式锁的关键代码 3:业务代码使用分布式缓存锁 4:业务代码使用分布式缓存锁 5:测...

  • 锁(2)-- 分布式锁

    前言: 锁分3种:java锁、分布式锁、DB锁 分布式锁的几种实现方式 目前几乎很多大型网站及应用都是分布式部署...

  • java锁的概念

    参考文档探究分布式并发锁并发编程-锁的发展和主流分布式锁比较总结从构建分布式秒杀系统聊聊分布式锁探索并发编程(六)...

  • Redis实现分布式锁

    分布式下的分布式锁一般实现有三种: 基于数据库的乐观锁 基于redis的分布式锁 基于zookeeper的分布式锁...

  • 分布式锁

    为什么要用分布式锁? 分布式锁是悲观锁的实现; 如果采用乐观锁的方案就用不着分布式锁了。 能用乐观锁的地方尽量用乐...

  • 3.10:分布式锁

    本文将梳理微服务架构下,分布式锁的常用方案。整体包含以下三部分: 分布式锁的提出 分布式锁主流方案 分布式锁选择 ...

  • Redis实现分布式锁

    1. 分布式锁分类 数据库乐观锁 基于Redis的分布式锁 基于ZooKeeper的分布式锁 2. 组件依赖 po...

  • 大佬浅谈分布式锁

    redis 实现 redis 分布锁一、redis 实现分布式锁(可重入锁)redission 实现分布式锁1、对...

网友评论

      本文标题:分布式锁

      本文链接:https://www.haomeiwen.com/subject/sfcgnctx.html