卷挂载和持久卷

Neo4j Helm chart 使用卷挂载和持久卷来管理数据和其他 Neo4j 文件的存储。

卷挂载

卷挂载是 Kubernetes Pod 规范的一部分,描述了卷在容器内如何以及在何处挂载。

Neo4j Helm chart 创建以下卷挂载

  • backups 挂载在 /backups

  • data 挂载在 /data

  • import 挂载在 /import

  • licenses 挂载在 /licenses

  • logs 挂载在 /logs

  • metrics 挂载在 /metrics (Neo4j 社区版不生成 metrics。)

也可以指定一个 plugins 卷挂载(挂载在 /plugins),但默认的 Helm chart 不会创建它。更多信息,请参阅使用插件卷添加插件

持久卷

PersistentVolume (PV) 是 Kubernetes 集群中的一种存储资源,其生命周期独立于使用该 PV 的任何单个 Pod。
PersistentVolumeClaim (PVC) 是用户对存储资源的请求。PVC 消耗 PV 资源。有关 PV 是什么以及它们如何工作的更多信息,请参阅 Kubernetes 官方文档

所使用的 PV 类型及其配置对 Neo4j 的性能有显著影响。某些 PV 类型根本不适合与 Neo4j 一起使用。

用于 data 卷挂载的卷类型尤为重要。Neo4j 支持 data 卷挂载的以下 PV 类型

  • persistentVolumeClaim

  • 使用 Docker Desktop 时的 hostPath [1]

Neo4j data 卷挂载不支持 azureFilenfs

awsElasticBlockStoreazureDiskgcePersistentDisk 现在是 Kubernetes 中已弃用的卷类型,Neo4j Helm chart 不再支持它们的使用。如果您目前使用这些卷类型之一,请查阅您的 Kubernetes 供应商文档,了解如何迁移到基于容器存储接口 (CSI) 驱动程序的存储。

对于 data 卷挂载以外的卷挂载,通常假定所有 PV 类型都可用。

hostPathlocalemptyDir 类型在使用了合适的底层存储(例如 SSD)的情况下,预期会表现良好。但是,这些卷类型具有操作限制,不建议使用。

也不建议使用 HDD 或云存储(例如挂载为驱动器的 AWS S3)。

将卷挂载映射到持久卷

默认情况下,Neo4j Helm chart 使用名为 data 的单个 PV 来支持卷挂载。

可以通过修改 Helm chart 值中的 volumes.<volume name> 对象来更改每个卷挂载所使用的卷。

Neo4j Helm chart 的 volumes 对象支持不同的模式,例如 dynamicsharedefaultStorageClassvolumeselectorvolumeClaimTemplate。您还可以在创建时为 dynamicdefaultStorageClassselectorvolumeClaimTemplate 模式的卷设置标签,该标签可用于过滤用于卷挂载的 PV。

mode: share

描述

卷挂载共享来自其他卷对象之一的底层卷。

示例

logs 卷挂载使用 data 卷(这是默认行为)。

volumes:
  logs:
    mode: "share"
    share:
      name: "data"

mode: defaultStorageClass

描述

卷挂载由 Kubernetes 使用默认 StorageClass 动态配置的 PV 支持。

示例

一个大小为 10Gi 的动态配置 data 卷。

volumes:
  data:
    labels:
        data: "true"
    mode: "defaultStorageClass"
    defaultStorageClass:
      requests:
        storage: 10Gi

对于 data 卷,如果未设置 requests.storage,则 defaultStorageClass 默认为 10Gi 卷。对于所有其他卷,在使用 defaultStorageClass 模式时必须显式设置 defaultStorageClass.requests.storage

mode: volume

描述

可以为卷挂载指定一个完整的 Kubernetes volume 对象。通常,以这种方式指定的卷必须手动配置。

volume 可以是任何有效的 Kubernetes 卷类型。此模式通常用于挂载预先存在的 Persistent Volume Claim (PVC)。

有关如何指定 volume 对象的详细信息,请参阅Kubernetes 文档

设置挂载卷上的文件权限

Neo4j Helm chart 支持一个普通 Kubernetes volume 对象中没有的额外字段:setOwnerAndGroupWritableFilePermissions: true|false。如果设置为 true,将运行一个 initContainer 来修改挂载卷的文件权限,以便 Neo4j 进程可以写入和读取其内容。这有助于解决某些卷实现不识别使用它们的 Pod 上设置的 SecurityContext 的问题。

