Backup

Cassandra 快照恢復:隨機失去數據

  • January 30, 2018

我很難在 Apache Cassandra(版本 3.0.9)上恢復快照。據我所知,我正在遵循 datastax 部落格上描述的程序以及其他幾個程序(例如:http ://datascale.io/cloning-cassandra-clusters-fast-way/ )。然而我可能會失去一些東西,每次我進行恢復時,數據都會失去。

設置: 6 個節點集群(1 個 DC,3 個機架,每個機架 2 個節點),複製因子設置為 3。機器託管在 AWS 上。

備份程序(在每個節點上):

  1. nodetool snapshot mykeyspace
  2. cqlsh -e 'DESCRIBE KEYSPACE mykeyspace' > /tmp/mykeyspace.cql
  3. nodetool ring | grep "$(ifconfig | awk '/inet /{print $2}' | head -1)" | awk '{print $NF ","}' | xargs > /tmp/tokens

我得到了 nodetool 快照命令生成的文件,並在 S3 上將它們與令牌和 cql 一起備份。

恢復過程(對於每個節點,除非指定):

(創建新虛擬機後)

  1. 下載快照、令牌和密鑰空間
  2. 停止服務卡桑德拉
  3. 刪除/var/lib/cassandra/commitlog/*/var/lib/cassandra/system/
  4. 將令牌插入cassandra.yaml
  5. 啟動服務卡桑德拉
  6. mykeyspace.cql僅從一個節點上恢復 mykeyspace
  7. 等待複製並停止服務 cassandra
  8. 刪除.db文件夾中的文件/var/lib/cassandra/data/mykeyspace/
  9. 對於每個表,將快照文件 ( .db, .crc32, .txt) 複製到/var/lib/cassandra/data/mykeyspace/$table/
  10. 重啟服務cassandra
  11. 執行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>在每個節點上一個一個地執行。

引用自:https://serverfault.com/questions/810968