2012-06-21 19 views
2

我有兩個數據中心,每一個都帶有3.卡桑德拉 - 寫與多個數據中心

將與CL.ALL塊寫入直到數據被存儲在兩個的DC(6個節點,複製因子或CL.ALL 3 + 1)? 我會假設,它會阻止,直到本地DC中的所有3個副本都已確認寫入成功爲止。

我想有像CL.ALL_LOCAL,存儲在單個DC所有副本的數據,這樣我就可以CL.ONE閱讀。我們的想法是,該寫塊,直到單DC所有副本一直堅持數據,而下面的內容將有很高的概率讀取新的數據

+0

複製可以直流基礎上進行配置,但不是機架基礎上。你有2個dcs,每個有3個副本?或1個dc,在該數據中心有2個3節點機架和6個副本(每個機架有效3個副本)?或者其他一些配置? – nickmbailey

+0

對 - 我已更正我的問題 –

回答

0

我檢查卡桑德拉1.1的代碼,並與多DC部署CL.ALL書寫時發現有趣的現象。 也許我的解釋代碼錯了 ....無論如何:

一開始他們正在收集發送行突變的IP地址 - 這與客戶端提供的一致性級別無關。在1.0中,它們都是來自所有DC的節點,從1.1開始,它們從本地DC獲得所有節點,並從每個遠程DC獲得一個節點(其餘節點在消息中「轉發」)。每個突變將由單獨的線程發送,因此請求可以並行運行。通過消息傳遞服務將每個這樣的突變處理爲消息。當遠程DC中的節點接收到消息時,它將其轉發到其餘節點,這些節點以「前進到」的方式提供。

由客戶端提供的一致性水平,定義了必須承認接收到的消息的節點的數目。在CL.ALL的情況下,這個數字由複製因子決定 - 現在變得越來越有趣了:因爲我們已經向本地DC的所有節點發送消息,並且向遠程DC的節點發送消息,我們也會從這些刪除節點也得到確認 - 是的這仍然是由複製因子定義的數字,但根據不工作延遲,我們無法確定哪些節點符合收到的消息 - 可以從本地和遠程DC的節點混合使用,但也可能只是來自本地DC的節點。在最壞的情況下,可能會發生這樣的情況:本地節點都沒有收到該消息,並且確認來自遠程DC(如果有多個)。這意味着 - 使用CL.ALL書寫的不受理,您可以立即從本地DC讀取消息。在卡桑德拉

+0

CL.ALL將會阻止,直到字面上*全部*副本響應。這意味着本地數據中心中的所有節點*和*遠程數據中心中的所有節點。在使用CL.ALL編寫代碼時,如果寫入返回成功狀態,則可以保證隨處可見。 – nickmbailey

+0

來自副本的期望響應的數量正在通過WriteResponseHandler#determineBlockFor進行計算。 WriteResponseHandler是一個抽象類,由工廠方法創建:AbstractReplicationStrategy#getWriteResponseHandler - 在EACH_QUORUM工廠的情況下產生:DatacenterSyncWriteResponseHandler,但CL.ALL它返回:WriteResponseHandler,是不是DC知道。在我看來,CL.ALL只等待xx響應,其中xx是複製因子。或者也許我錯過了一些東西...... –

+1

沒錯。但是,在使用NetworkTopologyStrategy時,getReplicationFactor()會在所有數據中心中返回* total *複製因子。它通過每個配置的數據中心並將來自該dc的RF添加到總數並返回。因此,所有的數據中心都會阻止每個副本的響應。 – nickmbailey