示例 - 引用现有 PersistentVolume

backups 卷挂载由指定的 PVC 支持。使用此方法时,persistentVolumeClaim 对象必须已经存在。

volumes:
  backups:
    mode: volume
    volume:
      persistentVolumeClaim:
        claimName: my-neo4j-pvc

mode: selector

描述

要使用的卷是根据提供的 selector 对象和动态生成的 PVC 从现有 PV 中选择的。

如果没有匹配的 PV 存在,Neo4j Pod 将无法启动。为了匹配,PV 必须具有指定的 StorageClass、匹配标签 selectorTemplate,并具有足够的存储容量以满足请求的存储量。

示例

data 卷从具有 neo4j 存储类和标签 developer: alice 的可用卷中选择。

volumes:
  import:
    labels:
        import: "true"
    mode: selector
    selector:
      storageClassName: "neo4j"
      requests:
        storage: 128Gi
      selectorTemplate:
        matchLabels:
          developer: "alice"

对于 data 卷,如果未设置 requests.storage,则 selector 默认为 100Gi 卷。对于所有其他卷,在使用 selector 模式时必须显式设置 selector.requests.storage

mode: volumeClaimTemplate

描述

为卷挂载指定了一个完整的 Kubernetes volumeClaimTemplate 对象。以这种方式指定的卷是动态配置的。

示例 - 使用卷声明模板配置 Neo4j 存储

数据卷使用 default 存储类中动态配置的 PVC。

volumes:
  data:
    labels:
        data: "true"
    mode: volumeClaimTemplate
    volumeClaimTemplate:
      storageClassName: "default"
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi

在所有情况下,自定义卷对象时请不要忘记设置 mode 字段。如果未设置,将使用默认 mode,而不管 volume 对象上设置的其他属性。

使用 Neo4j Helm chart 配置持久卷

动态配置持久卷

使用 Neo4j Helm chart,您可以使用默认或自定义 StorageClass 动态配置 PV。要查看 Kubernetes 集群中可用存储类的列表,请运行以下命令

kubectl get storageclass

使用 defaultStorageClass 配置 PV

使用正在运行的 Kubernetes 集群的默认 StorageClass 是快速启动和运行 Neo4j 进行简单测试、处理少量数据的最快方法。但是,不建议用于大量数据,因为它可能导致性能问题。

示例:使用 defaultStorageClass 部署 Neo4j

以下示例展示了如何部署一个 Neo4j 服务器,该服务器带有一个使用默认 StorageClass 动态配置的 PV。

  1. 创建文件 default-storage-class-values.yaml,配置数据卷使用默认 StorageClass100Gi 的存储大小

    storage-class-values.yaml
    volumes:
      data:
        mode: "defaultStorageClass"
        defaultStorageClass:
          requests:
            storage: 100Gi
  2. 安装单个 Neo4j 服务器

    helm install standalone-with-default-storage-class neo4j -f default-storage-class-values.yaml

手动配置持久卷

或者,Helm chart 可以使用手动创建的磁盘进行 Neo4j 存储。此安装选项比使用动态卷有更多步骤,但它提供了对磁盘配置方式的更多控制。

手动配置 PV 的说明因所使用的 PV 类型和底层基础设施而异。通常,有以下两个步骤

  1. 在底层基础设施中创建用于存储的磁盘/卷。例如

    • 如果使用 csi 卷 — 使用云提供商 CLI 或控制台创建持久磁盘。

    • 如果使用 hostPath 卷 — 在主机节点上创建路径(目录)。

  2. 在 Kubernetes 中创建一个 PV,引用步骤 1 中创建的底层资源。

    1. 确保创建的 PV 的 app 标签与 Neo4j Helm 版本名称匹配。

    2. 确保创建的 PV 的 capacity.storage 与底层基础设施上可用的存储匹配。

如果没有合适的 PV 或 PVC 存在,Neo4j Pod 将无法启动。

