回答

2

不,您不能在当前版本的ZooKeeper中像在其他一些系统中一样更改一致性保证。

如果集群发生故障,您可以向客户端添加本地高速缓存,使其只有只读数据,但对于仍不是A的CAP而言,因为它需要可用于更新以及读取。

如果ZK提供的服务发现需求的一致性水平太高,您应该尝试研究其他选项,例如,尤里卡,领事或etcd。

可能与上写着:

1

出色的问题。

在CAP定理而言,“C”,其实就是线性化

如果操作B.操作后启动的成功完成,然后 操作B必须看到系统在相同的状态,因为它在 完成操作A或更新的状态。

由于ZooKeeper中的写入在仲裁确认后被认为已完成,因此仍旧会有旧数据的旧节点。因此,严格来说,ZooKeeper默认情况下不是CP系统,尽管它提供了相当高的一致性。您可以通过在sync命令前进行读取来确保线性化。

关于网络分区下的可用性,那些不是大多数的节点不能再处理写入请求,因为它们没有仲裁。

参见:

2

动物园管理员不是A,因此它被称为CP显然不能降P.。就CAP定理而言,“C”实际上意味着线性化。

线性化:如果操作B.操作后启动的成功完成,然后操作B必须看到系统在相同的状态,因为它是在操作的完成,或更新状态。

但是, 动物园管理员有顺序一致性 - 更新从客户端将在它们的发送顺序应用。

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还提供了一个同步命令。如果您调用同步命令,然后执行读操作,则读操作将保证至少可以看到在同步启动之前完成的最后一次写操作。

linearizability,写入应该看起来是瞬时的。不准确的是,一旦写入完成,所有后来的读取(其中“稍后”由挂钟开始时间定义)应返回该写入的值或稍后写入的值。一旦读返回一个特定的值,其随后所有的读操作将返回该值或更高的写入的价值。”

在动物园管理员,他们有同步()方法来使用,我们需要像线性化。

Serializability是关于事务或一个或多个对一个或多个对象的操作的组的保证,它保证对多个项目执行一组事务(通常包含读取和写入操作)等同于某些串行执行(总订购)

参见:

相关问题