2013-05-14 23 views
5

我是Cassandra的新手 - 我一直在單個節點上搜索與Cassandra中的提交和崩潰恢復相關的信息。並希望有人能夠澄清細節。Cassandra在單個節點上提交和恢復

我正在測試Cassandra - 因此,將它設置在單個節點上。我在datastax上使用stresstool來插入數百萬行。如果出現電氣故障或系統關機,會發生什麼情況? Cassandra的內存中的所有數據會在Cassandra重新啓動時寫入磁盤嗎(我認爲commitlog充當中介)?這個過程有多長時間?

謝謝!

回答

11

Cassandra的提交日誌提供Cassandra持久寫入。當您寫入Cassandra時,寫入被確認給客戶端之前,將寫入提交日誌。這意味着每次寫入客戶端收到成功的響應都會保證寫入提交日誌。寫入也會寫入當前memtable,當足夠大時,它最終將作爲SSTable寫入磁盤。寫完後可能會很長時間。

但是,出於性能原因,提交日誌不會立即同步到磁盤。缺省值是週期性模式(由cassandra.yaml中的commitlog_sync參數設置),週期爲10秒(由cassandra.yaml中的commitlog_sync_period_in_ms設置)。這意味着提交日誌每10秒同步到磁盤。有了這種行爲,如果服務器斷電,可能會丟失高達10秒的寫入次數。如果您的羣集中有多個節點,並且複製因子大於1,則需要在10秒內失去多個節點的電源才能丟失任何數據。

如果此風險窗口不可接受,則可以對提交日誌使用批處理模式。在提交日誌同步到磁盤之前,此模式不會確認寫入客戶端。時間窗口由commitlog_sync_batch_window_in_ms設置,默認值爲50 ms。這會顯着增加寫入延遲,並且可能會降低吞吐量,因此只有在丟失一些已確認寫入的成本很高時才使用它。使用此模式時,將提交日誌存儲在單獨的驅動器中尤其重要。

如果您的服務器斷電,Cassandra會在啓動時重播提交日誌以重建其memtable。在非常重的服務器上這個過程需要幾秒鐘(可能幾分鐘)。

如果要確保將memtables中的數據寫入磁盤,您可以運行'nodetool flush'(此操作對每個節點)。這將創建一個新的SSTable,並刪除引用memtables中的數據的提交日誌。

+3

謝謝你提供詳細而且寫得很好的解釋 - 現在更清晰了。我希望這能幫助像我這樣的其他新手。 – user1680784 2013-05-17 17:55:26

+0

它看起來像你可能有'批'和'定期'倒退...定期是默認的,使確認等待你將切換到批處理,是嗎? – 2015-03-31 19:41:36

+0

@Richard我正面臨這個問題。 Cassandra提交日誌已損壞。有什麼建議麼?我在這裏發佈了一個問題:http://stackoverflow.com/questions/33304367/cassandra-exiting-due-to-error-while-processing-commit-log-during-initializatio – Dojo 2015-10-23 15:05:24

0

你問像

  1. 如果在使用SQL * Loader在甲骨文正在加載的時間數據的網絡出現故障,會發生什麼?
  2. 或者Sqoop在傳輸數據時由於某種情況而停止處理?

無論在電氣故障或系統關閉前傳輸的數據是什麼,它都將保持不變。回到第二個問題,當memtable的空間用完時,即當鍵的數量超過某個限制(128是默認值)或達到持續時間(集羣時鐘)時,它將被存儲到sstable中,不可變的空間。

+0

第二部分幫助 - 謝謝! – user1680784 2013-05-17 17:56:43