卷挂载和持久卷
Neo4j Helm Chart 使用卷挂载和持久卷来管理数据及其他 Neo4j 文件的存储。
卷挂载
卷挂载 (Volume mount) 是 Kubernetes Pod 规范的一部分,用于描述卷如何在容器内挂载以及挂载到何处。
Neo4j Helm Chart 创建以下卷挂载:
-
backups:挂载于 /backups -
data:挂载于 /data -
import:挂载于 /import -
licenses:挂载于 /licenses -
logs:挂载于 /logs -
metrics:挂载于 /metrics (Neo4j 社区版不生成metrics。)
也可以指定 plugins 卷挂载(挂载于 /plugins),但这并非由默认 Helm Chart 创建。有关更多信息,请参阅使用 plugins 卷添加插件。
持久卷
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 卷挂载不支持 azureFile 和 nfs。
|
|
对于除 data 卷挂载以外的其他卷挂载,通常假定所有 PV 类型均可工作。
|
只要使用合适的底层存储(如 SSD), 也不建议使用 HDD 或云存储(例如作为驱动器挂载的 AWS S3)。 |
将卷挂载映射到持久卷
默认情况下,Neo4j Helm Chart 使用名为 data 的单个 PV 来支持卷挂载。
可以通过修改 Helm Chart 值中的 volumes.<volume name> 对象来更改每个卷挂载所使用的卷。
Neo4j Helm Chart 的 volumes 对象支持多种模式,例如 dynamic、share、defaultStorageClass、volume、selector 和 volumeClaimTemplate。您还可以为模式为 dynamic、defaultStorageClass、selector 和 volumeClaimTemplate 的卷在创建时设置标签,该标签可用于过滤用于卷挂载的 PV。
mode: dynamic推荐
- 描述
-
由于易于管理,对于大多数生产工作负载,推荐使用动态卷。卷挂载由 PV 提供支持,该 PV 由 Kubernetes 使用专用的
StorageClass动态配置。StorageClass在storageClassName字段中指定。 - 示例
-
数据卷使用专用的存储类
storage-class-values.yamlneo4j: name: standalone-with-storage-class volumes: data: labels: data: "true" mode: dynamic dynamic: storageClassName: "neo4j-data" requests: storage: 10Gi有关更多信息,请参阅使用专用 StorageClass 配置 PV。
mode: share
- 描述
-
卷挂载共享来自其他卷对象之一的底层卷。
- 示例
-
logs卷挂载使用data卷(这是默认行为)。volumes: logs: mode: "share" share: name: "data"
mode: defaultStorageClass
- 描述
-
卷挂载由 PV 提供支持,该 PV 由 Kubernetes 使用默认的
StorageClass动态配置。 - 示例
-
一个大小为
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 卷类型。此模式通常用于挂载预先存在的持久卷声明 (PVC)。有关如何指定
volume对象的详细信息,请参阅 Kubernetes 文档。 - 设置挂载卷的文件权限
-
Neo4j Helm Chart 支持一个在普通 Kubernetes
volume对象中不存在的额外字段:setOwnerAndGroupWritableFilePermissions: true|false。如果设置为true,将运行一个initContainer来修改挂载卷的文件权限,以便 Neo4j 进程可以读写其中的内容。这是为了帮助解决某些不支持 PodSecurityContext设置的卷实现问题。 - 示例 - 引用现有的 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"
|
对于 |
mode: volumeClaimTemplate
- 描述
-
为卷挂载指定一个完整的 Kubernetes
volumeClaimTemplate对象。以这种方式指定的卷是动态配置的。 - 示例 - 使用卷声明模板配置 Neo4j 存储
-
数据卷使用来自
default存储类的动态配置 PVC。volumes: data: labels: data: "true" mode: volumeClaimTemplate volumeClaimTemplate: storageClassName: "default" accessModes: - ReadWriteOnce resources: requests: storage: 10Gi在任何情况下,自定义 volumes 对象时都不要忘记设置
mode字段。如果未设置,无论volume对象上设置了哪些其他属性,都会使用默认的mode。
使用 Neo4j Helm Chart 配置持久卷
动态配置持久卷
使用 Neo4j Helm Chart,您可以使用默认或自定义的 StorageClass 动态配置 PV。要查看 Kubernetes 集群中可用存储类的列表,请运行以下命令:
kubectl get storageclass
使用专用 StorageClass 配置 PV推荐
对于生产工作负载,建议为 Neo4j 创建一个专用存储类,该存储类使用 Retain 回收策略。这是为了避免在删除持久卷资源后删除磁盘导致数据丢失。
- 示例:使用专用
StorageClass部署 Neo4j -
以下示例展示了如何部署带有使用专用
storageClass的动态配置 PV 的 Neo4j 服务器。-
创建一个使用
Retain回收策略的专用存储类-
在 GKE 中创建一个使用
Retain回收策略和pd-ssd高性能 SSD 磁盘的存储类cat <<EOF | kubectl apply -f - apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: neo4j-data provisioner: pd.csi.storage.gke.io parameters: type: pd-ssd reclaimPolicy: Retain volumeBindingMode: WaitForFirstConsumer allowVolumeExpansion: true EOF -
检查存储类是否已创建
kubectl get storageclass neo4j-dataNAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE neo4j-data pd.csi.storage.gke.io Retain WaitForFirstConsumer true 7s
-
在 EKS 中创建一个使用
Retain回收策略和gp3高性能 SSD 磁盘的存储类在 EKS 集群中配置 EBS 磁盘需要 EBS CSI 驱动插件。有关安装驱动程序的说明,请参阅 AWS 文档。
cat <<EOF | kubectl apply -f - kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: neo4j-data provisioner: ebs.csi.aws.com parameters: type: gp3 reclaimPolicy: Retain allowVolumeExpansion: true volumeBindingMode: WaitForFirstConsumer EOF -
检查存储类是否已创建
kubectl get storageclass neo4j-dataNAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE neo4j-data ebs.csi.aws.com Retain WaitForFirstConsumer true 2m41s
-
在 AKS 中创建一个使用
Retain回收策略和pd-ssd高性能 SSD 磁盘的存储类cat <<EOF | kubectl apply -f - apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: neo4j-data provisioner: disk.csi.azure.com parameters: skuName: Premium_LRS reclaimPolicy: Retain volumeBindingMode: WaitForFirstConsumer allowVolumeExpansion: true EOF -
检查存储类是否已创建
kubectl get storageclass neo4j-dataNAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE neo4j-data disk.csi.azure.com Retain WaitForFirstConsumer true 7s
-
-
安装一个使用新存储类数据卷的 Neo4j 服务器
-
创建一个 storage-class-values.yaml 文件,将数据卷配置为使用新的存储类
storage-class-values.yamlneo4j: name: standalone-with-storage-class volumes: data: mode: dynamic dynamic: storageClassName: "neo4j-data" requests: storage: 10Gi -
安装单个 Neo4j 服务器
helm install standalone-with-storage-class neo4j -f storage-class-values.yaml -
安装完成后,验证是否已创建 PVC
kubectl get pvcNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE data-standalone-with-storage-class-0 Bound pvc-5d400f06-f99f-43ac-bf37-6079d692eaac 10Gi RWO neo4j-data 23m
-
-
清理资源
该存储类使用
Retain保留策略,这意味着在删除 PVC 后磁盘将不会被删除。要删除磁盘,请修补 PVC 以使用Delete保留策略,然后删除 PVC。export pv_name=$(kubectl get pvc data-standalone-with-storage-class-0 -o jsonpath='{.spec.volumeName}') kubectl patch pv $pv_name -p '{"spec":{"persistentVolumeReclaimPolicy": "Delete"}}' kubectl delete pvc data-standalone-with-storage-class-0对于
data卷,如果未设置requests.storage,dynamic默认为100Gi卷。对于所有其他卷,当使用dynamic模式时,必须显式设置dynamic.requests.storage。
-
使用 defaultStorageClass 配置 PV
使用运行中的 Kubernetes 集群的默认 StorageClass 是针对简单测试快速启动和运行 Neo4j(处理少量数据)的最快方法。但是,不建议用于大量数据,因为它可能会导致性能问题。
- 示例:使用
defaultStorageClass部署 Neo4j -
以下示例展示了如何部署带有使用默认
StorageClass的动态配置 PV 的 Neo4j 服务器。-
创建一个 default-storage-class-values.yaml 文件,将数据卷配置为使用默认
StorageClass和100Gi的存储大小storage-class-values.yamlvolumes: data: mode: "defaultStorageClass" defaultStorageClass: requests: storage: 100Gi -
安装单个 Neo4j 服务器
helm install standalone-with-default-storage-class neo4j -f default-storage-class-values.yaml
-
手动配置持久卷
可选地,Helm Chart 可以为 Neo4j 存储使用手动创建的磁盘。与使用动态卷相比,此安装选项步骤更多,但它确实提供了对磁盘如何配置的更多控制。
手动配置 PV 的说明因所使用的 PV 类型和底层基础设施而异。通常有两个步骤:
-
在底层基础设施中创建要用于存储的磁盘/卷。例如:
-
如果使用
csi卷 — 使用云提供商 CLI 或控制台创建持久磁盘。 -
如果使用
hostPath卷 — 在宿主机节点上创建路径(目录)。
-
-
在 Kubernetes 中创建一个引用步骤 1 中创建的底层资源的 PV。
-
确保创建的 PV 的
app标签与 Neo4j Helm 发行版的名称相匹配。 -
确保创建的 PV 的
capacity.storage与底层基础设施上可用的存储相匹配。
-
如果没有合适的 PV 或 PVC 存在,Neo4j Pod 将无法启动。
使用 PV 选择器为 Neo4j 存储配置 PV
Neo4j StatefulSet 可以根据其标签选择要使用的持久卷。Neo4j Helm 发行版仅使用满足以下条件的已手动配置的 PV:
-
storageClassName使用 provisionerkubernetes.io/no-provisioner。 -
一个
app标签 — 设置在它们的元数据中,与 Helm 安装的neo4j.name值相匹配。 -
足够的存储容量 — PV 容量必须大于或等于为 Neo4j Helm 发行版设置的
volumes.data.selector.requests.storage值(默认值为100Gi)。
|
neo4j/neo4j-persistent-volume Helm Chart 提供了一种配置持久卷的便捷方法。 |
- 示例:使用选择器卷部署 Neo4j
-
以下示例展示了如何使用选择器卷部署 Neo4j。
-
创建一个 persistent-volume-selector.yaml 文件,将数据卷配置为使用选择器
storage-class-values.yamlneo4j: name: volume-selector volumes: data: mode: selector selector: storageClassName: "manual" accessModes: - ReadWriteOnce requests: storage: 10Gi -
导出命令要使用的环境变量
export RELEASE_NAME=volume-selector export GCP_ZONE="$(gcloud config get compute/zone)" export GCP_PROJECT="$(gcloud config get project)" -
创建持久卷要使用的磁盘
gcloud compute disks create --size 10Gi --type pd-ssd "${RELEASE_NAME}" -
使用 neo4j/neo4j-persistent-volume Chart 配置持久卷。此命令将创建一个持久卷和一个使用
kubernetes.io/no-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 -
现在使用之前创建的
persistent-volume-selector.yaml安装 Neo4jhelm install "${RELEASE_NAME}" neo4j/neo4j -f persistent-volume-selector.yaml -
清理 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 驱动插件。您可以运行命令
kubectl get daemonset ebs-csi-node -n kube-system来检查是否已安装。有关安装驱动程序的说明,请参阅 AWS 文档。-
创建一个
persistent-volume-selector.yaml文件,将数据卷配置为使用选择器storage-class-values.yamlneo4j: name: volume-selector volumes: data: mode: selector selector: storageClassName: "manual" accessModes: - ReadWriteOnce requests: storage: 10Gi -
导出命令要使用的环境变量
readonly RELEASE_NAME=volume-selector readonly AWS_ZONE={availability zone of EKS cluster} -
创建持久卷要使用的磁盘
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) -
使用 neo4j/neo4j-persistent-volume Chart 配置持久卷。此命令将创建一个持久卷和一个使用
kubernetes.io/no-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 -
现在使用之前创建的
persistent-volume-selector.yaml安装 Neo4jhelm install "${RELEASE_NAME}" neo4j/neo4j -f persistent-volume-selector.yaml -
清理 Helm 安装和为示例创建的磁盘
helm uninstall ${RELEASE_NAME} ${RELEASE_NAME}-disk kubectl delete pvc data-${RELEASE_NAME}-0 aws ec2 delete-volume --volume-id ${volumeId}
-
创建一个
persistent-volume-selector.yaml文件,将数据卷配置为使用选择器storage-class-values.yamlneo4j: name: volume-selector volumes: data: mode: selector selector: storageClassName: "manual" accessModes: - ReadWriteOnce requests: storage: 10Gi -
导出命令要使用的环境变量
readonly AKS_CLUSTER_NAME={AKS Cluster name} readonly AZ_RESOURCE_GROUP={Resource group of cluster} readonly AZ_LOCATION={Location of cluster} -
创建持久卷要使用的磁盘
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) -
使用 neo4j/neo4j-persistent-volume Chart 配置持久卷。此命令将创建一个持久卷和一个使用
kubernetes.io/no-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 -
现在使用之前创建的
persistent-volume-selector.yaml安装 Neo4jhelm install "${RELEASE_NAME}" neo4j/neo4j -f persistent-volume-selector.yaml -
清理 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 状态且无法再重用。
要使 PV 能被 Neo4j Helm Chart 的新安装重用,请移除其与先前 PVC 的连接:
-
运行以下命令编辑 PV
kubectl edit pv <pv-name> -
移除
spec.claimRef部分。
PV 将回到Available状态,并可被 Neo4j Helm Chart 的新安装重用。
|
Neo4j 的性能在很大程度上取决于其所使用存储的延迟、IOPS 容量和吞吐量。为获得 Neo4j 的最佳性能,请使用可用的最佳磁盘(如 SSD),并将 IOPS 节流/配额设置为高值。对于某些云提供商,IOPS 节流与卷的大小成正比。在这种情况下,最佳性能是通过根据期望的 IOPS 而不是数据存储所需量来设置卷大小来实现的。 |
hostPath 卷存在不一致,因此不建议使用。