Zookeeper入门看这里!

Zookeeper是什么

它主要是用来解决分布式应用中经常遇到的一些数据管理问题,
如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。

  • 配置管理
    在我们的应用中除了代码外,还有一些就是各种配置。比如数据库连接等。一般我们都是使用配置文件的方式,在代码中引入这些配置文件。但是当我们只有一种配置,只有一台服务器,并且不经常修改的时候,使用配置文件是一个很好的做法。
    但是如果我们配置非常多,有很多服务器都需要这个配置,而且还可能是动态的话使用配置文件就不是个好主意了。
    这个时候需要寻找一种集中管理配置的方法,我们在这个集中的地方修改维护配置。而且很多服务的正常运行都非常依赖这个配置,所以也需要这个集中提供配置的服务具备很高的可靠性。
    过程大概是这样的,所有相关应用程序对某个目录节点进行监听,一旦配置信息发生变化,每个应用程序就会收到 zookeeper 的通知,然后从 zookeeper 获取新的配置信息应用到系统中。
    一般我们可以用一个集群来提供这个配置服务,但是用集群提升可靠性,那如何保证配置在集群中的一致性呢? 这个时候就需要使用一种实现了一致性协议的服务了。
    Zookeeper就是这种服务,它使用Zab这种一致性协议来提供一致性。
    现在有很多开源项目使用Zookeeper来维护配置:
    1)比如在HBase中,客户端就是连接一个Zookeeper,获得必要的HBase集群的配置信息,然后才可以进一步操作。
    2)还有在开源的消息队列Kafka中,也使用Zookeeper来维护broker的信息。
    3)在Alibaba开源的SOA框架Dubbo中也广泛的使用Zookeeper管理一些配置来实现服务治理。

如图
在这里插入图片描述

  • 名字服务
    比如我们的系统要通过网络访问很多个系统,我们要知道很多个系统的ip地址和端口号等,如果我们在本地保存服务的地址也是非常不方便。
    但是如果我们只需要访问一个大家都熟知的访问点,这里提供统一的入口,我们只需要范围我们那么维护起来将方便得多了。
    zookeeper就是保存了名称和服务地址的映射关系,我们只需要访问名称就可以获得对应服务的地址。
    提供者会把名称和服务地址写到zookeeper上,
    客户端会通过zookeeper获取服务列表。

如图
在这里插入图片描述

  • 分布式锁
    我们就可以利用Zookeeper来协调多个分布式进程之间的活动。
    比如在一个分布式环境中,为了提高可靠性,我们的集群的每台服务器上都部署着同样的服务。
    但是,一件事情如果集群中的每个服务器都进行的话,那相互之间就要协调,编程起来将非常复杂。而如果我们只让一个服务进行操作,那又存在单点。
    通常还有一种做法就是使用分布式锁,在某个时刻只让一个服务去干活,当这台服务出问题的时候锁释放,立即转移到另外的服务运行。

在这里插入图片描述

  • 集群管理
    在分布式的集群中,经常会由于各种原因,比如硬件故障,软件故障,网络问题,有些节点会进进出出。有新的节点加入进来,也有老的节点退出集群。
    这个时候,集群中其他机器需要感知到这种变化,然后根据这种变化做出对应的决策。
    1)比如我们是一个分布式存储系统,有一个中央控制节点负责存储的分配,当有新的存储进来的时候我们要根据现在集群目前的状态来分配存储节点。这个时候我们就需要动态感知到集群目前的状态。
    2)还有,比如一个分布式的SOA架构中,服务是一个集群提供的,当消费者访问某个服务时,就需要采用某种机制发现现在有哪些节点可以提供该服务(这也称之为服务发现,比如Alibaba开源的SOA框架Dubbo就采用了Zookeeper作为服务发现的底层机制)。
    3)还有开源的Kafka队列就采用了Zookeeper作为Cosnumer的上下线管理。

在这里插入图片描述

zookeeper的数据结构

1、层次化的目录结构,命名符合常规文件系统规范(类似文件系统)
在这里插入图片描述

2、每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识

3、节点Znode可以包含数据和子节点(但是EPHEMERAL类型的节点不能有子节点)

节点类型 :
a、Znode有两种类型:

短暂(ephemeral)
(create -e /app1/test1 “test1” 客户端断开连接zk删除ephemeral类型节点)

持久(persistent)
(create -s /app1/test2 “test2” 客户端断开连接zk不删除persistent类型节点)

b、Znode有四种形式的目录节点(默认是persistent )
PERSISTENT
PERSISTENT_SEQUENTIAL(持久序列/test0000000019 )
EPHEMERAL
EPHEMERAL_SEQUENTIAL

c、创建znode时设置顺序标识,znode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护
在这里插入图片描述
d、在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序

感谢您的阅读~,如果有帮助到您,可以关注一下

感谢以下博客

https://www.cnblogs.com/ultranms/p/9585191.html
https://segmentfault.com/a/1190000018876282

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值