卷挂载和持久卷
Neo4j Helm 图表使用卷挂载和持久卷来管理数据和其他 Neo4j 文件的存储。
卷挂载
卷挂载是 Kubernetes Pod 规范的一部分,它描述了如何在容器内以及在何处挂载卷。
Neo4j Helm 图表创建以下卷挂载
-
backups
挂载到 /backups -
data
挂载到 /data -
import
挂载到 /import -
licenses
挂载到 /licenses -
logs
挂载到 /logs -
metrics
挂载到 /metrics(Neo4j 社区版不会生成metrics
。)
还可以指定 plugins
卷挂载(挂载到 /plugins),但默认 Helm 图表不会创建它。有关更多信息,请参阅 使用 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 类型都假定可以工作。
也不建议使用 HDD 或云存储,例如作为驱动器挂载的 AWS S3。 |
将卷挂载映射到持久卷
默认情况下,Neo4j Helm 图表使用单个名为 data
的 PV 来支持卷挂载。
可以通过修改 Helm 图表值中的 volumes.<volume name>
对象来更改用于每个卷挂载的卷。
Neo4j Helm 图表 volumes
对象支持不同的模式,例如 dynamic
、share
、defaultStorageClass
、volume
、selector
和 volumeClaimTemplate
。从 Neo4j 5.10 开始,您还可以为使用模式 dynamic
、defaultStorageClass
、selector
和 volumeClaimTemplate
的卷在创建时设置标签,这些标签可用于过滤用于卷挂载的 PV。
mode: dynamic
- 描述
-
由于易于管理,动态卷推荐用于大多数生产工作负载。卷挂载由 Kubernetes 使用专用
StorageClass
动态配置的 PV 支持。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
- 描述
-
卷挂载由 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 卷类型。此模式通常用于挂载预先存在的持久卷声明 (PVC)。有关如何指定
volume
对象的详细信息,请参阅 Kubernetes 文档。 - 设置挂载卷上的文件权限
-
Neo4j Helm 图表支持 Kubernetes
volume
对象中不存在的附加字段:setOwnerAndGroupWritableFilePermissions: true|false
。如果设置为true
,则会运行initContainer
来修改挂载卷的文件权限,以便 Neo4j 进程可以写入和读取内容。这是为了帮助解决某些卷实现,这些实现不知道使用它们的 pod 上设置的SecurityContext
。 - 示例 - 引用现有持久卷
-
backups
卷挂载由指定的 PVC 支持。使用此方法时,persistentVolumeClaim
对象必须已经存在。volumes: backups: mode: volume volume: persistentVolumeClaim: claimName: my-neo4j-pvc
mode: selector
- 描述
-
要使用的卷是从现有 PV 中根据提供的
selector
对象和动态生成的 PVC 选择的。如果不存在匹配的 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
在所有情况下,请不要忘记在自定义卷对象时设置
mode
字段。如果未设置,则使用默认的mode
,而不管在volume
对象上设置的其他属性如何。
使用 Neo4j Helm 图表配置持久卷
动态配置持久卷
使用 Neo4j Helm 图表,您可以使用默认或自定义 StorageClass
动态配置 PV。要查看 Kubernetes 集群中可用存储类的列表,请运行以下命令:
kubectl get storageclass
使用专用 StorageClass
配置 PV
对于生产工作负载,建议为 Neo4j 创建一个专用存储类,该存储类使用 Retain
重新声明策略。这样做是为了避免在删除持久卷资源后磁盘被删除时发生数据丢失。
- 示例:使用专用
StorageClass
部署 Neo4j -
以下示例显示如何使用动态配置的 PV 部署 Neo4j 服务器,该 PV 使用专用
storageClass
。-
创建一个使用
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-data
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE neo4j-data pd.csi.storage.gke.io Retain WaitForFirstConsumer true 7s
-
在 EKS 中创建一个使用
Retain
重新声明策略和gp3
高性能 SSD 磁盘的存储类EBS CSI Driver 附加组件是必需的,用于在 EKS 集群中配置 EBS 磁盘。有关安装驱动程序的说明,请参阅 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-data
NAME 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-data
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE neo4j-data disk.csi.azure.com Retain WaitForFirstConsumer true 7s
-
-
使用使用新存储类的
data
卷安装 Neo4j 服务器-
创建一个名为 storage-class-values.yaml 的文件,该文件配置
data
卷以使用新存储类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 pvc
NAME 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
保留策略并删除 PVCexport 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 -
以下示例显示如何使用动态配置的 PV 部署 Neo4j 服务器,该 PV 使用默认
StorageClass
。-
创建一个名为 default-storage-class-values.yaml 的文件,该文件配置
data
卷以使用默认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 图表可以使用手动创建的磁盘来存储 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,这些 PV 具有:
-
storageClassName
使用配置程序kubernetes.io/no-provisioner
。 -
一个
app
标签(在它们的元数据中设置),与 Helm 安装的neo4j.name
值的名称匹配。 -
足够的存储容量——PV 容量必须大于或等于为 Neo4j Helm 版本设置的
volumes.data.selector.requests.storage
值(默认值为100Gi
)。
neo4j/neo4j-persistent-volume Helm 图表提供了一种方便的方式来配置持久卷。 |
- 示例:使用选择器卷部署 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 图表配置持久卷。此命令将创建一个持久卷和一个使用
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
EBS CSI 驱动程序附加组件是为 EKS 集群配置 EBS 磁盘所必需的。您可以运行命令
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 图表配置持久卷。此命令将创建一个持久卷和一个使用
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 图表配置持久卷。此命令将创建一个持久卷和一个使用
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 图表使用 volume
模式支持此方法。
neo4j/neo4j-persistent-volume Helm 图表可用于为手动配置的磁盘创建 PV 和 PVC。完整的示例可以在 Neo4j GitHub 存储库 中找到。例如,要使用名为 my-neo4j-pvc
的预先存在的 PVC,请设置以下值
volumes:
data:
mode: "volume"
volume:
persistentVolumeClaim:
claimName: my-neo4j-pvc
重用持久卷
卸载 Neo4j Helm 图表后,PVC 和 PV 都会保留,并可供新的 Helm 图表安装重用。如果您删除了 PVC,则 PV 将进入 Released
状态,无法重用。
要能够通过新的 Neo4j Helm 图表安装重用 PV,请删除其与先前 PVC 的连接
-
通过运行以下命令编辑 PV
kubectl edit pv <pv-name>
-
删除
spec.claimRef
部分。
PV 将恢复到Available
状态,并可供新的 Neo4j Helm 图表安装重用。
Neo4j 的性能很大程度上取决于其所用存储的延迟、IOPS 容量和吞吐量。为了获得 Neo4j 的最佳性能,请使用最佳可用磁盘(例如 SSD)并将 IOPS 限制/配额设置为高值。对于一些云提供商,IOPS 限制与卷的大小成正比。在这种情况下,通过根据所需的 IOPS 而不是数据存储所需的量来设置卷的大小,可以实现最佳性能。 |
hostPath
卷的方式不一致。