디스크 지원 메시지 버퍼는 MQTT 브로커가 사용 가능한 메모리를 초과할 때 구독자 메시지 큐를 디스크에 분산할 수 있게 하는 기능입니다. 배포 전에 MQTT 브로커에 대한 디스크 지원 메시지 버퍼링이 필요한지 여부를 결정합니다.
Important
이 설정을 사용하려면 Broker 리소스를 수정해야 합니다. Azure CLI 또는 Azure Portal을 사용하여 초기 배포 시만 구성됩니다. 브로커 구성 변경이 필요한 경우 새 배포가 필요합니다. 자세한 내용은 기본 Broker 사용자 지정을 참조하세요.
디스크 지원 메시지 버퍼 기능은 분산 MQTT broker 내에서 메시지 큐를 효율적으로 관리하는 데 사용됩니다. 이점은 다음과 같습니다.
- 효율적인 큐 관리: MQTT 브로커에서 각 구독자는 메시지 큐와 연결됩니다. 구독자의 메시지 처리 속도는 큐 크기에 직접 영향을 줍니다. 구독자가 메시지를 느리게 처리하거나 연결을 끊지만 MQTT 영구 세션을 요청하는 경우 큐가 사용 가능한 메모리보다 커질 수 있습니다.
- 영구 세션에 대한 데이터 보존: 디스크 지원 메시지 버퍼 기능은 큐가 사용 가능한 메모리를 초과할 때 디스크에 원활하게 버퍼링되도록 합니다. 이 기능은 데이터 손실을 방지하고 MQTT 영구 세션을 지원하므로 구독자는 다시 연결할 때 메시지 큐를 그대로 사용하여 세션을 다시 시작할 수 있습니다. 디스크는 임시 스토리지로 사용되며 메모리에서 분산되는 역할을 합니다. 디스크에 기록된 데이터는 지속성이 없으며 Pod가 종료되면 손실됩니다. 각 백 엔드 체인에서 하나 이상의 Pod가 계속 작동하는 경우 브로커 전체가 데이터를 손실하지 않습니다.
- 연결 문제 처리: 클라우드 커넥터는 네트워크 연결 끊김으로 인해 Azure Event Grid MQTT broker와 같은 외부 시스템과 통신할 수 없는 경우 연결 문제에 직면할 수 있는 영구 세션이 있는 구독자로 처리됩니다. 이러한 시나리오에서는 메시지(PUBLISHes)가 누적됩니다. MQTT 브로커는 연결이 복원될 때까지 이러한 메시지를 메모리 또는 디스크에 지능적으로 버퍼링하여 메시지 무결성을 보장합니다.
기본적으로 디스크 지원 메시지 버퍼 기능은 사용하지 않도록 설정됩니다. 이 경우 메시지는 메모리에 남아 있고 메모리 사용량이 구독자 큐 제한에 정의된 한도에 도달하면 클라이언트에 역압이 적용됩니다.
메모
MQTT 브로커는 암호화를 추가하지 않고 클라이언트에서 받은 것과 정확하게 데이터를 디스크에 씁니다. 브로커가 저장하는 데이터를 보호하려면 디스크 보안이 필수적입니다.
디스크 기반 메시지 버퍼 구성
디스크 기반 메시지 버퍼를 구성하려면 Broker 리소스의 diskBackedMessageBuffer 섹션을 편집하십시오. 현재 이 구성은 --broker-config-file 명령을 사용하여 Azure IoT 작업 배포할 때 az iot ops create 플래그를 사용해야만 지원됩니다. 자세한 내용은 고급 MQTT broker 구성에 대한 Azure CLI 지원을 참조하세요.
배포 후에는 이 설정을 변경할 수 없습니다. 디스크 지원 메시지 버퍼 구성을 변경하려면 IoT Operations 인스턴스를 다시 배포합니다.
시작하려면 DiskBackedMessageBuffer API 참조에 따라 Broker 구성 파일을 준비합니다.
그런 다음 플래그를 --broker-config-file 사용하여 IoT 작업을 배포합니다(간단히 하기 위해 생략된 다른 매개 변수).
az iot ops create ... --broker-config-file <FILE>.json
예를 들어 가장 간단한 구성에는 최대 크기만 지정하는 작업이 포함됩니다. 이 경우 emptyDir 볼륨이 마운트됩니다. 이 maxSize 값은 볼륨의 emptyDir 크기 제한으로 사용됩니다. 그러나 이 옵션은 볼륨의 제한 사항 때문에 가장 선호도가 낮은 옵션입니다 emptyDir .
{
"diskBackedMessageBuffer": {
"maxSize": "1G"
}
}
더 나은 디스크 기반 메시지 버퍼 구성을 위해 메시지 버퍼용 전용 스토리지 볼륨을 마운트하도록 임시 볼륨 또는 영구 볼륨 클레임을 지정하세요. 다음은 그 예입니다.
{
"diskBackedMessageBuffer": {
"maxSize": "1G",
"ephemeralVolumeClaimSpec": {
"storageClassName": "foo",
"accessModes": [
"ReadWriteOnce"
]
}
}
}
{
"diskBackedMessageBuffer": {
"maxSize": "1G",
"persistentVolumeClaimSpec": {
"storageClassName": "foo",
"accessModes": [
"ReadWriteOnce"
]
}
}
}
다음 설정을 조정하여 broker 메시지 버퍼 옵션을 조정합니다.
- 볼륨 구성: 메시지 버퍼에 대한 전용 스토리지 볼륨을 탑재할 볼륨 클레임 템플릿을 지정합니다.
-
스토리지 클래스 선택: 속성을 사용하여 원하는 스토리지 클래스를 정의합니다
storageClassName. - 액세스 모드 정의: 볼륨에 필요한 액세스 모드를 결정합니다. 자세한 내용은 영구 볼륨 액세스 모드를 참조하세요.
임시 볼륨
임시 볼륨 은 메시지 버퍼에 대한 기본 옵션입니다.
임시 볼륨의 경우 스토리지 공급자에 대한 고려 사항 섹션의 조언을 따릅니다.
ephemeralVolumeClaimSpec 속성의 값은 백엔드 체인의 ephemeral.volumeClaimTemplate.spec 사양에서 볼륨의 StatefulSet 속성으로 사용됩니다.
예를 들어 용량이 1GB인 임시 볼륨을 사용하려면 Broker 리소스에 다음 매개 변수를 지정합니다.
{
"diskBackedMessageBuffer": {
"maxSize": "1G",
"ephemeralVolumeClaimSpec": {
"storageClassName": "foo",
"accessModes": [
"ReadWriteOnce"
]
}
}
}
영구 볼륨
영구 볼륨 은 임시 볼륨 이후 메시지 버퍼에 대한 다음 기본 설정 옵션입니다.
영구 볼륨의 경우 스토리지 공급자에 대한 고려 사항 섹션의 조언을 따릅니다.
persistentVolumeClaimSpec 속성의 값은 백엔드 체인의 volumeClaimTemplates.spec 사양에서 StatefulSet 속성으로 사용됩니다.
예를 들어 용량이 1GB인 영구 볼륨을 사용하려면 Broker 리소스에 다음 매개 변수를 지정합니다.
{
"diskBackedMessageBuffer": {
"maxSize": "1G",
"persistentVolumeClaimSpec": {
"storageClassName": "foo",
"accessModes": [
"ReadWriteOnce"
]
}
}
}
emptyDir 볼륨
emptyDir 볼륨은 영구 볼륨 이후 가장 선호도가 낮은 옵션입니다.
파일 시스템 할당량이 있는 emptyDir 클러스터를 사용하는 경우에만 볼륨을 사용합니다. 자세한 내용은 파일 시스템 프로젝트 할당량 탭을 참조하세요. 기능을 사용하도록 설정하지 않으면 클러스터는 제한을 적용하지 않고 호스트 노드가 디스크 공간을 채우고 전체 호스트 노드를 비정상으로 표시할 수 있도록 주기적인 검사를 수행합니다.
예를 들어 용량이 emptyDir 1GB인 볼륨을 사용하려면 Broker 리소스에 다음 매개 변수를 지정합니다.
{
"diskBackedMessageBuffer": {
"maxSize": "1G"
}
}
스토리지 공급자에 대한 고려 사항
예를 들어 다음과 같은 rancher.io/local-path공급자를 사용하는 경우 선택한 스토리지 공급자의 동작을 고려합니다. 공급자가 제한을 지원하지 않는 경우 볼륨을 채우면 노드의 디스크 공간이 소비됩니다. 이 동작으로 인해 Kubernetes가 노드 및 연결된 모든 Pod를 비정상으로 표시할 수 있습니다. 이러한 시나리오에서 스토리지 공급자가 어떻게 동작하는지 이해하는 것이 중요합니다.
Tip
EVC(임시 볼륨 클레임) 또는 PVC(영구 볼륨 클레임) 템플릿을 지정하는 경우 선택한 스토리지 클래스를 사용하여 일부 배포 시나리오에 대한 유연성을 높일 수 있습니다. 예를 들어 PVC 템플릿을 사용하여 프로비전된 영구 볼륨은 클러스터 상태를 검사하는 데 유용한 명령과 같은 kubectl get pv명령에 표시됩니다.
Kubernetes 노드에 메시지 버퍼에 대한 충분한 로컬 디스크 공간이 부족한 경우 Azure Blob Storage 같은 네트워크 스토리지를 제공하는 스토리지 클래스를 사용합니다. 메시지 버퍼는 빠른 액세스의 이점을 활용하며 내구성이 필요하지 않으므로 더 작은 maxSize 값으로 로컬 디스크를 사용하는 것이 좋습니다.
비활성화
디스크 지원 메시지 버퍼를 사용하지 않으려면 Broker 리소스에 diskBackedMessageBufferSettings 속성을 포함하지 마세요. 이 동작도 기본값입니다.
디스크 버퍼와 지속성 비교
디스크 기반 메시지 버퍼와 브로커 지속성은 모두 데이터를 디스크에 쓰지만, 용도는 서로 다릅니다:
| 특징 | 디스크 백업 메시지 버퍼 | 고집 |
|---|---|---|
| Purpose | 구독자 큐가 너무 커지면 메모리에서 디스크로 내보내기 | Pod 다시 시작에서 중요한 브로커 상태(보존된 메시지, 세션, 구독) 유지 |
| Durability | 임시 — Pod가 종료되면 데이터가 손실됩니다. | 내구성 — Pod 재시작 후에도 데이터가 유지됩니다 |
| 사용 시기 | 느린 구독자, 오프라인 영구 세션, 클라우드에 대한 연결 중단 | broker 다시 시작을 유지하려면 보존된 메시지 또는 세션 상태가 필요합니다. |
| 데이터 범위 | 구독자 큐에 메시지 게시 | 보존된 메시지, 구독자 큐 메타데이터, 상태 저장 데이터 |
| Configuration | Broker 리소스 내의 diskBackedMessageBuffer |
배포 또는 런타임의 지속성 설정 |
메모
디스크 버퍼와 지속성을 함께 사용할 수 있습니다. 지속성은 상태가 다시 시작되지 않도록 하는 반면 디스크 버퍼는 정상 작업 중에 메모리 부족 상태를 방지합니다.