2017-07-16 143 views
0

我想評估分佈式鎖定的各種選項。很少有我入圍的選項是Zookeeper,MySQL和Cassandra。卡桑德拉作爲分佈式鎖

隨着卡桑德拉,我在想什麼是創建一個表,說鎖

create table if not exists app.locks (
    key text, 
    primary KEY (key) 
); 

然後作爲acquireLock過程的一部分,我如果不存在查詢象下面執行插入。 acquireLock只有插入返回true時,纔會返回進程。

INSERT INTO app.locks (key) VALUES ('KEY_1') IF NOT EXISTS; 

釋放鎖可以刪除此密鑰的數據,以便其他線程可以嘗試並獲取它。

我正在進行一些性能測試,並列出了我入圍的所有選項。結果,Zookeeper和MySQL不會顯示任何錯誤,因爲Cassandra的結果非常不一致,並且在所有測試中都顯示出幾個或更多的錯誤。大多數時間的錯誤是「卡桑德拉超時寫入查詢時一致QUORUM

問題我在這裏是,卡桑德拉的意思是分佈式鎖?如果嘗試獲取此鎖的併發線程數超過,它可以擴展嗎?

期待專家的想法。提前致謝。

+1

如果你需要分佈式的鎖看看hazelcast:http://docs.hazelcast.org/docs/latest /手動/ HTML單/#鎖 – Mandraenke

回答

0

Cassandra從CAP定理中選擇AP,這意味着可用性和分區容差通常被認爲比Cassandra中的一致性更重要。 Cassandra提供最終的一致性。

卡桑德拉不提供鎖定機制。您正在使用IF NOT EXISTS這是輕量級交易。

輕型交易(IF條款)

雖然與最終/可調一致性耐用的交易是許多使用情況比較滿意,就出現這樣的情況更需要的地方。使用線性化一致性的輕量級事務(也稱爲比較和集合)可能可以滿足這些需求。

Cassandra在提出輕量級事務的節點和集羣中所有需要的副本之間進行四次往返,以確保正確執行,從而影響性能。

Lightweight Transactions

這聽起來像一個高性價比,或許太高。這就是爲什麼卡桑德拉給你超時例外。因此,保留對這些情形的輕量級交易,他們是絕對必要的

來源: http://www.datastax.com/documentation/cassandra/2.0/cassandra/dml/dml_ltwt_transaction_c.html https://www.datastax.com/dev/blog/lightweight-transactions-in-cassandra-2-0