磁碟故障及其營運通常伴隨著磁碟上的資料銷毀。在進行磁碟營運時,您應考慮資料是否需要遷移備份。對於Kafka叢集,您還需要考慮Topic分區副本資料是否可以從其他Broker節點分區副本同步恢複。本文以EMR Kafka 2.4.1版本為例,介紹Kafka磁碟故障營運的操作。
業務情境
Kafka將日誌資料存放區到磁碟中,當磁碟出現故障時,會導致磁碟IO能力下降、叢集輸送量下降、訊息讀寫延時或日誌目錄offline等問題。這些情況有可能影響到線上業務平穩運行、資料丟失、Kafka叢集容錯能力下降,單塊盤故障甚至有可能因為IO處理能力下降導致叢集出現雪崩效應、引起重大生產事故。因此需要對磁碟故障進行有效監控以便及時發現故障。當磁碟發生故障時,應及時完成相關故障的處理,及時恢複叢集的容錯能力。
磁碟營運概述
本文從磁碟監控和磁碟故障恢複角度來介紹磁碟營運策略。
磁碟監控
以下內容從Kafka服務層面以及ECS系統層面來簡單瞭解一下磁碟的監控策略。
Kafka服務層面:可以在CloudMonitor系統中設定EMR Kafka叢集的OfflineLogDirectoryCount和UnderReplicatedPartitions等指標警示,及時發現相關指標的異常。
ECS系統層面:可以在CloudMonitor中設定相應ECS執行個體的I/O wait和mbps等指標,來監控磁碟的健康狀態。ECS後台也會自動的檢測磁碟狀態,當發現問題時,會自動為您推送相關的磁碟事件。
磁碟故障恢複
當出現log directory offline、Under Replicated Partition時,需要儘快定位是否是由於磁碟故障導致的。
當出現磁碟故障時,需要根據故障原因、故障影響程度、業務需求(是否接受資料丟失、是否允許服務較長時間不可用)、叢集狀態等綜合考慮恢複採取的策略。
如果業務優先保證服務可用,但允許丟失部分資料,則應考慮在可能會遺失資料的情況下,先恢複服務可用性。
如果業務不允許資料丟失,但能容忍服務較長時間不可用,則需要考慮如何儘可能的避免遺失資料的情況出現。
如果業務需要高可用與資料不丟失,則您需要通過合理的叢集配置、使用Kafka方式提高系統容錯能力,以避免出現一塊盤故障就導致資料丟失的情況出現。
如果發現因為故障盤IO效能下降導致叢集整體效能下降,影響業務,則應快速隔離故障盤來進行業務止損。
當檢測或定位到磁碟故障時,可以考慮如下營運策略:
節點間分區遷移:將故障磁碟中的分區副本遷移到其他Broker,詳情請參見節點間分區遷移方式。
節點內分區遷移:將故障磁碟中的分區副本遷移到當前Broker的其他磁碟,詳情請參見節點內分區遷移方式。
原Broker資料恢複:將異常磁碟從log.dirs中移除,重啟Broker後會自動回復丟失的Partition資料到本節點的其他目錄,詳情請參見原Broker資料恢複方式。
使用限制
本文檔僅適用於EMR-5.8.0及後續版本,EMR-3.42.0及後續版本。
注意事項
磁碟故障營運應注意以下資訊:
選擇修複策略:綜合各種因素考慮選擇磁碟維修的策略。
注意限流:在磁碟營運過程當中,如果涉及到資料複製遷移,需要注意限制營運流量,避免對正常業務流量造成影響。
限流閾值:應根據磁碟IO能力和正常業務流量來評估遷移時的限流閾值。
分區副本遷移:物理盤維修完畢上線之後,應將Topic分區資料移轉回原磁碟,leader負載遷移回原Broker節點。
資料移轉時間長度:在磁碟營運過程當中,如果涉及到資料複製遷移,需要評估資料移轉時間長度對業務的影響。
節點間分區遷移方式
方案描述
當發現磁碟故障隱患或者由於其他原因需要替換磁碟時,可以將故障磁碟上的分區副本資料移轉到其他磁碟。故障磁碟維修更換期間,分區副本個數不會變化、叢集處於正常容錯狀態。故障盤維修更換完畢之後將分區資料遷回到原磁碟。此方案的優點在於磁碟營運周期,叢集處於正常容錯狀態,各Broker負載較為均衡;缺點是當故障盤上的分區沒有其他ISR副本時,有可能遺失資料。
適用情境
故障盤所在Broker磁碟容量不足情境,或者故障盤所在Broker負載過高的情境。
注意事項
注意限流:分區資料移轉將產生較大的資料移轉流量,需要對流量進行限制以避免對正常業務產生影響。
遷移時間長度:如果需要遷移的資料較多,相應的遷移時間長度也會加大。
限流閾值:應根據磁碟IO能力、正常業務流量來評估遷移時的限流閾值。
磁碟空間:需要確保叢集有足夠的磁碟容量來存放遷移的資料。
備份原始assignment檔案。分區遷移時,需要注意儲存原來的assignment檔案,便於磁碟修複後,將分區遷移回原來的磁碟目錄。
由於disk1儲存了Kafka服務的記錄檔,所有涉及disk1的壞盤修複操作必須遵循以下步驟:
下線disk1前:務必先將日誌目錄遷移至其他儲存介質。
# 建立新的日誌目錄,確保目錄許可權與/mnt/disk1/log/保持一致。
sudo mkdir /mnt/disk2/log
# 檢查軟連結是否正確指向disk2。
sudo ln -sf /mnt/disk2/log /var/log/taihao-apps
# 遷移原記錄檔至新目錄。
sudo mv /mnt/disk1/log/* /mnt/disk2/log/
上線disk1後:確保將記錄檔目錄恢複到原位。
# 建立disk1的日誌目錄。
sudo mkdir /mnt/disk1/log
# 檢查軟連結是否正確指向disk1。
sudo ln -sf /mnt/disk1/log /var/log/taihao-apps
# 移動記錄檔回disk1。
sudo mv /mnt/disk2/log/* /mnt/disk1/log/
操作步驟
本樣本以Broker 0的壞盤/mnt/disk7為例,介紹如何採用節點間分區遷移的方式進行故障盤營運。
分區遷移。
以SSH方式登入到源Kafka叢集的Master節點,詳情請參見登入叢集。
可選:待維修磁碟隔離。如果磁碟已經發生故障,您需要執行以下命令快速隔離該磁碟。
執行以下命令,將待維修磁碟上的分區遷移到其他Broker節點。
kafka-reassign-partitions.sh --zookeeper master-1-1:2181/emr-kafka --reassignment-json-file reassign.json --throttle 30000000 --execute
說明
reassign.json包含了待遷移磁碟上需要遷移的分區副本。
執行完reassign命令後,會輸出原始的assignment,可以將該輸出儲存起來,便於後續恢複。
執行以下命令,確認故障盤上資料已經遷移完畢。
ls -lrt /mnt/disk7/kafka/log
通過回顯資訊,查看日誌目錄下是否有記錄檔,沒有記錄檔表示資料已經遷移完畢。
可選:如果前面步驟中沒有隔離待維修磁碟,則需要執行以下命令隔離待維修磁碟。
卸載故障磁碟目錄。
重要
編輯fstab條目時,直接刪除而不是注釋掉故障盤條目。
執行以下命令,編輯/etc/fstab。
刪除disk7的資訊。
執行以下命令,驗證目錄控制代碼是否釋放。
如果發現控制代碼長時間(半個小時以上)無法釋放,則可以通過控制台重啟對應Broker服務。
執行以下命令,卸載故障磁碟目錄。
修改log.dirs配置並重啟服務。
在EMR控制台,修改恢複後的Broker節點層級的log.dirs配置項,移除故障磁碟對應的分區目錄。
本樣本需要移除的目錄為/mnt/disk7/kafka/log。
在EMR控制台重啟Broker服務,詳情請參見操作步驟。
說明
如果ECS的修複磁碟事件營運流程中需要重啟ECS執行個體,則可以將重啟Broker服務與重啟ECS執行個體結合起來完成。
通過修複磁碟事件,在ECS控制台進行後續磁碟修複工作。
此過程可能需要的時間周期為幾天。
磁碟上線,詳情請參見磁碟上線。
您需要將修複後的磁碟重新mount到原來的目錄。本樣本為/mnt/disk7目錄。
在修複後的磁碟目錄上建立kafka日誌目錄。
//建立原始日誌目錄。本例子為/mnt/disk7/kafka/log。
sudo mkdir -p /mnt/disk7/kafka/log
sudo chown -R kafka:hadoop /mnt/disk7/kafka/log
修改log.dirs配置並重啟服務。
在EMR控制台,修改恢複後的Broker節點層級的log.dirs配置項,添加修複後磁碟對應的分區目錄。
本樣本需要增加的目錄為/mnt/disk7/kafka/log。
在EMR控制台重啟Broker服務,詳情請參見操作步驟。
遷回分區副本。
使用步驟1儲存的原始assignment檔案,將原來故障盤上的分區遷回到修複後的磁碟。
原Broker資料恢複方式
方案描述
當磁碟故障時,如果磁碟IO效能已經明顯下降,則需要快速隔離故障磁碟避免因單點故障影響叢集效能。
磁碟隔離之後,對應kafka日誌目錄處於offline狀態。此時,如果分區存在ISR副本或者允許分區資料丟失,可以直接將故障磁碟從log.dirs中刪除下線,然後重啟Broker。重啟Broker後,如果其他節點存在新的leader副本,原有故障盤分區副本將在其所在Broker進行恢複。磁碟修複上線後,您可以通過reassign工具將原有資料移轉回修複後的磁碟。
本方案的缺點在於:當故障盤上的分區沒有ISR副本時,有可能遺失資料。
適用情境
注意事項
流量限制:由於資料在同一個節點恢複,會產生副本恢複流量,應注意限流。
磁碟空間:需要注意本Broker的其他節點是否有足夠的空間容納異常磁碟的資料。
資料移轉:磁碟修複重新上線後,通常需要將資料從其他磁碟挪回到修複後的磁碟以保證磁碟負載平衡。
操作步驟
以下樣本以Broker 0的/mnt/disk7壞盤為例,介紹如何採用原地資料恢複方式進行故障盤營運。
故障盤隔離。
以SSH方式登入到源Kafka叢集的Master節點,詳情請參見登入叢集。
執行以下命令,隔離故障盤。
可選:備份故障盤上Kafka日誌分區目錄名稱。
通過備份故障盤目錄名稱,當磁碟修複上線後,您可以將原有分區遷移回修複後的磁碟中。
卸載故障磁碟目錄。
重要
編輯fstab條目時,直接刪除而不是注釋掉故障盤條目。
執行以下命令,編輯/etc/fstab。
刪除disk7的資訊。
執行以下命令,驗證目錄控制代碼是否釋放。
如果發現控制代碼長時間(半個小時以上)無法釋放,則可以通過控制台重啟對應Broker服務。
執行以下命令,卸載故障磁碟目錄。
修改故障Broker節點的log.dirs配置並限制恢複流量。
在EMR控制台,修改恢複後的Broker節點層級的配置項,移除故障磁碟對應的分區目錄。
本樣本需要移除的目錄為/mnt/disk7/kafka/log。
可選:通過設定reassign限流參數的方式來限制Broker上分區資料同步恢複時候的流量頻寬,詳情請參見限制Kafka服務端營運流量。
在EMR控制台重啟Broker服務,詳情請參見操作步驟。
說明
如果ECS的修複磁碟事件營運流程中需要重啟ECS執行個體,則可以將重啟Broker服務與重啟ECS執行個體結合起來完成。
在重啟的過程中,Kafka將會恢複本Broker故障盤上缺失的副本分區到其他磁碟,待Kafka恢複好分區資料後,如果前一步驟設定了限流參數,則需要將限流參數去除掉。
通過修複磁碟事件,在ECS控制台進行後續磁碟修複工作。
磁碟上線,詳情請參見磁碟上線。
您需要將修複後的磁碟重新mount到原來的目錄。本樣本為/mnt/disk7目錄。
建立Kafka日誌目錄並重啟服務。
在修複後的磁碟目錄上建立Kafka日誌目錄。
//建立原始日誌目錄。本例子為/mnt/disk7/kafka/log。
sudo mkdir -p /mnt/disk7/kafka/log
sudo chown -R kafka:hadoop /mnt/disk7/kafka/log
在EMR控制台,修改恢複後的Broker節點層級的log.dirs配置項,添加修複後磁碟對應的分區目錄。

本樣本需要增加的目錄為/mnt/disk7/kafka/log。
在EMR控制台重啟Broker服務,詳情請參見操作步驟。
遷回分區副本。
使用步驟2儲存的分區副本目錄,通過reassign工具遷移分區副本broker內部目錄的方式遷回到修複後的磁碟。
節點內分區遷移方式
方案描述
當發現磁碟故障時,如果磁碟IO效能已經明顯下降,需要快速隔離故障磁碟避免因單點故障影響叢集效能。
磁碟隔離之後,對應的kafka日誌目錄處於offline狀態。此時,如果故障盤上存在無法切換到其他Broker的副本且業務資料不能丟失,則可以將分區副本資料移轉到本Broker的其他磁碟後,再進行後續的磁碟營運流程。本方案用於處理如果使用其他營運方案會遺失資料,但業務不允許資料丟失的情境。
適用情境
故障盤上的分區在其他節點已經沒有ISR副本,並且業務不允許資料丟失的情境。
注意事項
需要評估OS系統層面的mv操作產生的IO熱點的影響。
操作步驟
本樣本以Broker 0的壞盤/mnt/disk7為例,介紹如何採用節點內分區遷移的方式進行故障盤營運。
故障盤隔離。
以SSH方式登入到源Kafka叢集的Master節點,詳情請參見登入叢集。
執行以下命令,隔離故障盤。
可選:備份故障盤上Kafka日誌分區目錄名稱。
通過備份故障盤目錄名稱,當磁碟修複上線後,您可以將原有分區遷移回修複後的磁碟中。
遷移節點內分區。
將/mnt/disk7/kafka/log下的所有資料以分區為單位,按照分區佔用磁碟容量的大小,均勻的遷移到當前節點的其他目錄,詳情請參見節點內分區遷移方式恢複。
卸載故障磁碟目錄。
重要
編輯fstab條目時,直接刪除而不是注釋掉故障盤條目。
執行以下命令,編輯/etc/fstab。
刪除disk7的資訊。
執行以下命令,驗證目錄控制代碼是否釋放。
如果發現控制代碼長時間(半個小時以上)無法釋放,則可以通過控制台重啟對應Broker服務。
執行以下命令,卸載故障磁碟目錄。
在EMR控制台重啟Broker服務,詳情請參見操作步驟。
說明
如果ECS的修複磁碟事件營運流程中需要重啟ECS執行個體,則可以將重啟Broker服務與重啟ECS執行個體結合起來完成。
通過修複磁碟事件,在ECS控制台進行後續磁碟修複工作。
此過程可能需要的時間周期為幾天。
磁碟上線,詳情請參見磁碟上線。
您需要將修複後的磁碟重新mount到原來的目錄。本樣本為/mnt/disk7目錄。
建立Kafka日誌目錄並重啟服務。
在修複後的磁碟目錄上建立kafka日誌目錄。
//建立原始日誌目錄。本例子為/mnt/disk7/kafka/log。
sudo mkdir -p /mnt/disk7/kafka/log
sudo chown -R kafka:hadoop /mnt/disk7/kafka/log
在EMR控制台,修改恢複後的Broker節點層級的log.dirs配置項,添加修複後磁碟對應的分區目錄。
在EMR控制台重啟Broker服務,詳情請參見操作步驟。
可選:遷回分區副本。
使用步驟2儲存的分區副本目錄,通過reassign工具遷移分區副本broker內部目錄的方式遷回到修複後的磁碟。