2013-04-04 89 views
2

目前我使用幾個節點卡桑德拉集羣,創建自定義分區索引記錄到特定節點

方案:雖然插入,我需要確保特定行得到插入記錄到指定的節點。我可以處理這是創建一個自定義分區?或者是否有任何分區器可用於處理此類事情?

這是因爲當我的羣集中添加新節點時,如果出現溢出或數據太多,所有即將到來的插入應該在新節點中完成。所以我需要上面的場景才能工作。 Cassandra有可能嗎?

在此先感謝。

回答

0

你不想這樣做。這是一個非常糟糕的主意。

效果將會是你的新節點將被完全敲擊,而你的所有舊節點什麼都不做。您的性能將受到新節點的性能的限制。其次,除非您的複製因子是1,否則您的新行將寫入多個節點 - 這正是您想要的。

我建議閱讀datastax.com上的Cassandra文檔。

0

不好意思告訴你這個,但你的解決方案對我來說似乎是你可以對卡珊德拉做的最糟糕的事情。

但慶幸,卡桑德拉1.2推出了虛擬節點http://www.datastax.com/dev/blog/virtual-nodes-in-cassandra-1-2

這應該使集羣中插入新的節點,以減輕全球負載不錘擊新節點(請記住,新的節點有很多有點快當你提出時,除了接受寫入和讀取之外,還要做)。您只需要對令牌環的初始設置(使用Vnodes)進行智能化即可更快地插入新聞節點。

您的方法與使用手動分片MySQL服務器的公司所做的非常相似。手動分片是您嘗試使用Cassandra等系統解決的主要問題。

我見過卡桑德拉兩種情況不能夠應付負載:

  1. 你的整個集羣是在這種情況下,帶來了新的節點是唯一出路超載。在這種情況下,VNodes是你的朋友。這主要是因爲你低估了你的應用程序的負載。使集羣更大或者讓實例更大,這是您的選擇。

  2. 集羣中有一個節點正在遭受特別的攻擊:這表示您的應用正在做一些非常錯誤的事情,這是寫入一個(或很少)硬編碼密鑰的。這將使所有的讀寫操作(對於該密鑰)落在一個節點上,並將其重載直到崩潰,並且羣集的其餘部分將嘗試爲其加載(最糟糕的情況是一切都會下降,最好的情況是您會看到一個大的性能下降)。
    解決這個問題的方法是將硬編碼的密鑰分成許多子密鑰(足以確保它們會落入整個羣集,我建議生成它們的散列並檢查nodetools的位置)。
    這最後一種情況在sysops解決方案中是無法解決的,必須通過回到正在錘擊該密鑰並修復它的應用程序的代碼來解決。

順便說一句,最後一種情況就是您要實施的解決方案。一個cassandra實例和它的大小一樣好(內存大小),它們不是無敵的。 cassandra集羣在沒有單點故障(如果使用正確)的情況下如此驚人的事實是cassandra可用於處理巨大工作負載的原因。不要自己插入單點故障。

0

是的,你可以通過提供一個org.apache.cassandra.dht.IPartitioner的實現並在partitioner:字段中引用conf/cassandra.yaml中的類名。