作用:
1、做一个轻量级的存储
2、帮助上层组件选择主备
leader选举使用原子广播通知其他节点
zookeeper有多个znode
znode分为永久节点和临时节点两种
临时节点的作用就是就是帮助上层组件选择主备,如hadoop的namenode和yarn的resourceManager
临时节点只可以有一个客户端相连Master选举
Master选举可以说是ZooKeeper最典型的应用场景了。比如HDFS中Active NameNode的选举、YARN中Active ResourceManager的选举和HBase中Active HMaster的选举等。
针对Master选举的需求,通常情况下,我们可以选择常见的关系型数据库中的主键特性来实现:希望成为Master的机 器都向数据库中插入一条相同主键ID的记录,数据库会帮我们进行主键冲突检查,也就是说,只有一台机器能插入成功——那么,我们就认为向数据库中成功插入数据的客户端机器成为Master。
依靠关系型数据库的主键特性确实能够很好地保证在集群中选举出唯一的一个Master。但是,如果当前选举出的Master挂了,那么该如何处理?谁来告诉我Master挂了呢?显然,关系型数据库无法通知我们这个事件。但是,ZooKeeper可以做到!
利用ZooKeepr的强一致性,能够很好地保证在分布式高并发情况下节点的创建一定能够保证全局唯一性,即ZooKeeper将会保证客户端无法创建一个已经存在的ZNode。也就是说,如果同时有多个客户端请求创建同一个临时节点,那么最终一定只有一个客户端请求能够创建成功。利用这个特性,就能很容易地在分布式环境中进行Master选举了。
成功创建该节点的客户端所在的机器就成为了Master。同时,其他没有成功创建该节点的客户端,都会在该节点上注册一个子节点变更的Watcher,用于监控当前Master机器是否存活,一旦发现当前的Master挂了,那么其他客户端将会重新进行Master选举。
这样就实现了Master的动态选举。
永久节点可以帮助上层组件保存一些信息,如HBase中的RegionServer的Region信息等
zookeeper的容灾能力
zookeeper中有半数以上的节点是正常,即认为zookeeper是正常的
zookeeper选举时,当某一个实例获得半数以上的票数时,则变为leader
zookeeper部署n个节点,当然n一般是奇数,因为
3个节点和4各节点的容灾能力是一样至多只能挂一个节点
zookeeper所存储的信息在内存中,所以相应很快
zookeeper的写信息是向节点的一半以上的节点进行相同写入,只有当一半以上的节点写入成功,这次操作才算成功
为了防止两个主节点的出现:
例如HDFS的namenode会zookeeper中申请建立一个临时节点,申请作为主namenode,这时zookeeper的永久节点会
保存着之前的namenode节点,他会去判断这个节点的状况,如果它还活着,将他杀了,然后才能允许申请变主节点