Neo4j StatefulSet 可以根据标签选择要使用的持久卷。Neo4j Helm 版本仅使用手动配置的 PV,这些 PV 具有

  • 使用 provisioner kubernetes.io/no-provisionerstorageClassName

  • 一个 app 标签 — 在其元数据中设置,与 Helm 安装的 neo4j.name 值匹配。

  • 足够的存储容量 — PV 容量必须大于或等于为 Neo4j Helm 版本设置的 volumes.data.selector.requests.storage 值(默认为 100Gi)。

neo4j/neo4j-persistent-volume Helm chart 提供了一种方便的方法来配置持久卷。

示例:使用选择器卷部署 Neo4j

以下示例展示了如何使用选择器卷部署 Neo4j。

  1. 创建文件 persistent-volume-selector.yaml,配置数据卷使用选择器

    storage-class-values.yaml
    neo4j:
      name: volume-selector
    volumes:
      data:
        mode: selector
        selector:
          storageClassName: "manual"
          accessModes:
            - ReadWriteOnce
          requests:
            storage: 10Gi
  2. 导出命令将使用的环境变量

    export RELEASE_NAME=volume-selector
    export GCP_ZONE="$(gcloud config get compute/zone)"
    export GCP_PROJECT="$(gcloud config get project)"
  3. 创建持久卷将使用的磁盘

    gcloud compute disks create --size 10Gi --type pd-ssd "${RELEASE_NAME}"
  4. 使用 neo4j/neo4j-persistent-volume chart 配置持久卷。此命令将创建一个持久卷和一个使用 kubernetes.io/no-provisioner provisioner 的手动存储类。

    helm install "${RELEASE_NAME}"-disk neo4j/neo4j-persistent-volume \
           --set neo4j.name="${RELEASE_NAME}" \
           --set data.driver=pd.csi.storage.gke.io \
           --set data.storageClassName="manual" \
           --set data.reclaimPolicy="Delete" \
           --set data.createPvc=false \
           --set data.createStorageClass=true \
           --set data.volumeHandle="projects/${GCP_PROJECT}/zones/${GCP_ZONE}/disks/${RELEASE_NAME}" \
           --set data.capacity.storage=10Gi
  5. 现在使用之前创建的 persistent-volume-selector.yaml 安装 Neo4j

    helm install "${RELEASE_NAME}" neo4j/neo4j -f persistent-volume-selector.yaml
  6. 清理 helm 安装和为示例创建的磁盘

    helm uninstall ${RELEASE_NAME} ${RELEASE_NAME}-disk
    kubectl delete pvc data-${RELEASE_NAME}-0
    gcloud compute disks delete ${RELEASE_NAME} --quiet

