回答

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是關於事務或一個或多個對一個或多個對象的操作的組的保證,它保證對多個項目執行一組事務(通常包含讀取和寫入操作)等同於某些串行執行(總訂購)

參見:

相關問題