Cassandra 快照恢復:隨機失去數據
我很難在 Apache Cassandra(版本 3.0.9)上恢復快照。據我所知,我正在遵循 datastax 部落格上描述的程序以及其他幾個程序(例如:http ://datascale.io/cloning-cassandra-clusters-fast-way/ )。然而我可能會失去一些東西,每次我進行恢復時,數據都會失去。
設置: 6 個節點集群(1 個 DC,3 個機架,每個機架 2 個節點),複製因子設置為 3。機器託管在 AWS 上。
備份程序(在每個節點上):
nodetool snapshot mykeyspace
cqlsh -e 'DESCRIBE KEYSPACE mykeyspace' > /tmp/mykeyspace.cql
nodetool ring | grep "$(ifconfig | awk '/inet /{print $2}' | head -1)" | awk '{print $NF ","}' | xargs > /tmp/tokens
我得到了 nodetool 快照命令生成的文件,並在 S3 上將它們與令牌和 cql 一起備份。
恢復過程(對於每個節點,除非指定):
(創建新虛擬機後)
- 下載快照、令牌和密鑰空間
- 停止服務卡桑德拉
- 刪除
/var/lib/cassandra/commitlog/*
和/var/lib/cassandra/system/
- 將令牌插入
cassandra.yaml
- 啟動服務卡桑德拉
mykeyspace.cql
僅從一個節點上恢復 mykeyspace- 等待複製並停止服務 cassandra
- 刪除
.db
文件夾中的文件/var/lib/cassandra/data/mykeyspace/
- 對於每個表,將快照文件 (
.db
,.crc32
,.txt
) 複製到/var/lib/cassandra/data/mykeyspace/$table/
- 重啟服務cassandra
- 執行
nodetool repair mykeyspace -full
,一次一個節點結果 :
總是有缺失的行,每個表的數量大致相同,但絕不是相同的。我試圖“混淆”一些過程,比如在令牌之前恢復密鑰空間,
nodetool refresh
在修復之前執行,但我每次都遇到同樣的問題。由於我距離“良好”恢復不遠,我認為我遺漏了一些非常明顯的東西。分析日誌並沒有真正幫助,因為它們沒有顯示任何錯誤/失敗消息。
歡迎任何幫助:) 如果需要,我當然可以提供更多資訊。
編輯:沒有人?我用 cassandra 版本(3.0.9)更新了這個問題,我一開始就忘記了。我再次嘗試恢復,但沒有運氣。我真的沒有更多的想法:(
好吧,故事結束,愚蠢的我!
initial_token
在我的恢復過程中,cassandra.yaml 中的行被錯誤地“植入”了。如果 ‘:’ 後沒有空格initial_token
,則 cassandra 無法啟動。因此,該行一直被註釋並且標記不被解釋!tldr:
initial_token:<values>
= 錯誤initial_token: <values>
= 好非常感謝 Josh Purvis 堅持這個參數的重要性:-)
該
sed
部落格文章中的命令應該附加-Dcassandra.load_ring_state=false
到$JVM_OPTS
,在其目前形式下無效。如果您直接從部落格文章中複製該命令,則可能是問題所在。你可以試試這個,而不是把它放在文件的底部:
sudo sed -i '$ a\JVM_OPTS="$JVM_OPTS -Dcassandra.load_ring_state=false"' /etc/cassandra/cassandra-env.sh
此外,在執行此過程之後,您還需要
nodetool repair -pr <ks>
在每個節點上一個一個地執行。