• zookeeper简介


    zookeeper概念

    1. zookeeper是一个分布式的 开源的,分布式应用程序的协调服务,zookeeper翻译过来就是动物管理员,它用来管理Hadoop(大象),Hive(蜜蜂),pig(小猪)的管理员 简称zk

      zookeeper提供的功能主要包括:

        配置管理

        分布式锁

        集群管理

    2. zookeeper是一个树形目录服务(文件系统),每一个节点都会保存自己的数据节点信息

      节点可以分为四大类

        持久化节点

        临时节点 -e

        持久化顺序节点 -s

        临时顺序节点 -es  

    常用命令

      1.连接到zookeeper服务器

        进入到bin目录 执行  ./zkCli.sh ip:port

      2.查看节点和子节点

        ls /xxx

      3. 创建节点并存放数据

        3.1 create /app1 hello 此时创建的是持久化节点

        3.2 create -e /app1  此时创建的是临时节点 当前会话断开,节点就消失了

      4.获取数据

        get /app1  输出:hello

      5. 设置数据

        set /app1 nihao (此时 nihao会把上面的hello覆盖)

      6. 删除节点 delete /app1

    ZK分布式锁

    步骤:

      1. 客户端获取锁时,在lock节点下创建临时顺序(如果是持久化节点,获取锁的节点如果宕机了,锁就不会被释放/删除了)节点。

      2. 然后获取lock下面所有的子节点,客户端获取到所有的子节点之后,如果发现自己创建的子节点序号最小,就认为该客户端获取到了锁。使用完锁后,将该节点删除。

      3. 如果发现自己创建的节点并非lock所有子节点中最小的,说明自己还没有获取到锁,此时客户端需要找到比自己小的那个节点,同时对其注册事件监听器,监听删除事件。

      4. 如果发现比自己小的节点被删除,则客户端的watcher会收到相应的通知,此时再次判断自己创建的节点是否是lock子节点序号最小的,如果是则获取到了锁,如果不是则重复上面的步骤,继续获取比自己小的一个节点,并注册监听。

    java curator API锁的实现

    lock.acquice(3,TimeUnit.SECONDS); //获取锁 获取不到等待3s钟
    ......
    lock.release(); //用完释放锁

    参考redis分布式锁:

    https://www.cnblogs.com/ssskkk/p/10324158.html#_label2

    ZK集群

    配置集群:

    1.在每个zookeeper的data目录下创建一个myid文件,内容分别是1、2、3...这个文件就是记录每个服务器的id。

    2.在每一个zookeeper的zoo.cfg配置客户端访问端口(clientPort)和集群服务器IP列表

    leader选举机制:

    ServerId:服务器id,比如有三台服务器,编号分别是1,2,3。编号越大在选择算法中的权重越大。

    Zxid:数据ID 服务器中存放的最大数据ID,值越大说明数据越新,在算法选举中 数据越新权重越大。

      ZooKeeper节点状态改变的每一个操作都将使节点接收到一个Zxid格式的时间戳,并且这个时间戳全局有序。

      也就是说,每个对节点的改变都将产生一个唯一的Zxid。

      如果Zxid1的值小于Zxid2的值,那么Zxid1所对应的事件发生在Zxid2所对应的事件之前。

    在Leader选举中:如果某台zookeeper获得超过半数的选票,则此Zookeeper就可以成为Leader了。

    ZK集群角色

    Leader领导者:

      1.处理事物请求(增删改)

      2.集群内部各服务器的调度者

    Follower跟随者:

      1.处理客户端非事物请求(查询),转发事物请求给Leader服务器

      2.参与Leader选举投票

    Observer观察者(分担Follower压力):

      1.处理客户端非事物请求(查询),转发事物请求给Leader服务器

    zookpeer 和 redis 集群内一致性协议及选举对比

    一致性问题:分布式环境引入副本机制后,不同数据节点间可能出现的,并无法依靠计算机应用程序自身解决的数据不一致情况。

    简单的讲,数据一致性就是指在对一个副本数据进行更新的同时,必须确保也能够更新其他的副本,否则不同副本间的数据将不再一致。

    引用文章:https://www.cnblogs.com/stateis0/p/9062133.html

    zookeeper 选举和数据同步使用的都是zab算法

    redis 的哨兵在崩溃选举的时候采用的是 raft算法,但是redis在做主从数据同步的时候,用的是异步方法。

    所以redis的性能比较高,但一致性不如zookeeper

    下面简单介绍这几个算法:

    Paxos算法:

      paxos算法是Lamport宗师提出的一种基于消息传递的分布式一致性算法,使其获得2013年图灵奖。(其中决策模型是根据希腊城邦发布律法的议会模型去制定的)

      其中有两阶段提交,一阶段提交:告诉其他议员 我们要讨论某个预案。二阶段提交:将议案内容给到其他议员。

    raft协议:

      基于Paxos算法,但更容易理解与实现

      对于日志不一致的现象,Raft通过跟随者 强制复制领导者的日志来保证的。

      客户端的一条指令到达,领导者会为这条指令创建一条日志目录,并且并行发送到其他跟随者。

      在领导选举的时候,只能让安全的节点当Leader,所谓安全,就是对应节点拥有当前领导者已经提交的所有日志。

    zab协议:

      专门为zookeeper设计的一个一致性算法

    Redis ReadLock:

      基于 Redis 实现分布式锁的方式名叫 Redlock,此种方式比原先的单节点的方法更安全。

      参考:https://zhuanlan.zhihu.com/p/111354065?from_voters_page=true

    注册中心集成

    TODO

  • 相关阅读:
    Android AdapterView View的复用机制 分析
    go12---interface
    go11---方法method
    go10---struct
    go09---defer
    go8---函数function
    go7---map
    go6---slice切片
    go5--数组
    go4--break,continue + 标签
  • 原文地址:https://www.cnblogs.com/ssskkk/p/14940829.html
Copyright © 2020-2023  润新知