备份 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 卷 对象。
执行备份的步骤
使用服务帐户访问云存储(仅限 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://bucketname
或s3://bucketname
。 -
databases
要备份的数据库的逗号分隔列表。默认为neo4j,system
。如果您的 DBMS 具有许多单独的数据库,则应更改此设置。 -
cloudProvider
您希望将备份保留在哪个云服务上?(gcp 或 aws) -
jobSchedule
您想多久执行一次备份?它应该是类似 cron 的“0 /12 * * *”。您可以设置您自己的计划(https://crontab.guru/#0_/12_***)
必须至少设置 secretName
和 serviceAccountName
中的一个。* 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