• zookeeper部署和应用场景之一热备


    1 zookeeper部署

    a. 下载程序包

      wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.5/zookeeper-3.4.5.tar.gz
    b. 程序结构

     zookeeper
        |---conf
          |--zoo.cfg
        |---bin
          |--zkServer.sh
          |--zkCli.sh
        |---lib
          |---zookeeper.jar     

     c. 集群配置(三台)

      编辑zoo.cfg配置文件内容如下:

    [root@DH17-ssjt-1625 conf]# vi zoo.cfg
    # The number of milliseconds of each tick
    tickTime=2000
    # The number of ticks that the initial
    # synchronization phase can take
    initLimit=10
    # The number of ticks that can pass between
    # sending a request and getting an acknowledgement
    syncLimit=5
    # the directory where the snapshot is stored.
    dataDir=/home/zookeeper/data
    # the port at which the clients will connect
    clientPort=2181

    server.1=10.2.16.25:2887:3887
    server.2=10.2.16.26:2888:3888
    server.3=10.2.50.111:2889:3889


    d. 启动

         进入zookeeper/bin目录,执行zkServer.sh & 即可启动:

    1 2014-05-21 23:02:34,088 - INFO [main:QuorumPeerConfig@90] - Reading configuration from: /home/ouyang/zookeeper-3.3.5/bin/ ../conf/zoo.cfg
    2 2014-05-21 23:02:34,104 - INFO [main:QuorumPeerConfig@310] - Defaulting to majority quorums
    3 2014-05-21 23:02:34,136 - INFO [main:QuorumPeerMain@119] - Starting quorum peer
    4 2014-05-21 23:02:34,203 - INFO [main:NIOServerCnxn$Factory@143] - binding to port 0.0.0.0/0.0.0.0:2181
    5 2014-05-21 23:02:34,240 - INFO [main:QuorumPeer@819] - tickTime set to 2000
    6 2014-05-21 23:02:34,240 - INFO [main:QuorumPeer@830] - minSessionTimeout set to -1
    7 2014-05-21 23:02:34,240 - INFO [main:QuorumPeer@841] - maxSessionTimeout set to -1
    8 2014-05-21 23:02:34,241 - INFO [main:QuorumPeer@856] - initLimit set to 10
    9 2014-05-21 23:02:34,265 - INFO [Thread-1:QuorumCnxManager$Listener@473] - My election bind port: 3888

    e、客户端命令实例操作 

    常见的命令如下:
      ①. 显示根目录下、文件: ls / 使用 ls 命令来查看当前 ZooKeeper 中所包含的内容
      ②. 显示根目录下、文件: ls2 / 查看当前节点数据并能看到更新次数等数据
      ③. 创建文件,并设置初始内容: create /zk "test" 创建一个新的 znode节点“ zk ”以及与它关联的字符串
      ④. 获取文件内容: get /zk 确认 znode 是否包含我们所创建的字符串
      ⑤. 修改文件内容: set /zk "zkbak" 对 zk 所关联的字符串进行设置
      ⑥. 删除文件: delete /zk 将刚才创建的 znode 删除
      ⑦. 退出客户端: quit
      ⑧. 帮助命令: help

         例如:set /zk first 

    "first"
    cZxid = 0x10000000b
    ctime = Wed May 21 23:13:30 CST 2014
    mZxid = 0x10000000b
    mtime = Wed May 21 23:13:30 CST 2014
    pZxid = 0x10000000b
    cversion = 0
    dataVersion = 0
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 7
    numChildren = 0


      对同一个节点同时维护多个版本,默认返回最新的版本信息,例如:set /zk second

    “second”
    cZxid = 0x10000000b
    ctime = Wed May 21 23:13:30 CST 2014
    mZxid = 0x10000000f
    mtime = Wed May 21 23:24:44 CST 2014
    pZxid = 0x10000000b
    cversion = 0
    dataVersion = 1
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 6
    numChildren = 0

    2 zookeeper应用场景之一
      假设有3个业务节点client实行热备,(多个业务节点的数据出口,其中只有一个节点处于work状态,实际进行数据输出工作,其它的节点进入备用的状态)。
    2.1 基本原理
        EPHEMERAL_SEQUENTIAL特征:
       a 一旦业务节点挂掉,其相应注册到zookeeper服务里面的所有具有EPHEMERAL_SEQUENTIAL的节点均自动消失。
       b 如果一个路径节点具有EPHEMERAL_SEQUENTIAL特征,那么所有业务节点均可以以这条路径进行注册,但返回的相应节点信息会自动编号区分。  
       例如:/locks/sub这条路径节点名,三个业务节点均以这条路径节点名进行注册,getChildren("/locks",false)返回值会有三条信息sub00000000022, sub10000000020, sub20000000021

        Watcher特征:
      a 所有业务节点,均可以异步反向监听zookeeper服务上的路径节点,监听自己想关心路径下各个节点的变化信息(例如增加、删除、修改),一旦发生变化,可以实现异步回调,完成相应的业务操作功能。

    2.2 思路
      主要利用节点列表异步监听和EPHEMERAL_SEQUENTIAL的特征:
        a. 三个业务节点分别连接zookeeper服务,创建相同路径的具有EPHEMERAL_SEQUENTIAL特征的节点
       例如:create("/locks/sub",CreateMode.EPHEMERAL_SEQUENTIAL),则分别返回sub00000000022, sub10000000020, sub20000000021值。
        b. 三个业务节点均监听“/locks”目录,则其中任意一节点挂掉消失后,各个业务节点均可以监听和返回“/locks”目录的变化信息
        c. 所有业务节点中,始终只有注册的路径编号值最小的业务节点处于真正work状态
        d. 当其中任意业务节点挂掉后,所有业务节点得到监听回调,仍然选择路径节点编号值最小的节点处于work状态
       例如:当前处于work状态的业务节点编号是sub00000000020,当其挂掉后,这个节点也会相应的消失;然后剩下来的sub10000000021和sub20000000022两个业务节点会监听到相应的变化,然后重新选择最小业务节点sub10000000021进行work。

    3 zookeeper存储模块 

     a. 操作接口
       ① 抽象类
        定义了两个接口OutputArchive和InputArchive,分别约定各个数据类型的序列化和反序列化操作,如下:

    public interface InputArchive {

        public byte readByte(String tag) throws IOException;

        public boolean readBool(String tag) throws IOException;

        public int readInt(String tag) throws IOException;

        public long readLong(String tag) throws IOException;

        public float readFloat(String tag) throws IOException;

        public double readDouble(String tag) throws IOException;

        public String readString(String tag) throws IOException;

        public byte[] readBuffer(String tag) throws IOException;

        public void readRecord(Record r, String tag) throws IOException;

        public void startRecord(String tag) throws IOException;

        public void endRecord(String tag) throws IOException;

        public Index startVector(String tag) throws IOException;

        public void endVector(String tag) throws IOException;

        public Index startMap(String tag) throws IOException;

        public void endMap(String tag) throws IOException;

    }   

    public interface OutputArchive {

        public void writeByte(byte b, String tag) throws IOException;

        public void writeBool(boolean b, String tag) throws IOException;

        public void writeInt(int i, String tag) throws IOException;

        public void writeLong(long l, String tag) throws IOException;

        public void writeFloat(float f, String tag) throws IOException;

        public void writeDouble(double d, String tag) throws IOException;

        public void writeString(String s, String tag) throws IOException;

        public void writeBuffer(byte buf[], String tag)

            throws IOException;

        public void writeRecord(Record r, String tag) throws IOException;

        public void startRecord(Record r, String tag) throws IOException;

        public void endRecord(Record r, String tag) throws IOException;

        public void startVector(List v, String tag) throws IOException;

        public void endVector(List v, String tag) throws IOException;

        public void startMap(TreeMap v, String tag) throws IOException;

        public void endMap(TreeMap v, String tag) throws IOException;

     }

      ② 实现接口

      zookeeper也实现了Binary、Xml和Csv三种格式的序列化接口,如下:


    b. 数据内容
      zookeeper持久化硬盘的数据有两种:
      ① 树形文件系统,zookeeper利用树形文件结构层次命名空间的数据模型来记录和协调同步各个节点的状态
      ② 事务记录 zookeeper频繁于类似节点信息及数据地增删改等操作,事务记录主要记录类似数据库事务信息
    c. 数据类结构如下

    ZKDatabase

      |--DataTree //数据逻辑视图(线程安全的)

        |--DataNodes 
      |-FileTxnSnapLog 
        |--TxnLog //Transactional日志
        |--SnapShot //数据快照日志

      

    参考:

      http://zookeeper.apache.org/
      http://blog.csdn.net/cutesource/article/details/5822459
      http://blog.csdn.net/pwlazy/article/details/8080626
      http://nileader.blog.51cto.com/1381108/795265
      http://nileader.blog.51cto.com/1381108/926753
      http://nileader.blog.51cto.com/1381108/795230
      http://netcome.iteye.com/blog/1474255

  • 相关阅读:
    第九周
    第八周
    第七周
    代码复审核查表
    对软件开发的理解
    第六周
    网站流量分析架构及实现
    hive的sql语句
    精简客户端搭建Oracle数据库
    idaa搭建maven发布tomcat
  • 原文地址:https://www.cnblogs.com/gisorange/p/3581515.html
Copyright © 2020-2023  润新知