2015-01-05 78 views
8

節點我有安裝兩臺服務器都通過遵循DataStax網站的文檔運行卡桑德拉。我的當前設置是有卡桑德拉兩次與冗餘

1種子節點(在兩個yamls配置)

在運行時,兩個節點都是向上(經由nodetool測試時),並似乎都已經正確複製的數據,但我注意到,當我關閉種子節點時,另一個節點不允許客戶端連接(既不通過它們的API,也不通過連接到cqlsh),這是一個問題。

我的要求是有兩個服務器是彼此完美的副本,如果一個服務器是臨時關閉的(例如由於磁盤空間故障),另一個服務器可以接管請求,直到破損的服務器返回線上。

鑑於這種requriement,我有以下問題:

  1. 我需要設置兩個節點作爲「種子」節點?
  2. 我怎麼會確保一切都在兩個服務器之間複製?這是自動發生還是有一些設置需要設置的地方?

提前許多感謝,

回答

16

卡桑德拉不做主從複製。卡桑德拉沒有主人。相反,數據分佈在集羣中。分配機制取決於許多事情。

的數據被存儲在分區的節點。還記得cassandra是一個分區行存儲嗎?這就是分區進來的地方。數據存儲在分區中。分區的所有行都一起存儲在單個節點(和副本)中。多少副本取決於表的複製因子。如果表的複製因子爲3,則該表的每個分區(以及此分區中的所有行)都存儲在兩個附加副本中。這就像說 - 「我想要3份這些數據」。

寫入過程中,客戶端可以指定一致性級別(CL)。這是必須承認寫入成功的節點數量。客戶也可以指定一個CL來閱讀。 Cassandra向n = CL節點發出讀取請求,並將最新值作爲查詢結果。

通過調整讀取和寫入CL,您可以控制一致性。如果讀取CL +寫入CL>複製因子(RF),則獲得完全一致性。

在容錯方面,您可以調整CL和RF來滿足您的需求。例如,如果您有RF = 3,讀取CL = 2,寫入CL = 2,則您具有完全一致性,並且您可以容忍一個節點停止運行。對於RF = 5,讀取CL = 3,寫入CL = 3,您有相同的結果,但可以容忍2個節點關閉。

雙節點集羣並不是一個好主意。您可以設置RF = 2(所有數據複製),寫入CL = 2並讀取CL = 1。但是,這意味着如果某個節點關閉,則只能讀取而不能寫入。您可以設置讀取CL = 2並寫入CL = 1,在這種情況下,如果某個節點發生故障,您可以寫入但不能讀取。實際上,你應該至少使用RF = 3的5個(至少4個)節點。任何低於這一點,你都在惹麻煩。

+0

我要補充一點,有2個節點,你可以做RF = 2,讀CL = 1和CL寫= 1;但是,這意味着您可能正在讀取陳舊的數據,直到它被複制到其他節點。如果只有一個節點處於活動狀態,它將允許您讀寫,但是您會犧牲一致性。 – ashic

+0

非常感謝您的回答。很好的解釋。最後一個問題,如果我選擇讀取/寫入CL = 1的2個節點(我知道它不好,但我的測試階段只有2臺服務器可供我使用,並且只能稍後添加更多服務器),我是否需要將兩個節點都設置爲「種子」,以便在一個節點/服務器出現故障的情況下,連接仍然有可能? – kha

+0

種子不*那*關鍵。這是你給客戶的地址,假設種子節點會穩定。客戶端將連接到種子,並獲取有關羣集其餘部分的信息。然後它將連接到羣集中的任何節點以進行事務處理。如果你不指定種子,信息可能通過八卦傳播。如果您告訴您的客戶端連接到非種子,它不應該真的爲您的兩個節點設置造成問題。如果您將兩者都標記爲種子,如果客戶端連接到一個,並且它已關閉,它將連接到另一個。我會將它們標記爲種子。 – ashic