设为首页 收藏本站
查看: 947|回复: 0

[经验分享] zookeeper全分析之我见一

[复制链接]
累计签到:39 天
连续签到:1 天
发表于 2015-11-21 14:39:34 | 显示全部楼层 |阅读模式
  最近一直在看zookeeper的代码和文章。原因一个是项目越来越依赖zk, 我也要给同事们分享一下zk。 有些心得,觉得很有必要记下来。
  本人接触java一年多时间,看java代码不是很深入,我且把看懂的和知道的写来了。
    一. zookeeper 基本介绍

             1)Why zookeeper?  
                一般分布式应用需要一个主控、协调器或控制器来管理物理分布的子进程;缺乏一个通用的机制;协调程序的反复编写浪费,           2)What  Is Zookeeper ?   
  它是ApacheHadoop的一个子项目,它主要用来解决分布式集群中应用系统的一致性问题,提供基于类似于文件系统的目录节点树方式的数据存储。除了数据存储,它还可以用来维护和监控你存储的数据的状态变化。从设计模式角度它能Zookeeper是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知那些已经注册的观察者做出相应的反应。
             3)What zk looks like?
              上面说过,类似于文件系统, 是文件系统模型。 有图为证:
DSC0000.jpg

  不过它的目录节点可以存少量数据(<1M)。

  4) How ZK Work?

                 看图就知道大概了:
                     DSC0001.jpg

  
             *All servers store a copy of the data (in memory)‏             *A leader is elected at startup             *Both followers and leaderservice clients, allupdates go through leader
            具体zk内部怎么运作的,且看下面的分解(成说书的了)
   
         5) ZK 3个角色4个状态
         角色         –leader,主负责进行投票的发起和决议,最终更新状态         –follower, Follower用于接收客户请求并返回客户结果参与Leader发起的投票         –observer,Oberserver可接收客户端连接,将写请求转发给leader节点。但是Observer不参加投票过程,只是同步leader的状态        ·对应4个状态:leading, following , observing, looking  
  
  6) zk node的类型
  
         ·Persistent Nodes:永久有效地节点,除非client显式的删除,否则一直存在        ·Ephemeral Nodes:临时节点,仅在创建该节点client保持连接期间有效,一旦连接丢失,zookeeper会自动删除该节点        ·Sequence Nodes:顺序节点,client申请创建该节点时,zk会自动在节点路径末尾添加递增序号,这种类型是实现分布式锁,分布式queue岛上所有事情由议员(Senator)决定等特殊功能的关键

       7) zk 的客户端API
       大致有:
         ·ZooKeeper(StringconnectString,intsessionTimeout,Watcherwatcher)         ·create(finalString path, byte data[], List<ACL>acl,CreateModecreateMode)         ·exists(final String path,Watcherwatcher)         ·setData(finalString path, byte data[],int version)         ·getData(final String path,Watcherwatcher,Statstat)         ·getChildren(final String path,Watcherwatcher)     
      8)zk watcher
         All of the read operations:getData()exists()getChildren()提供watcher的功能, 分为data watches and child watches
        注意以下几点:
             ·One-time trigger, 只触发一次。再次需要再次注册,注册方式为再次getData()exists()getChildren()
            ·Sent to the client, 我理解为在客户端运行watcher的process函数。
  
以上的内容为对Zk的基本介绍。

二: Paxos算法
        说paxos为zk的灵魂,一点也不为过。 对于分布式一致性算法来说,paxos比较成熟。先简单说一下paxos算法内容:说是有个叫paxos的岛,岛上住着一群岛民。岛上所有事情由议员(Senator)决策, 每个提议(Proposal)都有一个编号(PID),议员只会同意大于当前编号的提议。也只有一半以上议员同意,当前的提议才算通过。

       在ZK里, 和paxos算法对应的是
        ·小岛(Island)——ZK Server Cluster        ·议员(Senator)——ZK Server        ·提议(Proposal)——ZNode Change(Create/Delete/SetData…)       ·提议编号(PID)——Zxid(ZooKeeper Transaction Id)       ·正式法令——所有ZNode及其数据    zk paxos主要使用fast paxos(paxos一种演变), 有两个实现, leader election 和fast leader election。下面介绍这两个实现:
      1) Leader Election: LeaderElectionFastpaxos最简单的一种实现, 每个Server启动以后都询问其它的Server它要投票给谁,收到所有Server回复以后,就计算出zxid最大的哪个Server,作为下一次投票server


      2) Fast Leader Election:FastLeaderElection是标准的fastpaxos的实现它首先向所有Server提议自己要成为leader,当其它Server收到提议以后,解决epochzxid的冲突,并接受对方的提议,然后向对方发送接受提议完成的消息



三: zk的客户端
1)ZK的java Client。
  由三个主要模块组成:Zookeeper, WatcherManager, ClientCnxn。如图:
DSC0002.jpg
·Zookeeper: 是ZK Client端的真正接口,用户可以操作的最主要的类,用户不用关心怎么连接到Server,Watcher什么时候被触发问题。
·WatcherManager: 是用来管理Watcher的,Watcher是ZK的一大特色功能,允许多个Client对一个或多个ZNode进行监控,当ZNode有变化时能够通知到监控这个ZNode的各个Client。
·ClientCnxn: 是管理所有网络IO的模块,所有和ZK Server交互的信息和数据都经过这个模块,包括给ZK Server发送Request,从ZK Server接受Response,以及从ZK Server接受Watcher Event。ClientCnxn完全管理了网络,从外部看来网络操作是透明的。
2)ZK的c client。
  每个客户端由zhandle创建两个线程,IO线程(do_io)负责连接zk server以及收发包,competion线程(do_competion)处理异步回调函数和watcher调用。
  主要缺点:
1.每初始化一个zhandle都会启动两个线程,线程不能共享。
2.c代码难以维护
3.回调串行处理,某个回调时间长容易堵住线程,可以采用线程池。
4.session expire必须由客户端重连到服务端才能发现。
5.重连时不sleep,因此实际应用中发生过DDOS
3)Python客户端
  官方提供的python 客户端对C Client 有依赖。通过python调用libzookeeper_mt.so 和 libzookeeper_st.so动态库文件
4)zk watcher
·getData,getChildren(),exists()这三个方法可以针对参数中的path设置watcher,
·当path对应的Node 有相应变化时,server端会给对应的设置了watcher的client 发送一个一次性的触发通知事件。
·客户端在收到这个触发通知事件后,可以根据自己的业务逻辑进行相应地处理。
  




  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-141881-1-1.html 上篇帖子: hadoop+zookeeper+hbase分布式环境配置之hbase分布式环境搭建 下篇帖子: 【Dubbo之基本配置和运行(1)】zookeeper安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表