• ZooKeeper之初识


    它是什么

    俗称动物管理员,它使用java开发,开源,接口简单,高效,稳定的分布式系统,为其它分布式系统提供协调服务

    为什么会存在?

    开发分布式系统跟单机上做开发完全不同,碰到的问题完全不同,开发分布式系统会碰到很多棘手的问题,
    比如:多台机器间怎么保证数据一致性,需要分布式锁服务,操作数据如何保证按序处理,如何同步集群状态,如何更新集群配置等,
    为完成不同功能的分布式系统越来越多,分布式系统碰到的问题有很多共性的部分,如果每个分布式系统都自己解决和实现这些问题,会造成
    开发资源的浪费,如果有一个松散耦合易使用提供分布式锁服务和低容量数据存储高可靠高性能的分布式系统,我们可以直接使用,不用自己开发了,
    zookeeper就是一个这样的系统

    它可以做什么

    命名服务
    集群管理
    主从切换
    服务监控
    配置同步
    集群选主
    分布式锁服务
    同步队列
    FIFO队列

    准备

    1.JDK6 or greater
    2.CPU 2个,2G RAM,80G硬盘
    3.机器数: 3 (集群机器数需要符合2n+1,n为集群中可以挂掉的机器个数,至少有一半以上的机器正常,集群才会进行服务)
    4.集群配置
    server1 ip:192.168.1.15 id:0
    server2 ip:192.168.1.16 id:1
    server3 ip:192.168.17 id:2

    下载

    wget http://mirrors.hust.edu.cn/apache/zookeeper/stable/zookeeper-3.4.12.tar.gz

    解压

    [root@master src]# tar xvzf zookeeper-3.4.12.tar.gz
    

    配置

    集群中每台机器配置一样,除了data目录下myid文件不一样(存储了当前机器节点编号)

    [root@master conf]# cd zookeeper-3.4.12/conf
    [root@master conf]# cp zoo_sample.cfg zoo.cfg
    [root@master conf]# cd ..
    [root@master zookeeper-3.4.12]# mkdir data
    [root@master zookeeper-3.4.12]# cd data
    [root@master data]# pwd
    /usr/local/src/zookeeper-3.4.12/data
    [root@master data]# echo 0 > myid
    [root@master data]# ls
    myid
    [root@master data]# cat myid
    0
    [root@master data]# vim ../conf/zoo.cfg
    
    # The number of milliseconds of each tick
    tickTime=2000
    
    # 连接leader节点超时tick,超时20秒
    initLimit=10
    
    # 同步主节点数据时,允许的最大过期时间差
    syncLimit=5
    
    # 落地数据目录,保存了快照数据,tx log,myid文件也放在这个目录下
    dataDir=/usr/local/src/zookeeper-3.4.12/data
    
    # the port at which the clients will connect
    clientPort=2181
    
    # the maximum number of client connections.
    # increase this if you need to handle more clients
    #maxClientCnxns=60
    
    # Be sure to read the maintenance section of the-
    # administrator guide before turning on autopurge.
    #
    # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
    #
    # The number of snapshots to retain in dataDir
    autopurge.snapRetainCount=3
    
    # Purge task interval in hours
    # Set to "0" to disable auto purge feature
    autopurge.purgeInterval=1
    
    # quorum 机器列表
    server.0=master:2888:3888
    server.1=slave1:2888:3888
    server.2=slave2:2888:3888
    

    同步到slave1,slave2

    修改data/myid文件,值跟servers配置中序号一致

    启动

    每台机器执行

    [root@master zookeeper-3.4.12]# cd bin
    [root@master bin]# pwd
    /usr/local/src/zookeeper-3.4.12/bin
    [root@master bin]# ls
    README.txt  zkCleanup.sh  zkCli.cmd  zkCli.sh  zkEnv.cmd  zkEnv.sh  zkServer.cmd  zkServer.sh
    [root@master bin]# ./zkServer.sh start
    ZooKeeper JMX enabled by default
    Using config: /usr/local/src/zookeeper-3.4.12/bin/../conf/zoo.cfg
    Starting zookeeper ... STARTED
    [root@master bin]# jps
    1408 Jps
    1389 QuorumPeerMain
    

    查看状态

    [root@master bin]# ./zkServer.sh status
    ZooKeeper JMX enabled by default
    Using config: /usr/local/src/zookeeper-3.4.12/bin/../conf/zoo.cfg
    Mode: follower
    

    停止

    每台机器执行

    [root@slave2 bin]# ./zkServer.sh stop
    ZooKeeper JMX enabled by default
    Using config: /usr/local/src/zookeeper-3.4.12/bin/../conf/zoo.cfg
    Stopping zookeeper ... STOPPED
    

    基本操作

    打开交互环境

    [root@master bin]# ./zkCli.sh
    Connecting to localhost:2181
    

    显示帮助信息

    [zk: localhost:2181(CONNECTED) 0] help
    ZooKeeper -server host:port cmd args
            stat path [watch]
            set path data [version]
            ls path [watch]
            delquota [-n|-b] path
            ls2 path [watch]
            setAcl path acl
            setquota -n|-b val path
            history 
            redo cmdno
            printwatches on|off
            delete path [version]
            sync path
            listquota path
            rmr path
            get path [watch]
            create [-s] [-e] path data acl
            addauth scheme auth
            quit 
            getAcl path
            close 
            connect host:port
    

    显示节点

    [zk: localhost:2181(CONNECTED) 1] ls /
    [zookeeper]
    

    创建节点

    [zk: localhost:2181(CONNECTED) 3] create /zk_test 123
    Created /zk_test
    [zk: localhost:2181(CONNECTED) 4] ls /
    [zookeeper, zk_test]
    

    读取节点内容

    [zk: localhost:2181(CONNECTED) 5] get /zk_test
    123
    cZxid = 0x300000002
    ctime = Thu Sep 06 12:33:46 CST 2018
    mZxid = 0x300000002
    mtime = Thu Sep 06 12:33:46 CST 2018
    pZxid = 0x300000002
    cversion = 0
    dataVersion = 0
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 3
    numChildren = 0
    

    更改节点内容

    [zk: localhost:2181(CONNECTED) 6] set /zk_test 456
    cZxid = 0x300000002
    ctime = Thu Sep 06 12:33:46 CST 2018
    mZxid = 0x300000003
    mtime = Thu Sep 06 12:35:13 CST 2018
    pZxid = 0x300000002
    cversion = 0
    dataVersion = 1
    aclVersion = 0
    ephemeralOwner = 0x0
    dataLength = 3
    numChildren = 0
    

    删除节点

    [zk: localhost:2181(CONNECTED) 8] delete /zk_test
    [zk: localhost:2181(CONNECTED) 9] ls /
    [zookeeper]
    

    启动/恢复流程

    主挂掉了或者刚开始启动,会通过paxos算法进行选主。选主完成后,learner节点需要从leader节点同步状态信息,一半以上learner节点同步完成后,集群可以开始对外服务了。

    节点角色

    包含leader,follower,observer。

    leader,领导者,负责处理客户端请求,负责写请求投票发起,一半以上follower都同意时,写请求会被接受,写消息原子广播给follower和observer节点,
    保证任意时刻所有节点状态信息都是同步的

    follower:处理客户端请求,写请求转发给leader处理,发起选主投票

    observer:只处理客户端请求,不参与投票和发起

    数据模型

    树状结构,由一系列的节点组成,节点之间有层次关系,节点有自己的属性,节点可以存储自己的数据,节点可以设置自己相关的访问权限

    例如

    /node1/node1_1
    	  /node1_2
    			  /node_1_2_1
    /node2/node2_1
    	  /mode2_2
    

    节点类型

    PERSISTENT
    持久节点

    PERSISTENT_SEQUENTIAL
    持久顺序节点

    EPHEMERAL
    临时节点,客户端断开连接,节点自动删除

    EPHEMERAL_SEQUENTIAL
    临时顺序节点

    节点权限

    ACL: Access Control List

    用一个三元组定义客户端的访问权限
    (scheme:expression, perms)

    scheme

    模式 描述
    World 它下面只有一个id, 叫anyone, world:anyone代表任何人, zookeeper中对所有人有权限的结点就是属于world:anyone的
    Auth 已经被认证的用户(可以用过用户名:密码的方式,kerberos)
    Digest 通过username: password字符串的MD5编码认证用户
    Host 匹配主机名后缀,如, host:corp.com匹配host:host1.corp.com, host:host2.corp.com,但不能匹配host:host1.store.com
    IP 通过IP识别用户,表达式格式为 addr/bits

    perms

    权限 描述 备注
    CREATE 有创建子节点的权限 --
    READ 有读取节点数据和子节点列表的权限 --
    WRITE 有修改节点数据的权限 无创建和删除子节点的权限
    DELETE 有删除子节点的权限 --
    ADMIN 有设置节点权限的权限 --

    节点监控

    客户端监控节点的状态变化,zk通过事件通知客户端,这是非常重要的一个功能,zk支持的功能很多依赖这个实现。事件触发后,监控不再生效,
    需要客户端主动重新设置监控才会生效,这里网络抖动会有问题,事件已触发,但客户端没有接收到通知,客户端需要容错机制处理。
    通知的类型有,节点数据变化,节点删除,子节点列表变化。

    应用场景

    命名服务

    创建持久顺序节点,保证每个节点名是唯一的,取节点名作为主机名

    配置管理

    创建一个节点存储配置数据,系统其它服务节点监控这个节点的数据变化。当配置有更改时,zk会通知到系统服务节点,服务节点从zk拉取数据,更新自己的配置。

    服务可用监控

    创建一个节点,每个服务此节点下创建一个临时节点,流量分发器监控这个父节点子节点的变化,当有个服务节点挂掉时,会触发子节点变化事件,zk通知流量分发器,
    分发器接到通知,踢掉不可用的节点,不再分配流量。

    选主服务

    每个节点创建一个临时顺序节点,可以制定一个选主策略,比如优先选择顺序号最小的那个作为主,如果主挂了,对应的临时顺序节点也消失了,肯定不会选到有问题的节点作为主。

    主从切换

    主从节点分别创建临时节点,从节点监控主zk上的节点是否存在的事件,当接收到这个事件通知时,自动切换到主的状态。

    分布式锁服务

    假如存在/locks节点,客户端在/locks节点下创建临时顺序子节点,获取/locks下的所有子节点,当最小的那个等于自己时,获得锁,使用完,释放锁,删除临时子节点。
    当子节点列表中最小的不是自己时,监控比自己小的节点,然后等待。当收到监控的小的节点删除通知时,重复第一步的操作,知道获得锁为止。

    同步队列

    原理跟前面的差不多

    FIFO队列

    需要借助临时顺序节点,其它跟前面的差不多

    参考资料

    【0】八斗学院内部zookeeper ppt学习资料

    【1】微信PaxosStore:深入浅出Paxos算法协议
    http://www.infoq.com/cn/articles/wechat-paxosstore-paxos-algorithm-protocol

    【2】Zookeeper的功能以及工作原理
    https://www.cnblogs.com/felixzh/p/5869212.html

    【3】ZooKeeper官方文档
    http://zookeeper.apache.org/doc/current/index.html
    【4】ZooKeeper学习第一期---Zookeeper简单介绍
    https://www.cnblogs.com/wuxl360/p/5817471.html
    【5】ZooKeeper-about云开发
    http://www.aboutyun.com/forum-149-1.html

  • 相关阅读:
    Three.js入门和搭建HelloWorld
    CentOS中使用Docker来部署Tomcat
    CentOS中使用Docker来部署Nginx
    Windows中通过bat定时执行命令和mysqldump实现数据库备份
    Geoserver在Linux上的安装(图文教程)
    Linux上怎样停止服务(jar包)、查看进程路径、关闭指定端口
    Java中怎样监测局域网内ip是否互通,类似ping
    Android和JS之间互相调用方法并传递参数
    Android中使用WebView加载本地html并支持运行JS代码和支持缩放
    ARC072C
  • 原文地址:https://www.cnblogs.com/wadeyu/p/9600321.html
Copyright © 2020-2023  润新知