【闲聊杂谈】分布式协调服务Zookeeper

导读:本篇文章讲解 【闲聊杂谈】分布式协调服务Zookeeper,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

1、Zookeeper是什么?

Zookeeper自身做的就是分布式协调,上一篇我们说过通过Redis实现分布式锁非常的复杂,但是Zookeeper自身就提供了一套非常成熟并且简易的解决方案,但是zookeeper也远远不止于分布式锁,这只是它的冰山一角而已。

根据官网的介绍:Zookeeper是一种用于分布式应用程序的分布式开源协调服务。它公开了一组简单的原语,分布式应用程序可以构建这些原语,以实现更高级别的服务,以实现同步,配置维护以及组和命名。

那么所谓的原语究竟是什么?在官网上,Zookeeper提供了一些简单的API:create、delete等,从功能的角度来说非常简单。但是我们的程序可以利用这些非常简单的功能组装分装包装,从而达成一些我们非常想要实现的复杂功能。

2、Zookeeper设计的目标

① 简单  Zookeeper允许分布式进程通过共享的分层命名空间相互协调,该命名空间的组织方式与标准文件系统类似:名称是由斜杠分隔的路径元素序列。我们可以和Redis进行一个对比,Redis所提供的数据模型是K-V键值对,Zookeeper里面也可以存数据,但是它的数据模型是类似于文件系统的层次结构。 Zookeeper的数据保存在内存中,这意味着可以实现高吞吐量和低延迟数量。

【闲聊杂谈】分布式协调服务Zookeeper

图中每一个节点能存储的数据并不多,只有1M。这也是官方的刻意为之,其根本目的就在于不鼓励将Zookeeper作为数据库来使用。理论上你非要拿它用作数据库也行,但是强烈的建议你不要这么去使用。 Zookeeper设计的核心和Redis一样,所有的一切都是为了它的高效率而服务,那么前提就是它传输的数据不能太大。

② 高性能、高可用性、严格有序的访问  Zookeeper的高性能方面意味着它可以在大型分布式系统中使用;可靠性方面使其不会成为单点故障;严格的排序意味着可以让客户端实现复杂的同步原语。

③ 支持集群 从集群的模型角度来分:主从模型是一种,无主模型是一种(类似于Redis Cluster集群);从数据储存角度来分:复制集群是一种,Sharding分片集群是一种。而Zookeeper属于复制集群,每个节点里面的数据都一模一样。

【闲聊杂谈】分布式协调服务Zookeeper

从图中可以看出Zookeeper的集群也是一种主从架构,有一个leader,其余的节点都是follower。 leader负责写入,follower负责查询。

主从架构最大的问题就是主是单点的,会出现单点故障的问题。但是官网上说Zookeeper可以提供高可用性,那么这个高可用性是怎么实现的?其实就是通过一种方式在原本的leader宕机以后,立马在极短的时间内选取出新的leader来取代原来旧的leader。根据官方给出的描述:由7台机器组成的Zookeeper集群,模拟910个客户端在400秒的时间内每秒进行4万到4万5千次请求,Zookeeper选择新leader的时间不到200ms。

④ 快 Zookeeper在“读取主导”工作负载中特别快,Zookeeper应用程序在数千台计算机上运行,并且在读取比写入更常见的情况下表现最佳,大概10:1,也就是说在10次查询请求中有1次写入请求,在这种工作负载下,zookeeper的速度可以达到最快。其实类比一下Redis,Redis是单实例单进程的,就这么一个进程,差不多每秒钟能hold住10万次左右的请求访问。

3、Zookeeper的目录树结构

【闲聊杂谈】分布式协调服务Zookeeper

Zookeeper中的节点分为持久节点和临时节点:每一个客户端连接到Zookeeper节点的时候,都会产生一个session代表这个客户端,基于这个session就有临时节点这么一个概念。

之前在讨论Redis作为分布式锁的时候,有一个问题就是说当我一个线程从Redis中获得了一把锁,然后去执行自己的业务逻辑,但是锁超时了业务逻辑还没有处理完,为了防止这种情况,就需要引入另一个守护线程来时刻监视着这个锁的过期时间,如果锁的时间到了,但是业务逻辑没有处理完就需要重置锁的过期时间使得这把锁不会过期。

但是在使用Zookeeper的时候,依托于session所产生的临时节点,session在,节点在。线程如果挂掉,session销毁,节点销毁,就不需要再引入守护线程这么麻烦。

基于持久节点和临时节点,还会有序列节点这么个概念,但序列节点并不是脱离于持久结点和临时节点单独存在的。Zookeeper中的节点,要么是持久节点,要么是临时节点,而序列节点只是一种概念,后面演示的时候再详细讲解。

4、Zookeeper提供的保证

① 顺序一致性  所有的写入请求都在leader节点排队,一个一个来。

② 原子性   leader会将写入的请求挨个发给其余的follower,要么大家一起创建成功,要么大家一起创建失败。但是为了确保它的可用性,肯定不会使用强一致性方案,用的是最终一致性方案,过半通过即可。

③ 单系统映像  统一视图,所有节点里面的数据都是一模一样的。

④ 可靠性  序列化。

⑤ 及时性  

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/111944.html

(0)
Java光头强的头像Java光头强

相关推荐

发表回复

登录后才能评论
极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!