- Leader服务器会和每一个Follower/Observer服务器建立TCP连接,同时为每个F/O都创建一个叫做LearnerHandler的实体。LearnerHandler主要负责Leader和F/O之间的网络通讯,包括数据同步,请求转发和Proposal提议的投票等。Leader服务器保存了所有的F/O的LearnerHandler
- ZooKeeper作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题。ZooKeeper提供的服务包括:分布式消息同步和协调机制、服务器节点动态上下线、统一配置管理、负载均衡、集群管理等等
- ZooKeeper提供基于类似Linux文件系统的目录节点树方式的数据存储,即分层命名空间。ZooKeeper不是用来专门存储数据的,它的作用主要是用来维护和监控存储的数据的状态变化,通过监控这些数据变化,从而可以达到基于数据的集群管理,ZooKeeper节点的数据上限是1M
- 我们可以认为ZooKeeper=文件系统+通知机制,对于ZooKeeper的数据结构,每个子目录项如NameService都被称为一个znode,这个znode是对他所在的路径的唯一标识,如Server1这个znode的标识为/NameService/Server1
- znode可以有子节点目录,并且每个znode都可以存储数据,注意EPHEMERAL类型的目录节点不能有子节点目录(因为EPHEMERAL类型的目录节点是临时节点)
- znode是有版本的,每个znode中存储的数据可以有多个版本,也就是一个访问路径中可以存储多份数据
- znode可以是临时节点,一旦创建这个znode的客户端与服务器失去联系,这个znode也将自动删除,ZooKeeper的客户端和服务器通信采用长连接方式,每个客户端和服务器通过心跳来保持连接,这个链接状态成为session,如果znode是临时节点,这个session时效那么znode也就删除了
- znode的目录名可以自动编号,如App1已经存在,再创建的话,将自动命名为App2
- znode可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个是ZooKeeper的核心特性,ZooKeeper的很多功能都是基于这个特性实现的
Znode有两种类型:
- 短暂(ephemeral):客户端和服务端断开连接后,创建的节点自己删除
- 持久(pesistent):客户端和服务端断开连接后,创建的节点不删除
Znode有四种形式的目录节点(默认是persistent)
- 持久化目录节点(persistent):客户端与ZooKeeper断开连接后,该节点依然存在
- 持久化顺序编号目录节点(persistent_sequential):客户端与ZooKeeper断开连接后,该节点依旧存在,只是ZooKeeper给该节点名称进行顺序编号
- 临时目录节点(ephemeral):客户端与服务端断开连接后,该节点被删除
- 临时顺序编号目录节点(ephemeral_sequential):客户端与服务端断开连接后,该节点被删除,只是ZooKeeper给该节点名称进行顺序编号
- ZooKeeper选择了基于通知(notification)的机制,即:客户端向ZooKeeper注册需要接受通知的znode,通过znode设置监控点(watch)来接收通知,建试点是一个单次触发的操作,意即监视点会触发一个通知。为了接收多个通知,客户端必须在每次通知后设置一个新的监视点。当节点/task发生变化时,客户端会收到一个通知,并从ZooKeeper读取一个新值
- 在应用程序中,main()方法首先会创建zkClient,创建zkClient的同时会产生两个进程,即Listener进程(监听进程)和connect进程(网络连接/传输进程),当zkClient调用getChildren()方法注册监视器时,connect进程向ZooKeeper注册监听器,注册后的监听器位于ZooKeeper的监听器列表中,监听器列表中记录了zkClient的IP,端口号以及要监控的路径,一旦目标文件发生变化,ZooKeeper就会把这条消息发送给对应的zkClient的Listener()进程,Listener进程接受到后,就会执行process()方法,在process()方法中针对发生的事件进行处理