在 EKS 集群中配置 EBS 磁盘需要 EBS CSI Driver 附加组件。您可以运行命令 kubectl get daemonset ebs-csi-node -n kube-system 来检查是否已安装。有关安装驱动程序的说明,请参阅 AWS 文档

  1. 创建文件 persistent-volume-selector.yaml,配置数据卷使用选择器

    storage-class-values.yaml
    neo4j:
      name: volume-selector
    volumes:
      data:
        mode: selector
        selector:
          storageClassName: "manual"
          accessModes:
            - ReadWriteOnce
          requests:
            storage: 10Gi
  2. 导出命令将使用的环境变量

    readonly RELEASE_NAME=volume-selector
    readonly AWS_ZONE={availability zone of EKS cluster}
  3. 创建持久卷将使用的磁盘

    export volumeId=$(aws ec2 create-volume \
                        --availability-zone="${AWS_ZONE}" \
                        --size=10 \
                        --volume-type=gp3 \
                        --tag-specifications 'ResourceType=volume,Tags=[{Key=volume,Value='"${RELEASE_NAME}"'}]' \
                        --no-cli-pager \
                        --output text \
                        --query VolumeId)
  4. 使用 neo4j/neo4j-persistent-volume chart 配置持久卷。此命令将创建一个持久卷和一个使用 kubernetes.io/no-provisioner provisioner 的手动存储类。

    helm install "${RELEASE_NAME}"-disk neo4j-persistent-volume \
        --set neo4j.name="${RELEASE_NAME}" \
        --set data.driver=ebs.csi.aws.com \
        --set data.reclaimPolicy="Delete" \
        --set data.createPvc=false \
        --set data.createStorageClass=true \
        --set data.volumeHandle="${volumeId}" \
        --set data.capacity.storage=10Gi
  5. 现在使用之前创建的 persistent-volume-selector.yaml 安装 Neo4j

    helm install "${RELEASE_NAME}" neo4j/neo4j -f persistent-volume-selector.yaml
  6. 清理 helm 安装和为示例创建的磁盘

    helm uninstall ${RELEASE_NAME} ${RELEASE_NAME}-disk
        kubectl delete pvc data-${RELEASE_NAME}-0
        aws ec2 delete-volume --volume-id ${volumeId}
  1. 创建文件 persistent-volume-selector.yaml,配置数据卷使用选择器

    storage-class-values.yaml
    neo4j:
      name: volume-selector
    volumes:
      data:
        mode: selector
        selector:
          storageClassName: "manual"
          accessModes:
            - ReadWriteOnce
          requests:
            storage: 10Gi
  2. 导出命令将使用的环境变量

    readonly AKS_CLUSTER_NAME={AKS Cluster name}
    readonly AZ_RESOURCE_GROUP={Resource group of cluster}
    readonly AZ_LOCATION={Location of cluster}
  3. 创建持久卷将使用的磁盘

    export node_resource_group=$(az aks show --resource-group "${AZ_RESOURCE_GROUP}" --name "${AKS_CLUSTER_NAME}" --query nodeResourceGroup -o tsv)
    export disk_id=$(az disk create --name "${RELEASE_NAME}" --size-gb "10" --max-shares 1 --resource-group "${node_resource_group}" --location ${AZ_LOCATION} --output tsv --query id)
  4. 使用 neo4j/neo4j-persistent-volume chart 配置持久卷。此命令将创建一个持久卷和一个使用 kubernetes.io/no-provisioner provisioner 的手动存储类。

    helm install "${RELEASE_NAME}"-disk neo4j-persistent-volume \
        --set neo4j.name="${RELEASE_NAME}" \
        --set data.driver=disk.csi.azure.com \
        --set data.storageClassName="manual" \
        --set data.reclaimPolicy="Delete" \
        --set data.createPvc=false \
        --set data.createStorageClass=true \
        --set data.volumeHandle="${disk_id}" \
        --set data.capacity.storage=10Gi
  5. 现在使用之前创建的 persistent-volume-selector.yaml 安装 Neo4j

    helm install "${RELEASE_NAME}" neo4j/neo4j -f persistent-volume-selector.yaml
  6. 清理 helm 安装和为示例创建的磁盘

    helm uninstall ${RELEASE_NAME} ${RELEASE_NAME}-disk
    kubectl delete pvc data-${RELEASE_NAME}-0
    az disk delete --name ${RELEASE_NAME} -y

为 Neo4j 存储配置 PVC

手动配置的另一种方法是使用手动配置的 PVC。Neo4j Helm chart 使用 volume 模式支持此方法。

neo4j/neo4j-persistent-volume Helm chart 可用于为手动配置的磁盘创建 PV 和 PVC。完整示例可在 Neo4j GitHub 仓库中找到。例如,要使用名为 my-neo4j-pvc 的预先存在的 PVC,请设置以下值

volumes:
  data:
    mode: "volume"
    volume:
      persistentVolumeClaim:
        claimName: my-neo4j-pvc

重用持久卷

卸载 Neo4j Helm chart 后,PVC 和 PV 都将保留,并可由 Helm chart 的新安装重用。如果您删除 PVC,PV 将进入 Released 状态,并且将不可重用。

为了能够由 Neo4j Helm chart 的新安装重用 PV,请移除其与先前 PVC 的连接

  1. 通过运行以下命令编辑 PV

    kubectl edit pv <pv-name>
  2. 移除 spec.claimRef 部分。
    PV 将返回 Available 状态,并可由 Neo4j Helm chart 的新安装重用。

Neo4j 的性能很大程度上取决于其所用存储的延迟、IOPS 容量和吞吐量。为了获得 Neo4j 的最佳性能,请使用最佳可用磁盘(例如 SSD)并将 IOPS 限制/配额设置为高值。对于某些云提供商,IOPS 限制与卷的大小成比例。在这些情况下,通过根据所需的 IOPS 而不是数据存储所需的量来设置卷的大小,可以获得最佳性能。


1. 不推荐,因为 Docker Desktop 在处理 hostPath 卷时存在不一致性。
© . All rights reserved.