What’s is ZooKeeper:
一个开源的分布式的,为分布式应用提供协调服务的Apache项目。
- 功能包括::配置维护,名字服务,分布式同步,组服务等
- 目标:封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
ZooKeeper特点:
- 最终一致性:为客户端展示同一视图,这是 ZooKeeper 最重要的性能。
- 可靠性:如果消息被一台服务器接受,那么它将被所有的服务器接受。
- 实时性:ZooKeeper 不能保证两个客户端同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口。
- 独立性(等待无关):慢的或者失效的 client 不干预快速的client的请求。
- 原子性:更新只能成功或者失败,没有中间其它状态。
- 顺序性:对于所有Server,同一消息发布顺序一致
ZooKeeper Service:
- 每个Server在内存中存储了一份数据。
- Zookeeper启动时,将从实例中选举一个leader(根据Paxos协议来选举)
- Leader负责处理数据更新等操作(根据Zab协议)
- 一个更新操作成功的标志是当且仅当大多数Server在内存中成功修改数据。
ZooKeeper 角色:
- 服务器数量是2n+1,允许服务器宕机个数为n(不影响整个集群的功能)
- 角色:leader:做决定,做决策
follower:接受客户端请求,投票
ZooKeeper 典型应用场景:
- Zookeeper 从设计模式角度来看,是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper 就将负责通知已经在 Zookeeper 上注册的那些观察者做出相应的反应,从而实现集群中类似 Master/Slave 管理模式。
- 应用场景
- 统一命名服务(Name Service)
- 配置管理(Configuration Management)
- 集群管理(Group Membership)
- 共享锁(Locks)同步锁
ZooKeeperFailureController&JournalNode:
- 故障转移监控器(ZK客户端)
- 是在NN上启动的进程,它用来监控NN的状态,并实时向ZK汇报,如果ActiveNN突然发生了状况,它会把消息通知ZK,由于ZK的信息是共享的,另一端的ZK会把信息告诉负责监控standbyNN的ZKFC进程,由ZKFC再通知standbyNN变成ActiveNN
- JournalNode
- 在Hadoop2.x中,NN Active的元数据信息一旦更新会将EDIT文件实时保存到一种中间介质(NFS或QJM),我们使用QJM(Quorum Journal Manager分布式日志系统),而JournalNode实际是在ZK上启动的。2.x中是不需要SecondaryNN的。NFS 网络文件系统成本低、效率比较低。
- ZK基本只做一件事:选举哪个NN是active。
- ZK和JournalNode的位置并无要求,只要可以通信即可,开启顺序:先ZK后JN。