我在24個節點集羣中運行Cassandra 3.7,每個節點有3個數據中心和256個vnodes,每個節點使用cron作業每天運行一次「nodetool repair -pr」與其他節點不同的一小時。同時修復導致修復掛起
有時修理需要一個多小時才能完成並且修理重疊。發生這種情況時,修復開始出現異常,並可能處於不良狀態。這會導致級聯故障,其中每個小時另一個節點將嘗試啓動修復,並且它也會掛起。
從此恢復很困難。我發現的唯一方法是不僅重新啓動停滯不前的節點,而且還重新啓動集羣中的所有節點。
我唯一的想法就是建立某種服務,檢查是否有任何其他節點在開始修復之前正在運行修復,可能是在修復過程中發佈在Cassandra表中。
我不知道如果集羣變得更大,我將如何修復所有節點,因爲那裏很快就沒有足夠的時間在一天中的所有節點上運行修復。
所以我的主要問題是,我運行修復不正確以及建議如何定期修復大型集羣的所有節點?
有沒有辦法一次修復多個節點?該文件暗示存在,但不清楚如何做到這一點。一次在多個節點上運行修復會導致崩潰和燒傷,這是否正常?有沒有比重新啓動所有節點更簡單的方法來終止卡住的維修?
有些事情我想:
- 運行「nodetool修」,而不-PR,但如果同時對 多個節點上運行,這也掛起。
- 正在運行「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]
我可以問爲什麼「修理」是不斷有必要嗎?從表面上看,我認爲這是修補一些潛在的問題。 –
由於我們的網絡通常需要重新啓動計算機,並且這會導致Cassandra節點錯過數據並變得不一致。有時我們也有網絡中斷節點。 –
啊,我明白了。重新啓動總是一個bugaboo。 –