备份 Neo4j 容器

此方法支持 Google Cloud、AWS 和 Azure 存储,并假设您拥有凭据并希望将备份存储在这些云存储系统上。如果情况并非如此,您需要根据所需的云存储方法调整备份脚本,但此方法适用于任何备份位置。
此方法仅适用于 Neo4j 4.0 及更高版本。备份工具和 DBMS 本身在 3.5 和 4.0 之间发生了很大变化,此处的此方法可能不适用于较旧的数据库,除非进行大量修改。
如果您要从早期版本升级到 helm 图表 4.1.3-1 或更高版本,请仔细检查此文档;使用备份图表的语法已略有更改以适应多个云。此文档仅适用于 4.1.3-1 及更高版本。

背景和重要信息

必需的 Neo4j 配置

helm 图表默认为您提供此配置,但如果您自定义,则应牢记这些要求

  • dbms.backup.enabled=true

  • dbms.backup.listen_address=0.0.0.0:6362

Neo4j 的默认设置是仅监听 127.0.0.1,这将不起作用,因为其他容器将无法访问备份端口。

备份存储

备份在上传到云之前存储在临时的本地卷中。默认情况下,使用短暂的 Kubernetes emptyDir 卷。

如果要备份的数据库很大,本地存储空间可能不足。要使用替代存储,请在 values.yaml 中将 tempVolume 设置为不同的 Kubernetes 卷 对象。

备份指针

所有备份都将变成带有日期字符串的 .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

由于其改进的安全属性和可管理性,工作负载标识是推荐用于从 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 中使用工作负载标识,则可以改为创建服务密钥机密,如下一节所述。

创建服务密钥机密以访问云存储

首先,您需要创建一个包含帐户服务密钥内容的 kubernetes 机密。此密钥必须具有访问您尝试恢复的存储桶和备份集的权限。

Azure

  • 您必须创建凭据文件,此文件应如下所示

export ACCOUNT_NAME=<NAME_STORAGE_ACCOUNT>
export ACCOUNT_KEY=<STORAGE_ACCOUNT_KEY>

如果您不确定帐户密钥机密应是什么,您可以使用以下命令恢复它

ACCOUNT_KEY=$(az storage account keys list --resource-group "$AKS_RESOURCE_GROUP" --account-name "$STORAGE_ACCOUNT" --query [0].value -o tsv)
  • 您必须为此文件创建一个机密

kubectl create secret generic neo4j-azure-credentials \
    --from-file=credentials=azure-credentials.sh

AWS

  • 您必须创建凭据文件,此文件应如下所示

[default]
region=
aws_access_key_id=
aws_secret_access_key=
  • 您必须为此文件创建一个机密

kubectl create secret generic neo4j-aws-credentials \
    --from-file=credentials=aws-credentials

GCP

如果您正在 GKE 中使用工作负载标识,则无需遵循本节中的步骤。

从 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": ""
}
  • 您必须为此文件创建一个机密

kubectl create secret generic neo4j-gcp-credentials \
    --from-file=credentials=gcp-credentials.json
“--from-file=credentials=<您的配置路径>” 这里很重要;机密下的凭据必须命名为 credentials

运行备份

备份方法本身是一个小型 helm 图表,因此要运行备份,您只需执行以下操作作为最小必需示例

此命令必须在“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 服务密钥机密

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 存储的特别说明。图表需要一个“存储桶”,但对于 Azure 存储,命名方式略有不同;指定的存储桶是将文件放置在其中的“Blob 容器名称”。将尊重相对路径;如果您将存储桶设置为 container/path/to/directory,那么您将在 container 中的路径 /path/to/directory/db/db-latest.tar.gz 下找到您的备份文件,其中“db”是正在备份的数据库的名称(即 neo4j 和 system)。

如果一切顺利,在 Kubernetes 作业完成后的一段时间内,您将简单地看到备份文件出现在指定的存储桶中,位于以您备份的数据库命名的目录下。

如果您的备份未出现,请查看作业的 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 您创建的机密的名称(如果在 GKE 中使用工作负载标识,则设置为 NULL)* serviceAccountName 要用于备份作业的 Kubernetes ServiceAccount 的名称(如果在 GKE 中使用工作负载标识,则需要)

可选环境变量

以下所有变量都模拟 此处记录的 neo4j-admin backup 的命令行选项

  • 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 备份可能会成功,但一致性检查失败。这将在日志中记录,但在操作上将表现为成功的备份。