2013-04-24 16 views
1

只是一個例子:我有每每個節點2個卡桑德拉節點,1Gb的數據,複製因數爲1。我使用單塔家庭用剷平夯實以100Mb的大小的SSTable,像這樣:增加的使用空間,同時重新平衡卡桑德拉簇

create column family ColFamily with key_validation_class=UTF8Type 
    and compaction_strategy=LeveledCompactionStrategy 
    and compaction_strategy_options={sstable_size_in_mb: 100}; 

我要添加額外的節點。數據將在3個節點之間重新平衡:每節點約0.667 Mb。對?

但如何使用的空間將在每個節點上,而再平衡的過程中正在取得進展而增加?什麼是高峯?

+0

您正在使用哪種卡桑德拉版本?如果1.2,你有什麼設置num_tokens? – Richard 2013-04-25 10:42:30

+0

我正在使用1.1.9 – odiszapc 2013-04-26 00:13:13

回答

3

卡桑德拉1.2和虛擬節點之前,您必須添加新節點後的數據做自己的再分配。

如果兩個節點是目前均衡即,具有各環的50%,則該令牌將是

node1: 0 
node2: 85070591730234615865843651857942052864 

(或移位,但我假設節點1具有令牌0)。節點2的令牌是2^127/2。你想結束於

node1: 0 
node2: 567137278201564105772291
node3: 113427455640312821154458202477256070484 

其中node2的標記是2^127/3,而node3是(2^127/3)* 2。你需要做的是引導節點3,並將initial_token設置爲上面的令牌。這從node1複製數據,因爲node3的令牌先於node1's(令牌環繞)。

現在,節點3將有數據的1/6,節點2仍然有1/2和節點1將存儲的1/2,但只負責三分之一。您現在可以在node1上運行'nodetool cleanup'來移除它複製到node3的數據。這會將節點1的數據減少到大約677MB。

現在您需要將node2的令牌移動到其最終位置。這會將數據從節點2複製到節點3,從而使節點3達到數據1/3的配額,大約爲667 MB。現在,您可以在node2上運行'nodetool cleanup'以刪除剛剛複製到node3的數據。現在重新平衡已經完成。

這意味着在重新平衡期間,任何節點都不會存儲超過1 GB的數據。

一般來說,如果你有更多的節點或更高的複製因子,你總是可以做再平衡,而不如果在節點上的每個舉動剛搬來後運行清理增加存儲在任何現有節點的數據。最後,如果您擁有Cassandra 1.2和虛擬節點,可以隨機選擇令牌,只要添加新節點就可以實現均勻加載,而不需要任何重新平衡(手動或自動)。這不僅更簡單,而且還可以節省數據的一小部分複製數據以添加一個節點。

2

沒有額外的空間用於添加新節點。但是,您必須在標記範圍縮小以恢復移動空間的節點上運行清理,但您可能需要首先重新平衡環(標記移動)以獲得均勻分佈。

這個過程中Datastax網站上的卡桑德拉文檔中很好的記錄,給對於一個更好,更簡潔的解釋讀比我可以給。

進一步就此,一些意見:

  • 100MB用於找平似乎有點高。事實上,只有1GB的數據幾乎可以肯定。你是否有充分的理由偏離(通常非常充分)違約?
  • RF小於3幾乎不是你想要的產品。
  • 正如Richard提到你應該看看vnodes。他們還不是默認的,但只要你運行cassandra 1.2.x,他們值得嘗試。
+0

1.我們有每節點〜1Tb的數據。 2.生產中RF = 3。我會研究vnodes的工作原理,謝謝 – odiszapc 2013-05-02 14:14:38