• zookeeper如何保证单一系统镜像


    官方文档描述

    文档地址https://zookeeper.apache.org/doc/current/zookeeperOver.html

    ZooKeeper 非常快速且非常简单。但是,由于它的目标是成为构建更复杂服务(例如同步)的基础,因此它提供了一组保证。这些是:

    • 顺序一致性——来自客户端的更新将按照它们发送的顺序应用。
    • 原子性——更新要么成功要么失败。没有部分结果。
    • 单一系统映像——无论连接到哪个服务器,客户端都将看到相同的服务视图。即,即使客户端故障转移到具有相同会话的不同服务器,客户端也永远不会看到系统的旧视图。
    • 可靠性——应用更新后,它将一直持续到客户端覆盖更新为止。
    • 及时性——系统的客户视图保证在特定时间范围内是最新的。

    英文单一系统映像描述

    Single System Image - A client will see the same view of the service regardless of the server that it connects to. i.e., a client will never see an older view of the system even if the client fails over to a different server with the same session.

    思考

    很多人会认为这句话的含义是:

    1. 当客户端A将资源R的值进行了修改,R1->R2->R3的情况下,客户端B只要请求是在A客户端收到R值修改成功的响应后到达的ZooKeeper服务器,那么客户端B看到的R值必然是R3.

    我的疑惑是

    假如有5个节点的集群,leader+4个follower。 leader写入数据为R1->R2->R3,因为ZAB协议并不是强一致性,follower1、follower2的数据为R1->R2->R3(保证写入成功),但是follower3是R1->R2,follower4是R1.此时客户端和follower3有连接,读取到的数据为R2;

    1. 但写入方认为R3已经写入成功,这不就是最终一致了。
    2. 客户端和follower3因网络原因断开连接,连接到了follower4会不会读到R1。如果读到,就违反了顺序一致性

    针对这两个问题查了下资料

    问题1: 一致性问题

    zk保证的是
    及时性——系统的客户视图保证在特定时间范围内是最新的。
    时间范围可以通过配置修改:syncLimit tickTime 来实现

    问题3:顺序性

    zk保证的是,如何客户端读取到R2,就可能读取到R2之前的值;实现方式是: 客户端保留了一个 zxid,如果它从较新的服务器读取了一些数据,它将不会连接到较旧的 follower

    看官方文档的另一个收获是

    3.6.0 中的新增功能:客户端还可以在 znode 上设置永久的递归监​​视,这些监视在触发时不会被删除,并且会递归地触发已注册 znode 以及任何子 znode 上的更改。

    New in 3.6.0: Clients can also set permanent, recursive watches on a znode that are not removed when triggered and that trigger for changes on the registered znode as well as any children znodes recursively.

    可以不用触发一次,添加一次监听了

  • 相关阅读:
    SpringBoot SpringBoot 开发实用篇 5 整合第三方技术 5.2 Spring 缓存使用方式
    feign 全局 与 局部拦截器的区分与使用
    3、用手机模拟器上的Autojs连接电脑vscode
    机器人学优质资源
    new Socket(host, port)阻塞解决
    docker定期清理无用镜像
    从意义中恢复,而不是从数据包中恢复
    【Leetcode】383. 赎金信
    回归和拟合有什么不同-(非)参数检验-假设检验
    数据库(mysql)之用户管理
  • 原文地址:https://blog.csdn.net/qq_23934475/article/details/127886547