2016-07-07 118 views
6

我在24個節點集羣中運行Cassandra 3.7,每個節點有3個數據中心和256個vnodes,每個節點使用cron作業每天運行一次「nodetool repair -pr」與其他節點不同的一小時。同時修復導致修復掛起

有時修理需要一個多小時才能完成並且修理重疊。發生這種情況時,修復開始出現異常,並可能處於不良狀態。這會導致級聯故障,其中每個小時另一個節點將嘗試啓動修復,並且它也會掛起。

從此恢復很困難。我發現的唯一方法是不僅重新啓動停滯不前的節點,而且還重新啓動集羣中的所有節點。

我唯一的想法就是建立某種服務,檢查是否有任何其他節點在開始修復之前正在運行修復,可能是在修復過程中發佈在Cassandra表中。

我不知道如果集羣變得更大,我將如何修復所有節點,因爲那裏很快就沒有足夠的時間在一天中的所有節點上運行修復。

所以我的主要問題是,我運行修復不正確以及建議如何定期修復大型集羣的所有節點?

有沒有辦法一次修復多個節點?該文件暗示存在,但不清楚如何做到這一點。一次在多個節點上運行修復會導致崩潰和燒傷,這是否正常?有沒有比重新啓動所有節點更簡單的方法來終止卡住的維修?

有些事情我想:

  1. 運行「nodetool修」,而不-PR,但如果同時對 多個節點上運行,這也掛起。
  2. 正在運行「nodetool repair -dcpar」 - 這個 似乎修復了它在所有數據中心上運行的節點所擁有的令牌範圍,但是如果一次在多個節點上運行,它也會掛起。

我的keyspace每個數據中心只保留一個副本,所以我不認爲我可以使用-local選項。

一些我看的時候修復掛起是例外的:

ERROR [ValidationExecutor:4] 2016-07-07 12:00:31,938 CassandraDaemon.java (line 227) Exception in thread Thread[ValidationExecutor:4,1,main] 
java.lang.NullPointerException: null 
     at org.apache.cassandra.service.ActiveRepairService$ParentRepairSession.getActiveSSTables(ActiveRepairService.java:495) ~[main/:na] 
     at org.apache.cassandra.service.ActiveRepairService$ParentRepairSession.access$300(ActiveRepairService.java:451) ~[main/:na] 
     at org.apache.cassandra.service.ActiveRepairService.currentlyRepairing(ActiveRepairService.java:338) ~[main/:na] 
     at org.apache.cassandra.db.compaction.CompactionManager.getSSTablesToValidate(CompactionManager.java:1320) ~[main/:na] 

ERROR [Repair#6:1] 2016-07-07 12:00:35,221 CassandraDaemon.java (line 227) Exception in thread Thread[Repair#6:1,5,RMI Runtime] 
com.google.common.util.concurrent.UncheckedExecutionException: org.apache.cassandra.exceptions.RepairException: [repair #67bd9b10-... 
]]] Validation failed in /198.18.87.51 
     at com.google.common.util.concurrent.Futures.wrapAndThrowUnchecked(Futures.java:1525) ~[guava-18.0.jar:na] 
     at com.google.common.util.concurrent.Futures.getUnchecked(Futures.java:1511) ~[guava-18.0.jar:na] 
     at org.apache.cassandra.repair.RepairJob.run(RepairJob.java:160) ~[main/:na] 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.8.0_71] 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[na:1.8.0_71] 
     at java.lang.Thread.run(Thread.java:745) ~[na:1.8.0_71] 
Caused by: org.apache.cassandra.exceptions.RepairException: [repair #67bd9b10... 
]]] Validation failed in /198.18.87.51 
     at org.apache.cassandra.repair.ValidationTask.treesReceived(ValidationTask.java:68) ~[main/:na] 
     at org.apache.cassandra.repair.RepairSession.validationComplete(RepairSession.java:183) ~[main/:na] 
     at org.apache.cassandra.service.ActiveRepairService.handleMessage(ActiveRepairService.java:439) ~[main/:na] 
     at org.apache.cassandra.repair.RepairMessageVerbHandler.doVerb(RepairMessageVerbHandler.java:169) ~[main/:na] 

