8.10. 配置 Kafka 和 ZooKeeper 存储
AMQ Streams 提供了配置 Kafka 和 ZooKeeper 数据存储选项的灵活性。
支持的存储类型有:
- Ephemeral (推荐只在开发时使用)
- 持久性
- JBOD (只限 Kafka;对于 ZooKeeper 不可用)
要配置存储,您可以在组件的自定义资源中指定 storage 属性。存储类型使用 storage.type 属性设置。
您还可以使用节点池功能的预览功能来进行 Kafka 集群的高级存储管理。您可以指定集群中使用的每个节点池的唯一存储配置。Kafka 资源可用的相同存储属性也可用于 KafkaNodePool 池资源。
与存储相关的模式引用提供有关存储配置属性的更多信息:
部署 Kafka 集群后无法更改存储类型。
8.10.1. 数据存储注意事项 复制链接链接已复制到粘贴板!
要使 AMQ Streams 正常工作,有效的数据存储基础架构至关重要。我们强烈建议您使用块存储。AMQ Streams 仅测试用于块存储。文件存储(如 NFS)没有被测试,无法保证它可以正常工作。
为您的块存储选择以下选项之一:
- 基于云的块存储解决方案,如 Amazon Elastic Block Store (EBS)
- 使用 本地持久性卷的持久性存储
- 由 光纤通道或 iSCSI等协议访问的存储区域网络(SAN)卷
AMQ Streams 不需要 OpenShift 原始块卷。
8.10.1.1. 文件系统 复制链接链接已复制到粘贴板!
Kafka 使用文件系统来存储信息。AMQ Streams 与 XFS 和 ext4 文件系统兼容,它们通常与 Kafka 一起使用。在选择和设置文件系统时,请考虑部署的底层架构和要求。
如需更多信息,请参阅 Kafka 文档中的 Filesystem Selection。
8.10.1.2. 磁盘用量 复制链接链接已复制到粘贴板!
为 Apache Kafka 和 ZooKeeper 使用单独的磁盘。
虽然使用固态驱动器 (SSD) 并不是必须的,但它可以在大型集群中提高 Kafka 的性能,其中数据会异步发送到多个主题,并从多个主题接收。SSD 与 ZooKeeper 特别有效,这需要快速、低延迟数据访问。
您不需要置备复制存储,因为 Kafka 和 ZooKeeper 都有内置数据复制。
8.10.2. 临时存储 复制链接链接已复制到粘贴板!
临时数据存储是临时的。节点上的所有 pod 共享本地临时存储空间。只要使用它的 pod 正在运行,数据就会保留。当 pod 被删除时,数据会丢失。虽然 pod 可以在高可用性环境中恢复数据。
由于其临时性质,仅推荐使用临时存储进行开发和测试。
临时存储使用 emptyDir 卷来存储数据。当 pod 分配给节点时,会创建一个 emptyDir 卷。您可以使用 sizeLimit 属性为 emptyDir 设置存储总量。
临时存储不适用于单节点 ZooKeeper 集群或 Kafka 主题,复制因子为 1。
要使用临时存储,您可以将 Kafka 或 ZooKeeper 资源中的存储类型配置设置为 临时。如果使用节点池的预览功能,也可以在单个节点池的存储配置中指定 ephemeral。
临时存储配置示例
8.10.2.1. Kafka 日志目录的挂载路径 复制链接链接已复制到粘贴板!
Kafka 代理使用临时卷来作为挂载到以下路径的日志目录:
/var/lib/kafka/data/kafka-logIDX
/var/lib/kafka/data/kafka-logIDX
其中 IDX 是 Kafka 代理 pod 索引。例如 /var/lib/kafka/data/kafka-log0。
8.10.3. 持久性存储 复制链接链接已复制到粘贴板!
持久数据存储在系统中断时保留数据。对于使用持久数据存储的 pod,数据会在 pod 失败后保留,并重启。由于其永久性质,建议在生产环境中使用持久性存储。
要在 AMQ Streams 中使用持久性存储,您可以在 Kafka 或 ZooKeeper 资源的存储配置中指定 persistent-claim。如果使用节点池的预览功能,也可以在单个节点池的存储配置中指定 persistent-claim。
您可以配置资源,以便 pod 使用 持久性卷声明 (PVC) 在持久性卷 (PV) 上发出存储请求。PV 代表按需创建的存储卷,并独立于使用它们的 pod。PVC 请求创建 pod 时所需的存储量。PV 的底层存储基础架构不需要理解。如果 PV 与存储条件匹配,PVC 会绑定到 PV。
您有两个选项来指定存储类型:
storage.type: persistent-claim-
如果您选择
persistent-claim作为存储类型,则会定义一个持久性存储卷。 storage.type: jbod-
当您选择
jbod作为存储类型时,您可以灵活地使用唯一 ID 定义一组持久性存储卷。
在生产环境中,建议配置以下内容:
-
对于 Kafka 或节点池,使用一个或多个持久性卷将
storage.type设置为jbod。 -
对于 ZooKeeper,将
storage.type设置为单个持久性卷的persistent-claim。
持久性存储还具有以下配置选项:
id(可选)-
存储标识号。对于 JBOD 存储声明中定义的存储卷,这个选项是必须的。默认值为
0。 Size(必需)- 持久性卷声明的大小,如 "1000Gi"。
类(可选)- PVC 可以通过指定 StorageClass 来请求不同类型的持久性存储。存储类定义存储配置集,并根据该配置集动态置备 PV。如果没有指定存储类,则使用 OpenShift 集群中标记为 default 的存储类。持久性存储选项可能包括 SAN 存储类型或本地持久性卷。
selector(可选)- 配置以指定特定 PV。提供 key:value 对,代表所选卷的标签。
deleteClaim(optional)-
布尔值,用于指定在卸载集群时是否删除 PVC。默认为
false。
只有在支持持久性卷大小的 OpenShift 版本中才支持增加现有 AMQ Streams 集群中的持久性卷大小。要重新定义大小的持久性卷必须使用支持卷扩展的存储类。对于不支持卷扩展的 OpenShift 和存储类的其他版本,您必须在部署集群前决定必要的存储大小。无法减少现有持久性卷的大小。
Kafka 和 ZooKeeper 持久性存储配置示例
使用特定存储类的持久性存储配置示例
使用选择器 (selector)来指定提供某些功能的标记的持久性卷,如 SSD。
使用选择器的持久性存储配置示例
8.10.3.1. 存储类覆盖 复制链接链接已复制到粘贴板!
您可以为一个或多个 Kafka 或 ZooKeeper 节点指定不同的存储类,而不是使用默认存储类。例如,当存储类仅限于不同的可用区或数据中心时,这非常有用。您可以使用 overrides 字段来实现这一目的。
在本例中,默认存储类名为 my-storage-class :
带有类覆盖的存储配置示例
由于配置的 overrides 属性,卷使用以下存储类:
-
ZooKeeper 节点 0 的持久性卷使用
my-storage-class-zone-1a。 -
ZooKeeper 节点 1 的持久性卷使用
my-storage-class-zone-1b。 -
ZooKeeper 节点 2 的持久性卷使用
my-storage-class-zone-1c。 -
Kafka 代理 0 的持久性卷使用
my-storage-class-zone-1a。 -
Kafka 代理 1 的持久性卷使用
my-storage-class-zone-1b。 -
Kafka 代理 2 的持久性卷使用
my-storage-class-zone-1c。
overrides 属性目前仅用于覆盖存储类。目前不支持对其他存储配置属性覆盖。
8.10.3.2. 持久性存储的 PVC 资源 复制链接链接已复制到粘贴板!
使用持久性存储时,它会使用以下名称创建 PVC:
data-cluster-name-kafka-idx-
用于存储 Kafka 代理 pod
idx数据的卷的 PVC。 data-cluster-name-zookeeper-idx-
用于为 ZooKeeper 节点 pod
idx存储数据的卷的 PVC。
8.10.3.3. Kafka 日志目录的挂载路径 复制链接链接已复制到粘贴板!
Kafka 代理使用持久性卷作为挂载到以下路径的日志目录:
/var/lib/kafka/data/kafka-logIDX
/var/lib/kafka/data/kafka-logIDX
其中 IDX 是 Kafka 代理 pod 索引。例如 /var/lib/kafka/data/kafka-log0。
8.10.4. 重新调整持久性卷大小 复制链接链接已复制到粘贴板!
只要存储基础架构支持,就可以调整集群使用的持久性卷而不造成数据丢失的风险。在配置更新后,AMQ Streams 会指示存储基础架构进行更改。使用 persistent-claim 卷的 AMQ Streams 集群支持存储扩展。
只有在每个代理使用多个磁盘时,才能减少存储。在将磁盘中的所有分区移动到同一代理(intra-broker)或同一集群(集群内)中的其他代理后,您可以删除磁盘。
您无法缩小持久性卷的大小,因为它目前在 OpenShift 中不被支持。
先决条件
- 支持调整大小的 OpenShift 集群。
- Cluster Operator 正在运行。
- 使用支持卷扩展的存储类创建的持久性卷的 Kafka 集群。
流程
编辑集群的
Kafka资源。更改
size属性,以增加分配给 Kafka 集群、ZooKeeper 集群或两者的持久性卷大小。-
对于 Kafka 集群,更新
spec.kafka.storage下的size属性。 -
对于 ZooKeeper 集群,更新
spec.zookeeper.storage下的size属性。
将卷大小增加到
2000Gi的 Kafka 配置Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
对于 Kafka 集群,更新
创建或更新资源:
oc apply -f <kafka_configuration_file>
oc apply -f <kafka_configuration_file>Copy to Clipboard Copied! Toggle word wrap Toggle overflow OpenShift 增加所选持久性卷的容量,以响应 Cluster Operator 的请求。完成调整大小后,Cluster Operator 会重启所有使用调整大小的持久性卷的 pod。这会自动发生。
验证集群中相关 pod 的存储容量是否已增加:
oc get pv
oc get pvCopy to Clipboard Copied! Toggle word wrap Toggle overflow 带有增加存储的 Kafka 代理 pod
NAME CAPACITY CLAIM pvc-0ca459ce-... 2000Gi my-project/data-my-cluster-kafka-2 pvc-6e1810be-... 2000Gi my-project/data-my-cluster-kafka-0 pvc-82dc78c9-... 2000Gi my-project/data-my-cluster-kafka-1
NAME CAPACITY CLAIM pvc-0ca459ce-... 2000Gi my-project/data-my-cluster-kafka-2 pvc-6e1810be-... 2000Gi my-project/data-my-cluster-kafka-0 pvc-82dc78c9-... 2000Gi my-project/data-my-cluster-kafka-1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出显示了与代理 pod 关联的每个 PVC 的名称。
8.10.5. JBOD 存储 复制链接链接已复制到粘贴板!
JBOD 存储允许您将 Kafka 集群配置为使用多个磁盘或卷。这个方法为 Kafka 代理提供了数据存储容量,并可能导致性能改进。JBOD 配置由一个或多个卷定义,每个卷可以是 临时或持久。JBOD 卷声明的规则和约束与临时存储和持久性存储的规则和约束相同。例如,在置备后,您无法缩小持久性存储卷的大小,当类型为 临时 时,您无法更改 sizeLimit 的值。
对 JBOD 存储的支持仅限 Kafka,不支持 ZooKeeper。
要使用 JBOD 存储,您可以将 Kafka 资源中的存储类型配置设置为 jbod。如果您使用节点池的预览功能,也可以在单个节点池的存储配置中指定 jbod。
volumes 属性允许您描述组成 JBOD 存储阵列或配置的磁盘。
JBOD 存储配置示例
创建 JBOD 卷后无法更改 ID。您可以从 JBOD 配置中添加或删除卷。
8.10.5.1. JBOD 存储的 PVC 资源 复制链接链接已复制到粘贴板!
当持久性存储用于声明 JBOD 卷时,它会创建一个具有以下名称的 PVC:
data-id-cluster-name-kafka-idx-
用于存储 Kafka 代理 pod
idx数据的卷的 PVC。id是用于存储 Kafka 代理 pod 数据的卷的 ID。
8.10.5.2. Kafka 日志目录的挂载路径 复制链接链接已复制到粘贴板!
Kafka 代理使用 JBOD 卷作为挂载到以下路径的日志目录:
/var/lib/kafka/data-id/kafka-logidx
/var/lib/kafka/data-id/kafka-logidx
其中 id 是用于存储 Kafka 代理 pod idx 数据的卷的 ID。例如 /var/lib/kafka/data-0/kafka-log0。
8.10.6. 将卷添加到 JBOD 存储 复制链接链接已复制到粘贴板!
此流程描述了如何将卷添加到配置为使用 JBOD 存储的 Kafka 集群中。它不能应用到配置为使用任何其他存储类型的 Kafka 集群。
当在过去和删除的 id 下添加新卷时,您必须确保之前使用的 PersistentVolumeClaims 已被删除。
先决条件
- 一个 OpenShift 集群
- 正在运行的 Cluster Operator
- 具有 JBOD 存储的 Kafka 集群
流程
编辑
Kafka资源中的spec.kafka.storage.volumes属性。将新卷添加到volumes数组中。例如,使用 id2添加新卷:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建或更新资源:
oc apply -f <kafka_configuration_file>
oc apply -f <kafka_configuration_file>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建新主题或将现有分区重新分配给新磁盘。
提示Cruise Control 是一个重新分配分区的有效工具。要执行 intra-broker 磁盘平衡,您可以在
KafkaRebalance.spec下将rebalanceDisk设置为true。
8.10.7. 从 JBOD 存储中删除卷 复制链接链接已复制到粘贴板!
此流程描述了如何从配置为使用 JBOD 存储的 Kafka 集群中删除卷。它不能应用到配置为使用任何其他存储类型的 Kafka 集群。JBOD 存储始终必须包含至少一个卷。
为了避免数据丢失,您必须在删除卷前移动所有分区。
先决条件
- 一个 OpenShift 集群
- 正在运行的 Cluster Operator
- 具有两个或多个卷的 JBOD 存储的 Kafka 集群
流程
从您要删除的磁盘中重新分配所有分区。分区中的任何数据仍被分配给要删除的磁盘。
提示您可以使用
kafka-reassign-partitions.sh工具重新分配分区。编辑
Kafka资源中的spec.kafka.storage.volumes属性。从 volumes 阵列中删除一个或多个卷。例如,使用 ids1和2删除卷:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建或更新资源:
oc apply -f <kafka_configuration_file>
oc apply -f <kafka_configuration_file>Copy to Clipboard Copied! Toggle word wrap Toggle overflow