zookeeper是hadoop的一个子项目,它与hadoop有密切的关系但确没有任何的依赖,是一个分布式应用程序协调服务 分布式的应用程序可以基于它,实现同步服务,配置服务,命名服务等功能
zookeeper功能: 1.一致性,client不论连接到哪一个Server,展示给它的都是同一个视图 2.可靠性,具有简单,良好,稳健的消息传递功能,如果一台Server接受到消息m,则所有的Server都会接受到消息m 3.实时性,zookeeper会在一定时间间隔内,去统计服务端Server是否有更新,或者失效的Server,会把这些信息通知给client端,更新最新的server或者剔除失效的server,可能由于网络延迟,如果client要保证每次调用最新的server,可以在调用前sync()接口 4.等待无关,慢或者失效的client不会干预快速的client请求每个client都是有效平等的等待 5.原子性,这个很重要,server端的更新要么成功,要么失败,不存在中间状态 6.顺序性,全局有序和局部有序,全局有序:指的是消息顺序a,b那么所有的服务server发布消息的顺序必定是先a后b 局部有序:指的是消息顺序a,b在同一个server上发布,那么顺序必定是先a后b的发布出去
zookeeper的核心是原子广播,这个机制保证了各个server之间的同步,实现这个机制的协议Zab协议 zab协议有两种工作模式,恢复模式(选主)和广播模式(同步) 恢复模式:当服务启动或者leader崩溃后,进入恢复模式,读取保存的服务快照,当leader被选举出来后,且server和leader的状态完成同步以后,就会进入广播模式,恢复模式就此结束
主服务 Zookeeper Master选举 Zookeeper会分配给注册到它上面的客户端一个编号,并且zk自己会保证这个编号的唯一性和递增性,N多机器中只需选出编号最小的Client作为Master就行,并且保证这些机器的都维护一个一样的meta信息视图,一旦Master挂了,那么这N机器中编号最小的胜任Master,Meta信息是一致的
分布式锁
在一台机器上要多个进程或者多个线程操作同一资源比较简单,因为可以有大量的状态信息或者日志信息提供保证,比如两个A和B进程同时写一个文件,加锁就可以实现。但是分布式系统怎么办?需要一个三方的分配锁的机制,几百台worker都对同一个网络中的文件写操作,怎么协同?还有怎么保证高效的运行? 解决问题: 高效分布式的分布式锁 Zookeeper分布式锁 分布式锁主要得益于ZooKeeper为我们保证了数据的强一致性,zookeeper的znode节点创建的唯一性和递增性能保证所有来抢锁的worker的原子性