2011-07-21 59 views
7

我想知道如何將數據從一個cassandra集羣遷移到另一個不同大小的cassandra集羣。 。從5節點羣集到7節點羣集。如何從大小爲N的Cassandra集羣遷移數據到不同大小的集羣N +/- M

我開始看着sstable2json,因爲它爲該特定cassandra節點上的SSTable創建了一個json文件。我的想法是爲環上每個節點上的一個列族進行此操作。因此,在5節點環上,這會給我5個json文件,其中一個文件存儲在駐留在每個節點上的列族中。

然後,我會將json文件合併到一個文件中,然後使用json2sstable導入到一個新的大小的集羣中,讓我們說7個。我希望cassandra能夠在整個節點上平均複製/平衡數據在環,但我剛剛讀到,一旦寫入SSTables是不可變的。所以,如果我按照剛剛提到的方法做了,我最終會在一個節點上結合我的列族中的所有數據。

那麼任何人都可以幫助我找出將數據從一個集羣遷移到另一個不同環大小的集羣的過程嗎?

回答

9

更好:從舊環sstables使用斌/ sstableloader,流式傳輸至新的。

通常sstableloader是在一個序列中使用的是這樣的:

  1. 創建本地使用SSTableWriter
  2. 使用sstableloader到流中的sstables向右節點(BIN/sstableloader路徑到目錄中的數據sstables -full-的-sstables)。目錄名稱被假定爲密鑰空間,如果將它指向現有的Cassandra數據目錄,將會是這種情況。

既然你希望從現有集羣到一個新的雜波流B的數據,你可以直接跳到使用羣集A.每個節點上運行鍼對數據sstableloader

更多細節sstableloader在this blog post

+0

如果我直接寫入sstable,cassandra會將數據複製到其他節點上嗎?另外,如果我將來自環中所有節點的所有數據文件放到一個文件夾中,並在其上運行sstableloader,那麼不會因爲數據在原始集羣中的3個節點上覆制而導致重複數據? – Turbo

+1

是的,你會得到重複的數據。壓實會照顧到這一點,所以這不是問題。另外:不需要「將所有數據文件放到一個文件夾中」,只需在原地進行即可。 (編輯澄清。) – jbellis

+0

嘿jbellis,感謝您的信息。我認爲這是要走的路線。爲了添加更多關於我的場景的信息,我在ec2上使用hadoop來生成數據模型,並將其保存在cassandra上,也是在ec2上。然後當模型建立時,我會將cassandra數據拉到我的網絡。我將在ec2上創建一個相當大的cassandra環,以在生成模型時獲得一些可伸縮性的好處。但是我的網絡中的目標環將會變小,可能減半。所以我的計劃是將數據文件從ec2下拉到我的網絡,然後導入數據。更多下一條評論... – Turbo

-1

我敢說這並不像看起來那麼大。

  1. 創建新的環,以及爲每個節點適當地按照http://wiki.apache.org/cassandra/Operations#Token_selection
  2. 導入數據定義令牌到新的環。
  3. 環將根據令牌本身平衡您已經定義http://wiki.apache.org/cassandra/Operations#Import_.2BAC8_export
+0

有兩個問題。當你說將數據導入新環時,具體怎麼做?什麼工具?如果新戒指的尺寸與原始戒指的尺寸不同,這有什麼關係? – Turbo

+0

鏈接不起作用了。第二點是模糊和無用的 – ftrujillo

0

您不需要使用sstable2json。如果你有空間,你可以:

  1. 得到來自所有節點的sstables老環
  2. 把它們放在一起在每個新服務器上(重命名其中任何一個具有相同的名稱)
  3. 在新環中的每個節點上運行nodetool清除操作,它們將丟棄不屬於它們的數據。
+0

如果兩個戒指的尺寸不同,會不會有效?假設原始環是12個節點,新環是5個節點? – Turbo

+0

是的。但@jbellis在他的回答中提到的sstableloader腳本更好。快照當前節點,然後從每個快照目錄運行sstableloader到新的羣集。 – Zanson

0

您可以按照以下步驟操作: 1。將7個節點加入5個節點羣集,並使用自己的環形令牌設置每個節點。目前,您可能擁有一個擁有12個節點的羣集。 2.在步驟1中從新羣集中刪除5個節點。 3.在您自己移動5個節點後,爲每個節點設置令牌環。 4.修復7個節點羣集。