备份 Neo4j 容器
此方法支持 Google Cloud、AWS 和 Azure 存储,并假设您拥有凭据并希望将备份存储在这些云存储系统中。如果不是这种情况,您将需要根据所需的云存储方法调整备份脚本,但此方法适用于任何备份位置。 |
此方法仅适用于 Neo4j 4.0+。备份工具和 DBMS 本身在 3.5 和 4.0 之间发生了很大变化,此处的策略在未经大量修改的情况下可能不适用于旧版本数据库。 |
如果您正在从早期版本升级到 helm chart 4.1.3-1 或更高版本,请仔细检查此文档;使用备份 chart 的语法已有所更改,以适应多个云。此文档仅适用于 4.1.3-1 及更高版本。 |
背景与重要信息
所需的 Neo4j 配置
Helm chart 开箱即用,但如果您进行自定义,则应牢记这些要求
-
dbms.backup.enabled=true
-
dbms.backup.listen_address=0.0.0.0:6362
Neo4j 的默认设置是只监听 127.0.0.1,这将不起作用,因为其他容器将无法访问备份端口。
备份存储
备份在上传到云端之前会存储在临时本地卷中。默认情况下使用临时 Kubernetes emptyDir
卷。
如果备份的数据库很大,本地存储空间可能不足。要使用替代存储,请在 values.yaml 中将 tempVolume
设置为不同的 Kubernetes Volume 对象。
执行备份的步骤
使用服务账号访问云存储(仅限 Google Cloud)
GCP
工作负载身份 (Workload Identity) 是从 GKE 中运行的应用程序访问 Google Cloud 服务的推荐方式,因为它具有更高的安全性和可管理性。
按照 GCP 说明执行以下操作:
-
在 GKE 集群上启用工作负载身份
-
创建一个对备份位置具有读写权限的 Google Cloud IAMServiceAccount
-
将 IAMServiceAccount 绑定到 Neo4j 部署的 Kubernetes ServiceAccount*
[*] 您可以通过在 values.yaml 中设置 serviceAccountName
来配置 Neo4j 部署使用的 Kubernetes ServiceAccount 的名称。要检查 Neo4j 部署正在使用的 Kubernetes ServiceAccount 的名称,请运行 kubectl get pods -o=jsonpath='{.spec.serviceAccountName}{"\n"}' <您的 neo4j Pod 名称>
如果您无法将工作负载身份与 GKE 配合使用,则可以按照下一节中的说明改为创建服务密钥 secret。
创建服务密钥 secret 以访问云存储
首先,您需要创建一个包含您的账号服务密钥内容的 Kubernetes secret。此密钥必须具有访问您尝试恢复的 bucket 和备份集的权限。
Azure
-
您必须创建凭证文件,此文件应如下所示
export ACCOUNT_NAME=<NAME_STORAGE_ACCOUNT>
export ACCOUNT_KEY=<STORAGE_ACCOUNT_KEY>
如果您不确定账号密钥 secret 应该是什么,可以使用以下命令恢复它
ACCOUNT_KEY=$(az storage account keys list --resource-group "$AKS_RESOURCE_GROUP" --account-name "$STORAGE_ACCOUNT" --query [0].value -o tsv)
-
您必须为该文件创建 secret
kubectl create secret generic neo4j-azure-credentials \
--from-file=credentials=azure-credentials.sh
AWS
-
您必须创建凭证文件,此文件应如下所示
[default]
region=
aws_access_key_id=
aws_secret_access_key=
-
您必须为该文件创建 secret
kubectl create secret generic neo4j-aws-credentials \
--from-file=credentials=aws-credentials
GCP
如果您正在使用 GCP 的工作负载身份,则无需遵循本节中的步骤。
从 Google Cloud 下载一个 JSON 格式的服务密钥,它看起来像这样
{
"type": "",
"project_id": "",
"private_key_id": "",
"private_key": "",
"client_email": "",
"client_id": "",
"auth_uri": "",
"token_uri": "",
"auth_provider_x509_cert_url": "",
"client_x509_cert_url": ""
}
-
您必须为该文件创建 secret
kubectl create secret generic neo4j-gcp-credentials \
--from-file=credentials=gcp-credentials.json
这里的“--from-file=credentials=<您的配置路径>”很重要;secret 下的凭证必须命名为 credentials |
运行备份
备份方法本身就是一个迷你 helm chart,因此要运行备份,您只需执行此操作,例如一个最基本的要求
此命令必须在 'https://github.com/neo4j-contrib/neo4j-helm/tree/master/tools/backup' 中运行 |
AWS
helm install my-neo4j-backup . \
--set neo4jaddr=my-neo4j.default.svc.cluster.local:6362 \
--set bucket=s3://my-bucket \
--set database="neo4j\,system" \
--set cloudProvider=aws \
--set secretName=neo4j-aws-credentials \
--set jobSchedule="0 */12 * * *"
GCP(使用工作负载身份)
helm install my-neo4j-backup . \
--set neo4jaddr=my-neo4j.default.svc.cluster.local:6362 \
--set bucket=gs://my-bucket \
--set database="neo4j\,system" \
--set cloudProvider=gcp \
--set secretName=NULL \
--set serviceAccountName=my-neo4j-backup-sa \
--set jobSchedule="0 */12 * * *"
GCP(使用服务密钥 secret)
helm install my-neo4j-backup . \
--set neo4jaddr=my-neo4j.default.svc.cluster.local:6362 \
--set bucket=gs://my-bucket \
--set database="neo4j\,system" \
--set cloudProvider=gcp \
--set secretName=neo4j-gcp-credentials \
--set jobSchedule="0 */12 * * *"
Azure
helm install my-neo4j-backup . \
--set neo4jaddr=my-neo4j.default.svc.cluster.local:6362 \
--set bucket=my-blob-container-name \
--set database="neo4j\,system" \
--set cloudProvider=azure \
--set secretName=neo4j-azure-credentials \
--set jobSchedule="0 */12 * * *"
Azure 存储的特别说明。chart 需要一个“bucket”,但对于 Azure 存储,命名略有不同;指定的 bucket 是将文件放置的“blob 容器名称”。相对路径将被遵守;如果您将 bucket 设置为 container/path/to/directory ,那么您将在 container 中找到您的备份文件,路径为 /path/to/directory/db/db-latest.tar.gz ,其中“db”是正在备份的数据库的名称(即 neo4j 和 system)。 |
如果一切顺利,在 Kubernetes Job 完成一段时间后,您将简单地看到备份文件出现在指定的 bucket 中,位于以您备份的数据库命名的目录下。
如果您的备份未出现,请查阅 job 的 pod 容器日志以了解原因 |
如果您想在计划之前获取热备份,可以使用此命令
kubectl create job --from=cronjob/my-neo4j-backup-job neo4j-hot-backup
所需参数
-
neo4jaddr
指向集群运行的地址,理想情况下是发现地址。 -
bucket
您希望将备份复制到的位置。它应该是gs://bucketname
或s3://bucketname
。 -
databases
要备份的数据库的逗号分隔列表。默认值为neo4j,system
。如果您的 DBMS 有许多单独的数据库,您应该更改此项。 -
cloudProvider
您希望将备份保留在哪个云服务上?(gcp 或 aws) -
jobSchedule
您希望多久进行一次备份?它应该类似于 cron 表达式 "0 /12 * * *"。您可以设置自己的计划(https://crontab.guru/#0_/12_***)。
secretName
和 serviceAccountName
至少需要设置一个。* secretName
您创建的 secret 的名称(如果在 GKE 上使用工作负载身份则设置为 NULL)* serviceAccountName
用于备份 Job 的 Kubernetes ServiceAccount 的名称(如果在 GKE 上使用工作负载身份则必需)
可选环境变量
以下所有变量都模仿了 此处记录的 neo4j-admin 备份 的命令行选项
-
pageCache
-
heapSize
-
fallbackToFull
(true/false),默认=true -
checkConsistency
(true/false),默认=true -
checkIndexes
(true/false) 默认=true -
checkGraph
(true/false),默认=true -
checkLabelScanStore
(true/false),默认=true -
checkPropertyOwners
(true/false),默认=false