了解保留的磁盘使用量
了解创建的主题和分区以及应用的配置设置如何使用 Event Streams 实例的可用存储器。
首先,请务必注意,Event Streams 实例的已定义存储器是可用存储器。 这意味着您无需担心副本所使用的存储器 (因为所有主题都将其复制因子设置为 3) 未从可用存储器中获取。 这使事情变得简单,您可以规划如何将这些消息的保留时间映射到存储器使用情况。
了解 Kafka 如何存储数据
Kafka 允许用户配置主题的保留限制。
retention.bytes 配置设置是为主题的每个分区的消息分配的字节总数。 如果超过此值,那么 Kafka 将删除最旧的消息。 例如,如果您通常每天将 200 MB 的消息发送到单个分区主题,并且希望将这些消息保留 5 天,请将 retention.bytes 设置为 1 GB (200 MB x 5 天)。
如果这超过 10 个分区,那么将设置 retention.bytes = 100 MB (1 GB/10 个分区)。
在内部,Kafka 会将每个分区拆分为多个日志段。 这也是您可以设置的属性 log.segment.size,缺省值为 512 MB。 当我们提到 Kafka 删除最旧的消息时,它确实会删除最旧的日志段。 因此,除了满足 retention.bytes 配置所需的日志段数外,Kafka 还需要保留一个额外日志段的空间。
请参阅以下示例。
retention.bytes = 1 GB
log.segment.size = 512 MB
Kafka needs approximately 1.5 GB per partition for the topic storage.
retention.bytes = 100 MB
log.segment.size = 512 MB
Kafka needs approximately 1 GB per partition for the topic storage.
每个分区需要更多存储空间来存储索引。 对于每个日志段,Kafka 还会存储两个索引。 它们的大小由 segment.index.size定义,该大小也是可配置的,缺省值为 10 MB。 作为参考,按如下所示计算索引所使用的存储器:
2 x number.of.log.segments x segment.index.size
其中
number.of.log.segments = floor(retention.bytes/log.segment.size) + 1
使用 Event Streams 管理存储空间
执行主题管理操作 (例如,创建主题,创建分区或更改主题配置) 时,Event Streams 确保有足够的存储空间可用于满足该操作。 为此,对于每个主题,Event Streams 使用以下方法计算每个主题的“保留大小”。
对于 cleanup.policy
设置为 compact
的主题,每个分区使用的保留大小始终为 1 GB。 当主题的 cleanup.policy
设置为 compact
时,将忽略用于 retention.bytes
或 retention.ms
主题设置的任何值。
对于 cleanup.policy
设置为 delete
或 compact, delete
的主题,将按如下所示计算每个分区所使用的保留大小:
Reserved size = retention.bytes + log.segment.size + (2 x segment.index.size x number.of.log.segments)
其中
number.of.log.segments = floor(retention.bytes/log.segment.size) + 1
总保留存储器百分比也由 ibm_eventstreams_instance_reserved_disk_space_percent 度量 显示在 IBM Cloud Monitoring 中。
如果创建新主题或将分区添加到现有主题的请求将导致保留存储总量超过为 Event Streams 实例配置的存储总量的 90% [1],那么将拒绝这些请求。 拒绝的请求接收到 PolicyViolation 错误,说明已达到实例的保留存储器限制。 如果达到保留存储器限制,那么需要先删除主题或增加为实例配置的存储量,然后才能创建更多主题。
如果更新了 Kafka 存储需求,那么将来可能会更改保留大小计算。
示例
一个不明显的影响是,根据主题配置,Kafka 可以保留比预期更多的存储空间。 请参阅以下示例。
-
retention.bytes 为 1 GB 且日志段大小为 512 MB 的主题:
如果使用一个分区,那么将保留大约 1.5 GB 的存储空间。
在这种情况下,保留的大小明显大于保留字节总数。 -
retention.bytes 为 50 GB 且日志段大小为 512 MB 的主题:
如果使用一个分区,那么将保留大约 50.5 GB 的存储空间。
在这种情况下,保留的大小非常接近于保留字节总数。
-
retention.bytes 为 1 GB 且日志段大小为 128 MB 的主题:
如果使用一个分区,那么将保留大约 1.1 GB 的存储空间。
在这种情况下,保留的大小非常接近于保留字节总数。
-
Event Streams 将分配给实例的某些存储器用于内部管理功能,并用作适合删除的日志段的操作预留。 ↩︎