zoukankan      html  css  js  c++  java
  • zookeeper常用场景、常用方法介绍

      应网友要求,介绍下zookeeper的应用场景,本文是在公司平台研发中对zookeeper(以下简称zk)的使用中得出的经验,分享给大家;如有更好的场景请添加评论,共同分享。

    1.ZK命令行使用、四种节点的介绍

      1)。搭建好zk环境后,运行其bin目录下的zkCli.sh,即可进入zk的人机交互界面,可以随意键入字母(quit是退出命令,注意哦)并回车,查看帮助文档;

      2)。节点分类:

        PERSISTENT:持久化目录节点,这个目录节点存储的数据不会丢失;

        PERSISTENT_SEQUENTIAL:顺序自动编号的目录节点,这种目录节点会根据当前已近存在的节点数自动加 1,然后返回给客户端已经成功创建的目录节点名;

        EPHEMERAL:临时目录节点,一旦创建这个节点的客户端与服务器端口也就是 session 超时,这种节点会被自动删除;

        EPHEMERAL_SEQUENTIAL:临时自动编号节点。

    2.ZK存储的数据特点介绍: 

      1)。每个子目录项如 /root 都被称作为 znode,这个 znode 是被它所在的路径唯一标识,即全路径。

      2)。znode 可以有子节点目录,并且每个 znode 可以存储数据,注意 EPHEMERAL 类型的目录节点不能有子节点目录

      3)。znode 是有版本的,每个 znode 中存储的数据可以有多个版本,也就是一个访问路径中可以存储多份数据(只是这么个概念,实际中用不同版本的几乎不可能);

      4)。znode 可以是临时节点,一旦创建这个 znode 的客户端与服务器失去联系,这个 znode 也将自动删除,Zookeeper 的客户端和服务器通信采用长连接方式,每个客户端和服务器通过心跳来保持连接,这个连接状态称为 session,如果 znode 是临时节点,这个 session 失效,znode 也就删除了;

      5)。znode 的目录名可以自动编号(前提是创建的节点是SEQUENTIAL的节点),如 App1 已经存在,再创建的话,将会自动命名为 App2;

      6)。znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个是 Zookeeper 的核心特性,Zookeeper 的很多功能都是基于这个特性实现的,后面在典型的应用场景中会有实例介绍

    3.生产环境中的使用场景和方法:

      1)。作为小型分布式内存数据库使用:

        消费者以零时节点的方式注册信息(包括Server的ip和port,需求的数据type和广播方式),生产者去获取所有消费者注册信息,然后将数据广播方式发往需求方(有兴趣可以参考java高效收发数据);

        好处:利用zk的零时节点的特性来存储信息和监控进程状态,如果进程挂掉了,那么零时节点就会被删除,生产者就能获取到此信息,然后断开socket链接,提高系统的可靠性。

      2)。重要进程的standby:

        系统中,会有一些至关重要的进程需要standby进程来守护,保证系统7*24正常运行,做法是:分别两台机器上启动此线程,然后在同一个目录下创建一个零时节点,因为create操作是原子性的,所以只有一台机器能创建成功,让创建成功的进程处理逻辑,而创建失败的进程捕获异常信息,每隔n秒去重新创建,如果出现机器宕机,则standby进程将会在n秒后继续提供服务,实现进程的热备份。

      3)。进程守护的另一种方式(跟2类似,但是确实两种方法都在各自模块中使用):

        在n台机器上启动进程(简单的注册零时的Seq Znode),监控进程根据注册信息,选取第一个注册上来的机器信息,通过ssh远程启动进程,如果节点没有了(用zk的watch回调方式,可以自动回调处理逻辑),则ssh过去kill掉此进程,并且重新让剩下的机器重新创建节点(保证负载最小的机器来运行此进程),选取新第一个节点机器进行操作。

    4.常见的错误:

      任何好的设计都会遇到各种复杂的问题,特别是在网络环境特别复杂的时候,比如:千兆网的环境,还没有进行业务逻辑的处理,仅仅在接入数据、解码、存储原始数据后就占到了一半的带宽,而这是一种常态,所以经常遇到网络延迟的情况,然后zk的session失效了,零时节点自动删除了,但是服务还在,所以需要自动重连zk,淘宝提供了第三方zkclient.jar来自动重连(即使在机器宕机后,等机器服务启动后还能自动连上,并且可以存储javaBean对象,所以在跟C++模块共用zk处理信息时,就要屏蔽掉序列化部分,有需要的可以留言,提供修改后的代码),但是由于session的假失效会带来更多的思考,比如要在程序里添加监控节点的相应逻辑,在零时节点消失后,关闭相应的资源;

      而进程守护就比较头疼了:因为无法分辨是网络延迟还是进程挂掉了,所以需要在睡眠时间和操作的及时性上找到一个平衡。

    5.详细的参考资料:

      IBM中关于ZK的详细说明,里面有api介绍,和作者根据经验模拟的场景,zk常用的方法就是create/delete/getData/setData/exsits。

      转载请注明出处:http://www.cnblogs.com/uttu/archive/2013/02/22/2922717.html

  • 相关阅读:
    strrchr
    tcpdump的源码分析
    C语言中字符串
    setsockopt、getsockopt详细介绍(转)
    linux下IPC通信
    setsockopt()用法(参数详细说明)(转)
    判断一个数是否为2的n次幂
    mysql 5.7.14 安装配置方法图文教程(转)
    JAVA中的protected(详解),以及和clone()方法有关的一些问题
    ASP.NET MVC 在控制器中接收视图表单POST过来的数据方法
  • 原文地址:https://www.cnblogs.com/uttu/p/2922717.html
Copyright © 2011-2022 走看看