4、Zookeeper基础知识
1、ZooKeeper是什么?
zookeeper实际上是yahoo开发的一个开放源码的分布式协调服务,主要是用来解决分布式系统的资源竞争、死锁、数据不一致问题。分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等功能。
ZK现已经被广泛使用如:小米的米聊、阿里的TaoKeeper、hbase(用zk来选举⼀个集群内的主节点,以便跟踪可⽤的服务器,并保存集群的元数据)、hadoop、kafka(其中zk⽤于检测崩溃,实现主题发现,并保持主题的⽣产和消费状态)、Apache SolrCloud(使⽤zk来存储集群的元数据,并协作更新这些元数据)、Facebook Messages(使用zk作为控制器,⽤来实现数据分⽚、故障恢复和服务发现等功能)、苏宁的RSF(使用zk集群来作为服务的注册中心,并支持熔断、限流、监控、统计、告警)、dubbo 等都是基于zookeeper而构建。
2、 ZooKeeper能够提供哪些服务或者说是ZK的使用场景?
答案请移步:4.1 ZooKeeper提供的常见服务(或者说是使用场景)
备注:ZK不适合⽤作海量数据存储,ZK集群主要管理应⽤协作的关键数据
3、zk中有哪些节点?及各个节点的使用场景?如何消失?
1)持久节点(persistent):
a.持久节点是指一旦这个树形结构被创建,除非主动进行对树节点的移除操作,否则这个节点将一直保存在 ZooKeeper 上,即使znode的创建者不再属于应⽤系统时,数据也可以保存下来⽽不丢失。
b.持久节点的使用场景:在主-从模式例⼦中,需要保存从节点的任务分配情况,即使分配任务的主节点已经崩溃了。
c.持久节点需要显式删除才消失
2)临时节点(ephemeral):
a.临时节点的生命周期跟客户端会话绑定,一旦客户端会话失效,那么这个客户端创建的所有临时节点都会被移除。
b.临时节点:用户创建主节点,及会随着会话消失的相关业务节点
c.临时节点会话终止即自动消失,也可以通过显示进行删除
3)顺序节点(sequential)
a.顺序节点可以是持久的或临时的。当一个新的znode被创建为一个顺序节点时,ZooKeeper通过将10位的序列号附加到原始名称来设置znode的路径。例如,如果将具有路径 /myapp 的znode创建为顺序节点,则ZooKeeper会将路径更改为 /myapp0000000001 ,并将下一个序列号设置为0000000002。如果两个顺序节点是同时创建的,那么ZooKeeper不会对每个znode使用相同的数字
b.顺序节点在锁定和同步中起重要作用
4、zk集群中有哪些角色?及其作用分别是什么?
zk集群有Leader(领导)、Follower(追随者)、Observer(观察员)三种角色,一个ZooKeeper集群同一时刻只会有一个 Leader,其他都是 Follower 或 Observer。
1)ZooKeeper 集群的所有机器通过一个 Leader 选举过程来选定一台被称为Leader的机器,Leader服务器为客户端提供读和写服务。
2)Follower 和 Observer都能提供读服务,不能提供写服务。
3)Follower 和 Observer区别在于Observer不参与Leader选举过程,也不参与写操作的"过半写成功"策略,因此Observer可以在不影响写性能的情况下提升集群的读性能。
5、谈谈对zk中会话的理解?
一旦客户端连接到zk服务器,将建立会话服务端会向客户端分配会话ID,客户端以特定的时间间隔向服务端发送心跳以保持会话有效。
1)通过心跳保持会话:如果ZooKeeper集合在超过服务器开启时指定的期间(会话超时)都没有从客户端接收到心跳,则它会判定客户端死机,会话超时通常以毫秒为单位。当会话由于任何原因结束时,在该会话期间创建的临时节点也会被删除。
2)会话无法通讯时,自动进行服务切换:
当客户端通过某一个特定的语言套件来创建一个zookeeper句柄时,他就会通过服务建立一个会话。客户端初始连接到集合中的某一个服务器或者一个独立服务器。客户端通过TCP协议与服务器进行连接并通信。但是当会话无法与当前服务器继续通信时,会话可能转移到另一个服务器上。zk客户端透明的转移一个会话到不同的服务器上。
创建一个会话需要设置会话超时这一参数,该参数设置了zk服务器允许会话被声明为超时之前存在的时间。如果经过时间t之后服务器接收不到这个会话的任何消息,服务就会声明会话过期。而客户端侧,如果经过t/3时间,未收到任何消息,客户端将向服务器发送心跳消息。再经过2t/3的时间后,zk客户端开始寻找其他的服务器,而此时它还有t/3的时间寻找。
6、仲裁模式下客户端会尝试连接到哪个服务器?
仲裁模式下应用需要传递可用的服务器列表给客户端,告知客户端可以连接的服务器信息,并选择一个进行连接。
备注:判断服务器是否可用的重要标识是:事务标识符(zkid)。如果尝试连接的服务器有一个较低的zkid,那么会继续尝试连接其他的服务器。
7、谈谈对zk中watch(监视)的理解:
监视是一种简单的机制,使客户端收到关于ZooKeeper集合中的更改的通知。
1)客户端可以在读取特定znode时设置Watches,Watches会向注册的客户端发送任何znode(客户端注册表)更改的通知。Znode更改是与znode相关的数据的修改或znode的子项中的更改。
2)一次更改只触发一次watches;
3)如果客户端想要再次通知,则必须通过另一个读取操作,并设置监视点来完成。
4)当连接会话过期时,客户端将与服务器断开连接,相关的watches也将被删除。
8、谈谈对zk中事件、监视点、通知的理解?
答案请移步:5.5 事件、监视点、通知
参看书籍:Zookeeper 分布式过程.pdf 如有需要欢迎留言!
细水长流,打磨濡染,渐趋极致,才是一个人最好的状态。