你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
配置磁盘支持的消息缓冲区行为
重要
此设置要求修改代理资源,并且只能在初始部署时使用 Azure CLI 或 Azure 门户进行配置。 如果需要 Broker 配置更改,则需要新的部署。 若要了解详细信息,请参阅自定义默认代理。
磁盘支持的消息缓冲区功能用于高效管理 MQTT 代理分布式 MQTT 代理中的消息队列。 其优势包括:
高效队列管理:在 MQTT 代理中,每个订阅服务器都与消息队列相关联。 订阅服务器处理消息的速度直接影响队列的大小。 如果订阅服务器处理消息速度慢,或者如果消息断开连接但请求 MQTT 持久会话,队列可能会增大到超过可用内存。
持久会话的数据保留:磁盘支持的消息缓冲区功能可确保队列超出可用内存时无缝缓冲到磁盘。 此功能可防止数据丢失并支持 MQTT 持久会话,使订阅服务器能够在重新连接时恢复其会话,且其消息队列保持不变。 磁盘用作临时存储并充当内存溢出。 写入磁盘的数据不持久,将在 Pod 退出时丢失,但只要每个后端链中的至少一个 Pod 保持正常运行,整个代理不会丢失任何数据。
处理连接难题:云连接器被视为具有持久会话的订阅服务器,当由于网络断开连接而无法与事件网格 MQTT 代理等外部系统通信时,可能会面临连接难题。 在这种情况下,消息 (PUBLISH) 会累积。 MQTT 代理智能地将这些消息缓冲到内存或磁盘,直到连接恢复,从而确保消息完整性。
默认情况下,磁盘支持的消息缓冲区功能处于禁用状态。 在这种情况下,消息保留在内存中,当读取器池或暂存池达到由订阅服务器队列限制定义的限制时,将对客户端施加支持压力。
配置磁盘支持的消息缓冲区对于维护强大而可靠的消息队列系统至关重要,尤其是在消息处理速度和连接性至关重要的情况下。
注意
MQTT 代理将从客户端接收到的数据直接写入磁盘,不进行额外的加密。 保护磁盘对于保护代理存储的数据至关重要。
配置选项
若要配置磁盘支持的消息缓冲区,请编辑“代理”资源中的 diskBackedMessageBuffer
部分。 目前,仅支持在使用 az iot ops create
命令部署 Azure IoT 操作时,通过 --broker-config-file
标志来实现此操作。
若要开始操作,请遵循 DiskBackedMessageBuffer API 参考来准备代理配置文件。
例如,最简单的配置只涉及指定最大大小。 在这种情况下,将装载 emptyDir
卷。 值 maxSize
用作 emptyDir
卷的大小限制。 但考虑到 emptyDir
卷的限制,这是最不可取的选项。
{
"diskBackedMessageBuffer": {
"maxSize": "<SIZE>"
}
}
若要获取更好的磁盘支持的消息缓冲区配置,请指定临时卷或永久性卷声明,以便为消息缓冲区装载专用存储卷。 例如:
{
"diskBackedMessageBuffer": {
"maxSize": "<SIZE>",
"ephemeralVolumeClaimSpec": {
"storageClassName": "<NAME>",
"accessModes": [
"<MODE>"
]
}
}
}
{
"persistentVolumeClaimSpec": {
"maxSize": "<SIZE>",
"ephemeralVolumeClaimSpec": {
"storageClassName": "<NAME>",
"accessModes": [
"<MODE>"
]
}
}
}
通过调整以下设置来定制代理消息缓冲区选项:
配置卷:指定卷声明模板,为消息缓冲区装载专用存储卷。
选择存储类:使用
storageClassName
属性定义所需的存储类。定义访问模式:确定卷所需的访问模式。 有关详细信息,请参阅永久性卷访问模式。
使用以下部分来了解不同的卷模式:
- 临时卷是首选选项
- 永久性卷是第二首选项
emptyDir
卷是最后的选项。
永久性卷和临时卷通常由相同的存储类提供。 如果这两个选项都可用,请选择临时卷。 请注意,临时卷需要 Kubernetes 1.23 或更高版本。
提示
指定临时卷声明 (EVC) 或永久性卷声明 (PVC) 模板可让你使用自己选择的存储类,从而提高某些部署应用场景的灵活性。 例如,使用 PVC 模板预配的永久性卷 (PV) 显示在 kubectl get pv
等命令中,这对于检查群集状态很有用。
如果 Kubernetes 节点缺少消息缓冲区的足够本地磁盘空间,请使用提供网络存储(如 Azure Blob)的存储类。 但是,通常最好使用具有较小 maxSize
值的本地磁盘,因为消息缓冲区可以从快速访问中受益,并且不需要持久性。
使用磁盘支持的消息缓冲区部署 Azure IoT 操作
若要使用磁盘支持的消息缓冲区,请使用带有 --broker-config-file
标志的 az iot ops create
命令部署 Azure IoT 操作。 请参阅以下命令(为简洁起见,省略了其他参数):
az iot ops create ... --broker-config-file <FILE>.json
部署后无法更改此设置。 若要更改磁盘支持的消息缓冲区配置,请重新部署 Azure IoT 操作实例。
临时卷
临时卷是消息缓冲区的首选选项。
对于临时卷,请按照有关存储提供程序的注意事项部分中的建议进行操作。
ephemeralVolumeClaimSpec
属性的值用作后端链的 StatefulSet 规范中卷的 ephemeral.volumeClaimTemplate.spec
属性。
例如,若要使用容量为 1 GB 的临时卷,请在“代理”资源中指定以下参数:
{
"diskBackedMessageBuffer": {
"maxSize": "1G",
"ephemeralVolumeClaimSpec": {
"storageClassName": "foo",
"accessModes": [
"ReadWriteOnce"
]
}
}
}
永久性卷
永久性卷是继临时卷之后消息缓冲区的下一个首选选项。
对于永久性卷,请按照有关存储提供程序的注意事项部分中的建议进行操作。
persistentVolumeClaimSpec
属性的值用作后端链的 StatefulSet 规范的 volumeClaimTemplates.spec
属性。
例如,若要使用容量为 1 GB 的永久性卷,请在“代理”资源中指定以下参数:
{
"diskBackedMessageBuffer": {
"maxSize": "1G",
"persistentVolumeClaimSpec": {
"storageClassName": "foo",
"accessModes": [
"ReadWriteOnce"
]
}
}
}
emptyDir
卷
emptyDir 卷是排在永久性卷之后的最后选项。
仅当将群集与文件系统配额结合使用时,才使用 emptyDir 卷。 有关详细信息,请参阅文件系统项目配额选项卡中的详细信息。如果未启用该功能,群集将执行定期扫描,不强制实施任何限制,允许主机节点填充磁盘空间并将整个主机节点标记为运行不正常。
例如,若要使用容量为 1 GB 的 emptyDir 卷,请在“代理”资源中指定以下参数:
{
"diskBackedMessageBuffer": {
"maxSize": "1G"
}
}
有关存储提供程序的注意事项
请考虑所选存储提供程序的行为。 例如,使用 rancher.io/local-path
等提供程序时。 如果提供程序不支持限制,则填充卷会占用节点的磁盘空间。 这可能会导致 Kubernetes 将节点和所有关联的 Pod 标记为运行不正常。 了解存储提供程序在此类情况下的行为至关重要。
已禁用
如果你不想使用磁盘支持的消息缓冲区,请不要在“代理”资源中包含 diskBackedMessageBufferSettings
属性。 这也是默认行为。
持久性
请务必了解磁盘支持的消息缓冲区功能并不等同于永久性。 在此处上下文中,“永久性”是指在 Pod 重启后仍然存在的数据。 但是,此功能为数据保存到磁盘提供了临时存储空间,防止 Pod 重启期间内存溢出和数据丢失。