Zookeeper

作者: Robin92 | 来源:发表于2020-04-07 21:32 被阅读0次

    Zookeeper 是一个分布式应用程序的分布式协调服务。

    提供了:配置、分组、

    分层命名空间。类似于文件系统。

    zookeeper 的数据存在内存中。

    可以作为集群使用。主从。 Leader-Follower 架构。

    客户端想连谁连谁,zookeeper 自己会将增删改数据转移到 leader 身上。zookeeper 的 leader 挂了后,可以快速恢复一个 leader(极其高可用)。官方压测 200ms 恢复。

    不要把 zookeeper 当数据库用。

    zookeeper 是一个目录树结构,它的 node 可以存数据,但少,仅1M。

    类型上有持久化节点和临时节点(两个互斥),另外还有一个序列结点(不与其他互斥)。

    client 与 node 连接后有 session 的概念,来代表与 client 的连接。依托于这个 session 有了 临时结点 的概念。这样对 client 创建锁有很好的使用。当 session 丢失时 锁 自动消亡。

    保证:

    • 顺序性。写一定经过 Leader
    • 原子性。更新要么成功要么失败,没有部分成功等中间状态。(但不是强一致性,而是最终一致性)
    • 单系统映像。看起来是单系统的,在哪里都看到一样。
    • 可靠性。有持久化。

    Redis 是通过发布订阅来作哨兵单通信的。但 Zookeeper 需要人为得写下 node。

    配置文件中 3888 位置表明在没有 leader 时,zookeeper 通过 3888 这个端口进行通信选 leader;选出 leader 后通过 2888 建立连接进行通信;前方 server.1 中的 1 表示自己的一个 ID,zk 是在谦让中选出 leader 的,ID 大者为 leader(但下面四个顺序启动时,第三个启动时已经是 leader,所以 4 会成为 follower)。
    将 id 写在 zk 的配置文件 myid 中。

    server.1=node01:2888:3888
    server.2=node02:2888:3888
    server.3=node03:2888:3888
    server.4=node04:2888:3888
    

    新起的 node 会 Getting snapshot from leader

    以创建目录的形式创建数据,就好像是 目录做为 key,上面存有值 ,目录下面还有子目录。

    zookeeper 的数据上是有 *Zxid (事务 ID)的,这个 id 是 leader 维护的,系统中的每个操作都会递交给 leader,所以所有结点的操作都在同一顺序上递增。cZxid 有 64 位,前 32 位表示纪元(首位的 0 省略),即第几个 leader(可以想象为换一个 leader 就是换一个皇帝,就换了一个年号),后 32 位表示修改操作的次数。

    cZxid = 0x200000002 // 开头的 c 表示创建,即创建的 id
    ctime = Mon Sep 16 21:22:33 CST 2020
    mZxid = 0x200000004 // 开头的 m 表示更新操作
    ctime = Mon Sep 16 21:22:33 CST 2020
    pZxid = 0x200000003 // 这个表示此节点(目录节点)下创建最后一个节点的 id 号
    ephemeralOwner = 0x0 // 临时所有者,没有临时所有者表明是持久节点(目录)
    

    (这里的节点,都表示 zookeeper 创建的目录,即 key)
    一个客户端连接进来后会自动创建一个 sessionId,在客户端中创建 create -e xxx 时,-e 表示 ephemeral 临时节点,此时 ephemeralOwner 就会显示为 sessionId,表示属于此 sessionId 的临时节点。当客户端退出后,sessionId 自动回收,此临时节点也自动回收。

    每个 client 是统一视图,即所有 client 连到 zookeeper 中都看到统一的数据,当 client_1 创建任何节点,client_2 都能看到。

    -s 可以 规避并发

    create -s /abc/xxx ""// 防并发得创建,会创建出 `/abc/xxx0000000000`,s 表示序列
    

    另一个客户端也创建 -s /abc/xxx 会创建 /abc/xxx0000000001,这是因为 leader 中会维护这个 ID 序列。


    Zookeeper.jpg

    相关文章

      网友评论

          本文标题:Zookeeper

          本文链接:https://www.haomeiwen.com/subject/watwphtx.html