存储

OpenSearchCluster 的每个节点池都将其数据存储在每个 pod 对应的 PersistentVolumeClaim (PVC) 中。组成新集群的 bootstrap pod 也有自己的 PVC。本页面介绍如何为这两者选择存储。

节点池持久化

在 spec.nodePools[].persistence.pvc 下为每个节点池配置持久化,并在 spec.nodePools[].diskSize 下配置卷大小:

spec:
  nodePools:
    - component: masters
      replicas: 3
      diskSize: 50Gi
      roles:
        - cluster_manager
        - data
      persistence:
        pvc:
          storageClass: <storage-class>
          accessModes:
            - ReadWriteOnce
字段含义默认值
diskSize为每个 pod 的数据 PVC 请求的大小30Gi
persistence.pvc.storageClass数据 PVC 的 StorageClass集群的默认 StorageClass
persistence.pvc.accessModes数据 PVC 的访问模式无:设置 persistence.pvc 时始终设置该项(通常为 ReadWriteOnce)

如果完全省略 persistence,节点池将从集群的默认 StorageClass 获取 ReadWriteOnce PVC。如果设置了 persistence.pvc,operator 将按给定值使用其 accessModes,因此请始终包含这些值。

每个 pod 都会获得自己的 PVC,名称为 data-<cluster-name>-<component>-<index>。

不同的节点池可以使用不同的存储类,例如,数据节点使用快速本地磁盘,专用集群管理器节点使用网络存储。

卷所有权

E1 不会以 root 身份运行 init 容器来更改数据目录的所有者。相反,OpenSearch pod 默认会获得一个 fsGroup,其值为 1000,Kubernetes 会使卷对该组可写。对于以 root 所有者身份挂载的卷(例如 Ceph RBD),此方式有效。如果你自行设置 spec.general.podSecurityContext.fsGroup,则会使用你提供的值。

示例:Ceph RBD

对必须在节点丢失后仍然保留的数据使用 Ceph RBD 块 StorageClass。将 <ceph-rbd-class> 替换为平台上 Ceph RBD StorageClass 的名称:

spec:
  nodePools:
    - component: masters
      replicas: 3
      diskSize: 50Gi
      roles:
        - cluster_manager
        - data
      persistence:
        pvc:
          storageClass: <ceph-rbd-class>
          accessModes:
            - ReadWriteOnce

使用 ReadWriteOnce。每个 OpenSearch 节点都需要自己的卷;OpenSearch 会自行在节点之间复制数据。

示例:TopoLVM

TopoLVM 在节点的本地磁盘上提供卷。将 <topolvm-class> 替换为平台上 TopoLVM StorageClass 的名称:

spec:
  nodePools:
    - component: data
      replicas: 3
      diskSize: 200Gi
      roles:
        - data
      persistence:
        pvc:
          storageClass: <topolvm-class>
          accessModes:
            - ReadWriteOnce

本地卷会将其 pod 绑定到创建该卷的节点。如果该节点发生故障,在删除该卷之前,pod 无法在其他位置启动。请确保每个索引至少有一个副本(number_of_replicas 为 1 或更大),并使用 spec.nodePools[].affinity 等方式将节点池中的 pod 分布到不同节点上,以便在一个节点丢失时集群仍保留所有数据。

引导 pod 存储

创建集群时,operator 会启动一个临时引导 pod 来组成集群。该 pod 将数据存储在名为 <cluster-name>-bootstrap-data 的 PVC 中。operator 会在创建集群时创建此 PVC,并在集群组成后将其与引导 pod 一起删除。

spec:
  bootstrap:
    storageClass: <storage-class>
    diskSize: 1Gi
字段含义默认值
spec.bootstrap.storageClass引导 PVC 的 StorageClass见下文
spec.bootstrap.diskSize引导 PVC 的大小1Gi

如果未设置 spec.bootstrap.storageClass,引导 PVC 将按以下顺序使用:

  1. 第一个设置了 persistence.pvc.storageClass 的节点池的存储类,且该节点池具有 cluster_manager(或 master)角色;
  2. 否则,使用第一个设置了存储类的节点池的存储类;
  3. 否则,使用集群的默认 StorageClass。

在大多数情况下,无需设置 spec.bootstrap.storageClass。当集群管理器池使用的类不适合引导 pod 时,请设置此项。

扩展节点池的卷

要增加节点池的磁盘大小,请增大其 diskSize 并应用更改。operator 会调整该节点池的 PVC 大小。要求:

  • StorageClass 必须具有 allowVolumeExpansion: true。
  • 只能增大容量。Kubernetes 不会缩小 PVC。
  • 使用与当前值相同的单位(例如 Gi)。
  • 扩展前请备份数据,并避免同时对集群进行其他更改。

无法更改的内容

  • 现有节点池的存储类。 operator 的准入 webhook 会拒绝更改现有节点池的 persistence.pvc.storageClass,因为 StatefulSet 卷的存储类无法更改。若要使用其他存储类,请使用该存储类创建新集群,并将数据迁移到新集群,例如使用快照和恢复。
  • 现有 PVC 的访问模式。 Kubernetes 不允许更改。

删除集群后的 PVC

默认情况下,删除 OpenSearchCluster 时,不会删除集群节点池的数据 PVC。如果之后在同一命名空间中创建同名集群,新 pod 会重新使用这些 PVC,节点会根据磁盘上的数据重新组成之前的集群;此时不会启动引导 pod。

若要删除数据,请在删除集群后删除 PVC:

kubectl -n my-namespace delete pvc -l opensearch.org/opensearch-cluster=my-cluster

可以通过 spec.general.persistentVolumeClaimRetentionPolicy 更改此行为,该参数会传递给节点池的 StatefulSet(请参阅 Kubernetes 文档中关于 StatefulSet PVC 保留的说明)。


OpenSearch® 是 LF Projects, LLC 的注册商标。