Art*_*tem 11 service-discovery eventual-consistency cap-theorem apache-zookeeper
ZooKeeper总是CP(就CAP定理而言)是否正确?或者无论如何使用它作为服务发现需求的AP?
Zookeeper不是A,也不能丢P.所以它显然叫做CP.就CAP定理而言,"C"实际上意味着线性化.
线性化:如果操作B在操作A成功完成后启动,则操作B必须看到系统处于完成操作A或更新状态时的状态.
但是,Zookeeper具有顺序一致性 - 来自客户端的更新将按发送顺序应用.
事实上,ZooKeeper在客户端视图中并不是一致的. http://zookeeper.apache.org/doc/trunk/zookeeperProgrammers.html#ch_zkGuarantees
ZooKeeper不保证在每个实例中,两个不同的客户端将具有相同的ZooKeeper数据视图.由于网络延迟等因素,一个客户端可能会在另一个客户端收到更改通知之前执行更新.考虑两个客户端A和B的场景.如果客户端A将znode/a的值从0设置为1,然后告诉客户端B读取/ a,则客户端B可以读取旧值0,具体取决于哪个服务器它连接到.如果客户端A和客户端B读取相同值很重要,则客户端B应该在执行读取之前从ZooKeeper API方法调用sync()方法.
ZooKeeper提供"顺序一致性".这比线性化弱,但仍然非常强,比"最终一致性"强得多.ZooKeeper还提供了sync命令.如果您调用同步命令然后读取,则保证读取至少看到在同步开始之前完成的最后一次写入.
linearizability
,写作应该是即时的.不精确的是,一旦写入完成,所有后来的读取(其中"稍后"由挂钟开始时间定义)应该返回该写入的值或稍后写入的值.一旦读取返回特定值,所有后来的读取都应返回该值或稍后写入的值."
在Zookeeper中,他们使用sync()方法来使用我们需要线性化的东西.
Serializability
是对一个或多个对象的事务或一个或多个操作的组的保证.它保证在多个项目上执行一组事务(通常包含读取和写入操作)等同于事务的某些串行执行(总排序).
参考:
不,您不能像在其他一些系统中那样更改当前版本的 ZooKeeper 中的一致性保证。
您可以向您的客户端添加本地缓存,这将使它们在集群出现故障时拥有只读数据,但就 CAP 而言,它仍然不是 A,因为它需要可用于更新和读取。
如果 ZK 为您的服务发现需求提供了太强的一致性级别,您应该尝试研究其他选项,例如 Eureka、Consul 或 etcd。
可能相关阅读:
归档时间: |
|
查看次数: |
2767 次 |
最近记录: |