設定磁碟支援的訊息緩衝區行為
重要
此設定需要修改 Broker 資源,且只能在初始部署階段使用 Azure CLI 或 Azure 入口網站進行設定。 如果需要訊息代理程式設定變更,則需要新的部署。 若要深入瞭解,請參閱 自定義預設 Broker。
磁碟支援的訊息緩衝區功能可用於在 MQTT 訊息代理程式分散式 MQTT 訊息代理程式內有效率地管理消息佇列。 這些好處包括:
有效率的佇列管理:在 MQTT 訊息代理程式中,每個訂閱者都會與訊息佇列相關聯。 訂閱者處理訊息的速度會直接影響佇列的大小。 如果訂閱者處理訊息的速度緩慢,或如果訊息中斷連線,但要求 MQTT 持續工作階段,佇列可能會成長為大於可用記憶體。
持續性會話的數據保留:磁碟支援的訊息緩衝區功能可確保當佇列超過可用的記憶體時,它會順暢地緩衝處理至磁碟。 這項功能可防止資料遺失,並支援 MQTT 持續性工作階段,讓訂閱者在重新連線時以訊息佇列保持不變地繼續其工作階段。 磁碟會作為暫時儲存體使用,並做為記憶體溢出。 寫入磁碟的資料並不持久,而且會在 Pod 結束時遺失,但只要每個後端鏈結中至少有一個 Pod 運作正常,整個訊息代理程式就不會遺失任何資料。
處理連線挑戰:雲端連接器會被視為具有持續性工作階段的訂閱者,當因網路中斷連線而無法與事件方格 MQTT 訊息代理程式等外部系統通訊時,可能會面臨連線挑戰。 在這種情況下,訊息 (PUBLISHes) 會累積。 MQTT 代理程式會以智慧方式將這些訊息緩衝處理至記憶體或磁碟,直到連線還原為止,確保訊息完整性。
根據預設,磁碟支援的訊息緩衝區功能會停用。 在此情況下,訊息會保留在記憶體中,當讀取器集區或臨時集區達到訂閱者佇列限制所 定義的限制時,會將回壓套用至用戶端。
設定磁碟支援的訊息緩衝區對於維護健全且可靠的消息佇列系統至關重要,特別是在訊息處理速度和連線能力十分重要的情況下。
注意
MQTT 訊息代理程式會將數據與從用戶端接收的數據完全一樣寫入磁碟,而不需要額外的加密。 保護磁碟是保護訊息代理程式所儲存數據的必要條件。
設定選項
若要設定磁碟支援的訊息緩衝區,請編輯 diskBackedMessageBuffer
Broker 資源中的 區段。 目前,只有在您使用 命令部署 Azure IoT 作業時,才支援使用 --broker-config-file
az iot ops create
旗標。
若要開始使用,請遵循 DiskBackedMessageBuffer API 參考來準備 Broker 配置檔。
例如,最簡單的設定只涉及指定大小上限。 在此情況下,emptyDir
會掛接磁碟區。 值 maxSize
會當做磁碟區的大小限制 emptyDir
使用。 但這是提供磁碟區限制的最低 emptyDir
首選選項。
{
"diskBackedMessageBuffer": {
"maxSize": "<SIZE>"
}
}
若要取得更好的磁碟備份訊息緩衝區組態,請指定暫時磁碟區或永續性磁碟區宣告,以掛接訊息緩衝區的專用記憶體磁碟區。 例如:
{
"diskBackedMessageBuffer": {
"maxSize": "<SIZE>",
"ephemeralVolumeClaimSpec": {
"storageClassName": "<NAME>",
"accessModes": [
"<MODE>"
]
}
}
}
{
"persistentVolumeClaimSpec": {
"maxSize": "<SIZE>",
"ephemeralVolumeClaimSpec": {
"storageClassName": "<NAME>",
"accessModes": [
"<MODE>"
]
}
}
}
藉由調整下列設定來量身打造訊息緩衝區選項:
設定磁碟區:指定磁碟區宣告範本,為您的訊息緩衝區掛接專用記憶體磁碟區。
選取記憶體類別:使用
storageClassName
屬性定義所需的 StorageClass。定義存取模式:決定磁碟區所需的存取模式。 如需詳細資訊,請參閱永續性磁碟區存取模式。
使用下列各節來瞭解不同的磁碟區模式:
- 暫時磁碟區 是慣用的選項,
- 接下來會優先使用永續性磁碟區 ,以及
emptyDir
最不慣用的磁碟區 。
持續性和暫時磁碟區通常由相同的記憶體類別提供。 如果這兩個選項都可用,請選擇暫時性。 請注意,暫時磁碟區需要 Kubernetes 1.23 或更高版本。
提示
指定暫時磁碟區宣告 (EVC) 或永續性磁碟區宣告 (PV) 範本可讓您使用您選擇的儲存類別,以增加某些部署案例的彈性。 例如,使用PVC 範本布建的永續性磁碟區(PVS)會出現在 之類的 kubectl get pv
命令中,這在檢查叢集狀態時很有用。
如果您的 Kubernetes 節點沒有足夠的本機磁碟空間供訊息緩衝區使用,請使用提供 Azure Blob 等網路記憶體的記憶體類別。 不過,通常最好使用具有較小 maxSize
值的本機磁碟,因為訊息緩衝區受益於快速存取,而且不需要持久性。
使用磁碟支援的訊息緩衝區部署 Azure IoT 作業
若要使用磁碟支援的訊息緩衝區,請使用 az iot ops create
命令搭配 --broker-config-file
旗標來部署 Azure IoT 作業。 請參閱下列命令(為了簡潔起見而省略其他參數):
az iot ops create ... --broker-config-file <FILE>.json
部署之後,無法變更此設定。 若要變更磁碟支援的訊息緩衝區組態,請重新部署 Azure IoT 作業實例。
暫時磁碟區
暫時磁碟區是訊息緩衝區的慣用選項。
針對暫時磁碟區,請遵循儲存體提供者考量一節中的建議。
屬性的值 ephemeralVolumeClaimSpec
會當做 ephemeral.volumeClaimTemplate.spec
後端鏈結之 StatefulSet 規格中磁碟區的 屬性使用。
例如,若要使用容量為 1 GB 的暫時磁碟區,請在 Broker 資源中指定下列參數:
{
"diskBackedMessageBuffer": {
"maxSize": "1G",
"ephemeralVolumeClaimSpec": {
"storageClassName": "foo",
"accessModes": [
"ReadWriteOnce"
]
}
}
}
永久性磁碟區
永續性磁碟區是暫時磁碟區之後訊息緩衝區的下一個慣用選項。
針對永續性磁碟區,請遵循儲存體提供者考量一節中的建議。
屬性的值 persistentVolumeClaimSpec
會當做 volumeClaimTemplates.spec
後端鏈結之 StatefulSet 規格的 屬性使用。
例如,若要使用 容量為 1 GB 的永續性 磁碟區,請在 Broker 資源中指定下列參數:
{
"diskBackedMessageBuffer": {
"maxSize": "1G",
"persistentVolumeClaimSpec": {
"storageClassName": "foo",
"accessModes": [
"ReadWriteOnce"
]
}
}
}
emptyDir
卷
emptyDir 磁碟區是永續性磁碟區之後最不慣用的選項。
只有在搭配檔案系統配額使用叢集時,才使用 emptyDir 磁碟區。 如需詳細資訊,請參閱檔案系統專案配額索引標籤中的詳細資料。如果未啟用此功能,叢集會進行定期掃描,不強制執行任何限制,並允許主機節點填滿磁碟空間,並將整個主機節點標記為不正常。
例如,若要使用容量為 1 GB 的 emptyDir 磁碟區,請在 Broker 資源中指定下列參數:
{
"diskBackedMessageBuffer": {
"maxSize": "1G"
}
}
儲存體提供者的考量
請考慮所選儲存體提供者的行為。 例如,使用類似 rancher.io/local-path
的提供者時。 如果提供者不支援限制,填滿磁碟區會耗用節點的磁碟空間。 這可能導致 Kubernetes 將節點和所有相關聯的 Pod 標示為狀況不良。 請務必了解您的記憶體提供者在這類案例中的運作方式。
已停用
如果您不想使用磁碟支援的訊息緩衝區,請勿在 Broker 資源中包含 diskBackedMessageBufferSettings
屬性。 這也是預設行為。
持續性
請務必瞭解磁碟支援的訊息緩衝區功能與持續性不一致。 在此內容中,持續性是指在 Pod 重新啟動時倖存的資料。 不過,這項功能會提供暫存空間,讓資料儲存至磁碟,防止 Pod 重新啟動期間的記憶體溢位和資料遺失。