8.10. 配置 Kafka 和 ZooKeeper 存储
作为有状态应用程序,Kafka 和 ZooKeeper 将数据存储在磁盘上。对于这个数据,AMQ Streams 支持三种存储类型:
- Ephemeral (推荐只在开发时使用)
- 持久性
- JBOD (仅限 Kafka )
在配置 Kafka
资源时,您可以指定 Kafka 代理及其对应 ZooKeeper 节点使用的存储类型。您可以使用以下资源中的 storage
属性配置存储类型:
-
Kafka.spec.kafka
-
Kafka.spec.zookeeper
存储类型在 type
字段中配置。
有关存储配置属性的更多信息,请参阅 schema 参考:
部署 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
资源中的存储类型配置设置为 临时
。
临时存储配置示例
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 失败后保留,并重启。
动态置备框架可创建带有持久性存储的集群。Pod 配置使用持久性卷声明 (PVC) 在持久性卷 (PV) 上发出存储请求。PV 是代表存储卷的存储资源。PV 独立于使用它们的 pod。PVC 请求创建 pod 时所需的存储量。PV 的底层存储基础架构不需要理解。如果 PV 与存储条件匹配,PVC 会绑定到 PV。
由于其永久性质,建议在生产环境中使用持久性存储。
PVC 可以通过指定 StorageClass 来请求不同类型的持久性存储。存储类定义存储配置集和动态置备 PV。如果没有指定存储类,则使用默认存储类。持久性存储选项可能包括 SAN 存储类型或本地持久性卷。
要使用持久性存储,您可以将 Kafka
或 ZooKeeper
资源中的存储类型配置设置为 persistent-claim
。
在生产环境中,建议进行以下配置:
-
对于 Kafka,使用一个或多个
type: persistent-claim
卷配置type: jbod
-
对于 ZooKeeper,配置
type: persistent-claim
持久性存储还具有以下配置选项:
id
(可选)-
存储标识号。对于 JBOD 存储声明中定义的存储卷,这个选项是必须的。默认值为
0。
Size
(必需)- 持久性卷声明的大小,如 "1000Gi"。
类
(可选)-
用于动态卷置备的 OpenShift StorageClass。
存储类
配置包括详细描述卷配置集的参数。 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
:
使用存储类覆盖的 AMQ Streams 集群示例
由于配置的 overrides
属性,卷使用以下存储类:
-
ZooKeeper 节点 0 的持久性卷使用
my-storage-class-zone-1a
。 -
ZooKeeper 节点 1 的持久性卷使用
my-storage-class-zone-1b
。 -
ZooKeeepr 节点 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 pv
Copy 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-1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出显示了与代理 pod 关联的每个 PVC 的名称。
8.10.5. JBOD 存储 复制链接链接已复制到粘贴板!
您可以将 AMQ Streams 配置为使用 JBOD,这是多个磁盘或卷的数据存储配置。JBOD 是为 Kafka 代理提供增加数据存储的方法。它还可以提高性能。
Kafka 仅支持 JBOD 存储。
JBOD 配置由一个或多个卷描述,每个卷可以是 临时或 持久。JBOD 卷声明的规则和约束与临时存储和持久性存储的规则和约束相同。例如,在置备后,您无法缩小持久性存储卷的大小,或者当类型为 ephemeral
时无法更改 sizeLimit
的值。
要使用 JBOD 存储,您可以将 Kafka
资源中的存储类型配置设置为 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