分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了


Posted in Redis onMay 21, 2021

在分布式的应用中,为了防止单点故障,保障高可用,通常会采用主从结构,当主节点挂掉后,从节点可以代替主节点提供服务。

Redis通过复制 + sentinel哨兵来实现主从模式。

Zookeeper通过replicated mode复制模式来实现主从模式。

单从结构上看,Redis和Zookeeper都是主从架构,那Zookeeper的优势是什么?为什么要选择Zookeeper?难道只是因为Zookeeper是目录结构,Redis是K-V结构吗?

同步机制的不同

Redis

Redis在给从节点同步数据时,正常情况是增量同步,也就是主节点的数据修改语句(DML)会异步的同步给从节点。Redis的数据同步没有保障数据一致性的机制,也就是说,一条DML在主节点执行成功时,不能保障其他从节点成功执行了这条数据,这就会造成一个问题,如果在数据没有同步到从节点时,主节点挂掉,就会产生数据丢失的情况。

Zookeeper

Zookeeper使用类paxos算法来保障数据的一致性。简单的讲,当一个DML语句发送给主节点时,Zookeeper需要保证一半以上的节点接收到数据,才会返回成功。并且当主节点挂掉,从节点重新选举时,同步到最新的数据的节点会有优先选举权。

举个例子:

一个4节点Zookeeper(A、B、C、D),A是主节点,当执行一个create语句成功时,至少有3台节点执行成功(一半以上),例如A、C、D成功。此时如果A节点挂了,B、C、D进行选举,由于C、D都执行成功了create语句,B没有执行,C、D的数据更加新,具有优先选举权,再根据名称排序,选择C做为主节点。在整个选举过程中,服务不可用,选举完成后,C节点和A节点数据一致,不会出现丢失的情况。

分布式锁

要实现分布式锁,需要满足一些要求:

  • 只能有一个服务的一个线程能获取锁
  • 一个持有锁的线程挂掉后,锁应该被释放,用来给其他线程用
  • 一个持有锁的线程没执行完,锁不能释放
  • 锁释放后,其他等待者可以继续争抢
  • 管理锁的主节点(Redis或Zookeeper)挂了,重新选举后,不影响锁的持有情况

Redis解决方案

问题1、问题2:使用“SET key value EX seconds NX”语句获取锁并设置过期时间

问题3:另开一个监控线程,监控主线程执行情况,用来延长过期时间

问题4:等待线程定时检查锁的持有情况

问题5:暂无或者解决成本很高,需要自己实现类paxos的算法

Zookeeper解决方案

通过创建临时节点可以解决问题1,2,3

watch机制可以解决问题4,并且相比定时检查,watch可以做到更高实时性

zookeeper的paxos同步机制保障了节点间数据一致性,即使主节点挂掉,也可以保障数据不丢,可以解决问题5

对比可以发现:

Zookeeper的机制可以保证分布式锁实现业务代码简单,成本低。

Redis如果要解决分布式锁的问题,对于一些复杂的情况,很难解决,成本较高。

以上就是分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了的详细内容,更多关于分布式锁Zookeeper Redis的资料请关注三水点靠木其它相关文章!

Redis 相关文章推荐
redis限流的实际应用
Apr 24 Redis
基于Redis实现分布式锁的方法(lua脚本版)
May 12 Redis
redis实现共同好友的思路详解
May 26 Redis
深入理解redis中multi与pipeline
Jun 02 Redis
Redis Cluster集群动态扩容的实现
Jul 15 Redis
使用RedisTemplat实现简单的分布式锁
Nov 20 Redis
Redis中缓存穿透/击穿/雪崩问题和解决方法
Dec 04 Redis
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
Mar 16 Redis
解决 redis 无法远程连接
May 15 Redis
Redis基本数据类型String常用操作命令
Jun 01 Redis
Redis 配置文件重要属性的具体使用
May 20 #Redis
浅谈redis缓存在项目中的使用
May 20 #Redis
详解Redis主从复制实践
详解redis分布式锁的这些坑
为Java项目添加Redis缓存的方法
redis内存空间效率问题的深入探究
深入浅析Redis 集群伸缩原理
You might like
上海地方志办公室-上海电子仪表工业志
2021/03/04 无线电
php读取xml实例代码
2010/01/28 PHP
vs中通过剪切板循环来循环粘贴不同内容
2011/04/30 PHP
深入理解PHP原理之错误抑制与内嵌HTML分析
2011/05/02 PHP
Codeigniter(CI)框架分页函数及相关知识
2014/11/03 PHP
Laravel中使用FormRequest进行表单验证方法及问题汇总
2016/06/19 PHP
phpstudy默认不支持64位php的解决方法
2017/02/20 PHP
Javascript操纵Cookie实现购物车程序
2006/11/23 Javascript
jquery 学习笔记 传智博客佟老师附详细注释
2020/09/12 Javascript
JQuery跨Iframe选择实现代码
2010/08/19 Javascript
说明你的Javascript技术很烂的五个原因
2011/04/26 Javascript
根据邮箱的域名跳转到相应的登录页面的代码
2012/02/27 Javascript
javascript根据像素点取位置示例
2014/01/27 Javascript
ionic实现带字的toggle滑动组件
2016/08/27 Javascript
js 性能优化之快速响应的用户界面
2017/02/15 Javascript
jquery实现静态搜索功能(可输入搜索文字)
2017/03/28 jQuery
React 子组件向父组件传值的方法
2017/07/24 Javascript
微信小程序实现上传图片功能
2018/05/28 Javascript
JS开发 富文本编辑器TinyMCE详解
2019/07/19 Javascript
详解js location.href和window.open的几种用法和区别
2019/12/02 Javascript
Vue获取微博授权URL代码实例
2020/11/04 Javascript
[46:47]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS NE
2014/05/22 DOTA
python3实现字符串的全排列的方法(无重复字符)
2018/07/07 Python
pandas筛选某列出现编码错误的解决方法
2018/11/07 Python
python读取txt文件,去掉空格计算每行长度的方法
2018/12/20 Python
Python3之手动创建迭代器的实例代码
2019/05/22 Python
使用OpenCV实现仿射变换—平移功能
2019/08/29 Python
解决Django删除migrations文件夹中的文件后出现的异常问题
2019/08/31 Python
序列化Python对象的方法
2020/08/01 Python
Java Unsafe类实现原理及测试代码
2020/09/15 Python
CSS3实现酷炫的3D旋转透视效果
2019/11/21 HTML / CSS
运动会广播稿60字
2014/01/15 职场文书
人力管理专业毕业生求职信
2014/02/27 职场文书
群众路线教育党课主持词
2014/04/01 职场文书
消防安全标语
2014/06/07 职场文书
css弧边选项卡的项目实践
2023/05/07 HTML / CSS