ERROR [ValidationExecutor:3] 2016-07-07 12:42:01,298 CassandraDaemon.java (line 227) Exception in thread Thread[ValidationExecutor:3,1,main] 
java.lang.RuntimeException: Cannot start multiple repair sessions over the same sstables 
     at org.apache.cassandra.db.compaction.CompactionManager.getSSTablesToValidate(CompactionManager.java:1325) ~[main/:na] 
     at org.apache.cassandra.db.compaction.CompactionManager.doValidationCompaction(CompactionManager.java:1215) ~[main/:na] 
     at org.apache.cassandra.db.compaction.CompactionManager.access$700(CompactionManager.java:81) ~[main/:na] 
     at org.apache.cassandra.db.compaction.CompactionManager$11.call(CompactionManager.java:844) ~[main/:na] 
+0

我可以問爲什麼「修理」是不斷有必要嗎?從表面上看,我認爲這是修補一些潛在的問題。 –

+0

由於我們的網絡通常需要重新啓動計算機,並且這會導致Cassandra節點錯過數據並變得不一致。有時我們也有網絡中斷節點。 –

+0

啊,我明白了。重新啓動總是一個bugaboo。 –

回答

0

根據您的數據大小和模式如何傳播的密鑰空間和表格,並通過節點的令牌數量的數據,你可以運行多個針對這些維度進行修理。對於大型密鑰空間和表格,您也可以在修復時使用開始/結束標記選項。您可以通過運行nodetool ring命令找到節點的令牌。另一種維持小範圍修復的方法是運行增量並行修復,檢查nodetool修復中的選項。

+0

我不明白你建議的解決方案。你是說我應該製造一箇中央修理控制器,以某種方式分析nodetool環的輸出並且並行運行一些修理?你是怎樣做的? 3.7中的默認值用於增量和並行修復,所以我已經在使用這些設置。如果修復一次在多個節點上運行,那麼這不會阻止修復掛起。 –

0

我認爲@viorel建議子範圍修復。 Here's the datastax doc for cassandra 3.0他們將其描述爲快速修復。爲什麼它可能會更快,並且here's an explanation。基本上,不是在整個範圍內計算Merkle樹,而是將分區範圍分解爲子範圍,然後進行比較。 Here's an explanation爲什麼工作。

+0

修復的速度對我來說並不重要,我只是想避免修復拋出異常並掛起。如果我能修補Cassandra,以便修復在檢測到另一個修復正在進行時能正常退出,那麼至少我不需要操作員手動重新啓動節點來清理卡住的修復。 –

+0

我正在考慮通過讓它們更快地完成來避免重疊的修復。我想最終的負載將會大到足以讓這只是一個臨時的解決方案。 – LHWizard

+0

是的,那是我的經驗。當其中一個節點大量分頁內存時(由於非Cassandra應用程序在同一臺機器上運行),我首先遇到了這個問題,這似乎大大減緩了修復,導致它與另一個節點重疊。因此,似乎需要某種協調機制或中央規劃者,因爲節點不能保護自己免受同時修理。 –

0

您可以嘗試卡桑德拉 - 收割機:軟件運行卡桑德拉 的自動修理https://github.com/spotify/cassandra-reaper

+0

看起來這個工具不再被維護,其中一個公開問題是,它不適用於像3.x這樣的新版本。我不想使用集中式修復調度程序,因爲這會成爲單點故障。文檔中提到「在不同節點上同時運行多個並行修復」,但我並不清楚哪些可以並行修復,哪些會引發修復引發異常並掛起。看起來,修復不能防止嘗試修復同一個表的多個節點。 –

+0

沒有一個答案是我正在尋找的,但你的答案是最有用的,所以我會獎賞你的獎金。感謝您的信息。 –

+0

我使用2個DC來維護50多個節點羣集。我在一個節點上安裝修復任務並每天修復不同的密鑰空間,以確保每個密鑰空間每週修復一次。我不使用-pr標誌,一切正常。希望這可能會有所幫助。 –