zoukankan      html  css  js  c++  java
  • Zookeeper

    一、相关概念

    • 分布式系统:是一个硬件或软件组件分布在网络中的不同的计算机上,彼此间仅通过消息传递进行通信和协作的系统。
    • 特征:分布性、并发性、缺乏全局时钟、故障必然会发生
    • 典型问题:通信异常、网络分区、三态(成功、失败、超时)、节点故障

    CAP:

    • P:分区容错性;
      • CP:一致性;
      • AP:可用性

    BASE:

    • BA:基本可用
    • S:软状态
    • E:最终一致性

    保证分布式系统的一致性多种协议:

    • 2PC:2 Phase-Commit,请求和执行
    • 3PC:3 Phase-Commit,CanCommit->PreCommit->DoCommit
    • Paxos:Leslie Lamport,1990年提出
    • Google Chubby:分布式锁服务,GFS/BigTable都用到了chubby,分布式协作、元数据存储、Master选举

    HDFS/HBase, Zookeeper:

    • zookeeper是一个开源的分布式协调服务,由知名互联网公司Yahoo创建,它是Chubby的开源实现;换句话将,zk是一个经典的分布式数据一致性解决方案,分布式应用程序可以基于它实现数据的发布/订阅、负载均衡、名称服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列

    二、zk中的基本术语

    • 集群角色:Leader, Follower, Oberserver
      • Leader:选举产生,提供读/写服务;
      • Follower:参与选举,可被选举,提供读服务;
      • Observer:参与选举,不可被选举,提供读服务
    • 会话:zk中,客户端<-->服务端,tcp长连接
    • 数据节点(ZNode):即zk数据模型中的数据单元;zk的数据都存储于内存中,数据模型为树状结构(ZNode Tree);每个ZNode都会保存自己的数据于内存中;
      • 持久节点:仅显式删除才消失
      • 临时节点:会话中止即自动消失
    • 版本(version):zk会为每个ZNode维护一个称为Stat的数据结构,记录了当前ZNode的三个数据版本
      • version:当前版本
      • cversion:当前ZNode的子节点的版本
      • aversion:当前ZNode的ACL的版本
    • ACL:zk使用ACL机制进行权限控制
      • CREATE , READ , WRITE, ADMIN
    • 事件监听器(Watcher):zk上由用户指定的触发机制,在某些事件产生时,zk能够将其通知给相关的客户端
    • ZAB协议:Zookeeper Atomic Boradcast, zk原子广播协议;用于在支持Leader奔溃恢复机制,重新选举Leader,而且还确保数据的完整性和一致性
      • ZAB协议中存在三种状态:
        • Looking
        • Following
        • Leading
      • 四个阶段:
        • 选举:election
        • 发现:discovery
        • 同步:sync
        • 广播:broadcast

    三、部署zookeeper

    三种部署方式:单机模式、伪分布式模式、分布式模式

    安装jdk

    # yum install java-1.7.0-openjdk-devel -y
    # vim /etc/profile.d/java.sh
    export JAVA_HOME=/usr
    # . /etc/profile.d/java.sh
    # java -version
    

    1、单机模式

    ~]# wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz
    ~]# mkdir /data/zookeeper/ -pv
    ~]# tar xf zookeeper-3.4.9.tar.gz -C /usr/local/
    ~]# cd /usr/local/
    local]# ln -sv zookeeper-3.4.9 zookeeper
    local]# cd zookeeper/conf/
    conf]# cp zoo_sample.cfg zoo.cfg
    conf]# vim zoo.cfg
    tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=/data/zookeeper
    clientPort=2181
    #maxClientCnxns=60
    server.1=192.168.0.17:2888:3888
    #autopurge.snapRetainCount=3
    #autopurge.purgeInterval=1
    conf]# cd ../bin/
    bin]# ./zkServer.sh start
    
    • 四字命令:监控zk
    ~]# telnet localhost 2181
    ruok
    stat
    srvr
    conf
    cons
    wchs
    envi
    ...
    
    • cli命令
    ~]# cd /usr/local/zookeeper/bin/
    bin]# ./zkCli.sh
    create
    ls
    ls2
    stat
    delete
    rmr
    get
    set
    ...
    
    • 配置参数
    基本配置参数:
    clinetPort=2181
    dataDir=/data/zookeeper
    dataLogDir:事务日志文件路径;
    tickTime
    存储配置参数:
    preAllocSize:为事务日志预先分配的磁盘空间量,默认65535KB
    snapCount:每多少次事务后执行一次快照操作,每事务的平均大小在100字节左右
    autopurge.snpRetainCount:保留自动快照数
    autopurge.purgeInterval:自动purge操作的时间间隔,0表示不启动
    fsync.warningthiresholdms:zk进行事务日志的fsync操作时消耗的时长报警阈值
    weight.X=N:判断quorum时投票权重,默认为1
    网络配置参数:
    maxClientCnxns:每客户端IP的最大并发连接数
    clientPortAddress:zk监听的IP地址
    minSessionTimeout:会话的最短超时时长
    maxSessionTimeout:会话的最大超时时长
    集群配置参数:
    initLimit:Follower连入Leader并完成数据同步的时长
    syncLimit:心跳检测的最大延迟
    leaderServers:默认zk的leader接受读写请求,额外还要负责协调各Follower发来的事务等,因此,为使得Leader集中处理zk集群内部信息,建议不让Leader直接提供服务
    cnxTimeout:Leader选举期间,各服务器创建TCP连接的超时时长
    ellectionAlg:选举算法,目前仅支持FastLeaderElection算法一种
    server.id=[hostname]:port:port[:observer]:集群内各服务器的属性参数
    	第一个port:follwer与leader进行通信和数据同步时所使用的端口
    	第二个port:leader选举时使用的端口
    	observer:定义指定的服务器为observer
    

    2、分布式模式

    • zk1:
    ###############node01:###############
    ~]# echo 1 > /data/zookeeper/myid
    ~]# vim /usr/local/zookeeper/conf/zoo.cfg
    tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=/data/zookeeper
    clientPort=2181
    server.1=192.168.0.17:2888:3888
    server.2=192.168.0.18:2888:3888
    server.3=192.168.0.19:2888:3888
    ~]# /usr/local/zookeeper/bin/zkServer.sh start
    
    • zk2:
    ###############node02:###############
    ~]# echo 2 > /data/zookeeper/myid
    ~]# vim /usr/local/zookeeper/conf/zoo.cfg
    tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=/data/zookeeper
    clientPort=2181
    server.1=192.168.0.17:2888:3888
    server.2=192.168.0.18:2888:3888
    server.3=192.168.0.19:2888:3888
    ~]# /usr/local/zookeeper/bin/zkServer.sh start
    
    • zk3:
    ###############node03:###############
    ~]# echo 3 > /data/zookeeper/myid
    ~]# vim /usr/local/zookeeper/conf/zoo.cfg
    tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=/data/zookeeper
    clientPort=2181
    server.1=192.168.0.17:2888:3888
    server.2=192.168.0.18:2888:3888
    server.3=192.168.0.19:2888:3888
    ~]# /usr/local/zookeeper/bin/zkServer.sh start
    

    注意:运行为集群模式时,每个节点在其数据目录中应该有一个myid文件,其内容仅为server的id

    四、典型应用场景

    • 数据发布/订阅
    • 负载均衡
    • 命名服务
    • 分布式协调/通知
    • 集群管理
    • Master选举
  • 相关阅读:
    ThinkPHP模版引擎之变量输出具体解释
    Heat-AutoScaling
    開始搭建第一个zookeeper
    OpenCV学习笔记(六十二)——《OpenCV Computer Version with Python》阅读摘要
    Oracle可插拔数据库的jdbc连接串写法
    MVVM设计模式基础知识--ICommand接口
    CodeForces
    一见钟情Sublime
    # 从零開始搭建Hadoop2.7.1的分布式集群
    C语言遍历文件和文件夹——————【Badboy】
  • 原文地址:https://www.cnblogs.com/L-dongf/p/10264832.html
Copyright © 2011-2022 走看看