备份 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 对象。

备份指针

所有备份都将变成带有日期字符串的 .tar.gz 文件,例如:neo4j-2020-06-16-12:32:57.tar.gz。它们以备份的数据库命名。

进行备份时,您将获得带日期的版本和“最新”副本,例如,上述文件也将复制到同一存储桶中的 neo4j/neo4j-latest.tar.gz

提醒:每次进行备份时,最新文件都将被覆盖.

这样做的目的是在存储中拥有一个稳定的名称,以便始终可以找到最新的备份,而不会丢失任何以前的备份。

Neo4j 备份的是数据库,而不是 DBMS

在 Neo4j 4.0 中,系统可以是多数据库的;大多数系统至少有 2 个数据库,“system”和“neo4j”。这些需要单独备份和恢复

执行备份的步骤

使用服务账号访问云存储(仅限 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://bucketnames3://bucketname

  • databases 要备份的数据库的逗号分隔列表。默认值为 neo4j,system。如果您的 DBMS 有许多单独的数据库,您应该更改此项。

  • cloudProvider 您希望将备份保留在哪个云服务上?(gcp 或 aws)

  • jobSchedule 您希望多久进行一次备份?它应该类似于 cron 表达式 "0 /12 * * *"。您可以设置自己的计划(https://crontab.guru/#0_/12_***)。

secretNameserviceAccountName 至少需要设置一个。* 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

退出条件

如果数据库参数中提到的任何单个数据库的备份失败,整个容器将以非零退出代码退出并失败。

注意:Neo4j 备份可能成功,但一致性检查失败。这将在日志中注明,但在操作上仍将视为成功的备份。

© . All rights reserved.