如何在 Kubernetes 集群中创建自动 arangodb 集群备份?
How to create automatic arangodb cluster backups in a Kubernetes Cluster?
我正在尝试让自动备份为我的 arangodb 集群部署工作。
我正在尝试遵循 documentation 但我想我不知何故搞砸了。
这是我的数据库-config.yaml:
apiVersion: "database.arangodb.com/v1alpha"
kind: "ArangoDeployment"
metadata:
name: "arangodb-cluster"
spec:
mode: Cluster
agents:
count: 3
args:
- --log.level=debug
dbservers:
count: 3
coordinators:
count: 3
---
apiVersion: "backup.arangodb.com/v1alpha"
kind: "ArangoBackup"
metadata:
name: "arangodb-backup"
namespace: default
spec:
policyName: "arangodb-backup-policy"
deployment:
name: "arangodb-backup-deployment"
upload:
repositoryURL: "https://s3.filebase.com/buffer"
credentialsSecretName: "backup-secret"
---
apiVersion: "backup.arangodb.com/v1alpha"
kind: "ArangoBackupPolicy"
metadata:
name: "arangodb-backup-policy"
spec:
schedule: "*/2 * * * *"
template:
upload:
repositoryURL: "https://s3.filebase.com/myBucket"
credentialsSecretName: "backup-secret"
---
apiVersion: v1
kind: Secret
metadata:
name: backup-secret
data:
token: mybase64EnodedJSONToken
type: Opaque
理想情况下,我会在我的存储桶中找到一些数据,但它是空的。我认为可能是:
- bucket size 太小了(但这似乎不太现实,因为那是一个只有一个文档和 4 个集合的测试部署,所以它不应该那么大)
- 不支持我正在使用的服务
2.1 我使用的服务配置错误
- 我误解了文档中的内容
我解码的 json 令牌看起来像这样(我用 rclones cli 生成它):
{
"Filebase": {
"access_key_id": "myID",
"acl": "private",
"endpoint": "https://s3.filebase.com",
"env_auth": "false",
"provider": "Other",
"secret_access_key": "myAccessKey",
"type": "s3"
}
}
我的编码看起来(有点)像这样(只是把它放在这里以防我以错误的方式编码 json 令牌):
ewogICAgIkZpbGViYXNlIXXXXXXX...X==
它是:301 字节长
我尝试了什么:
我试图深入了解正在发生的事情,但我缺乏正确执行此操作的经验,我也尝试从文档中添加一些内容但无济于事。
最后请注意,存储桶在 filebase.com 仪表板上设置为私有,我在那里使用免费套餐,cronjob 计时器上的 2 分钟仅用于测试。
编辑:似乎自定义备份 pod 是数据库的一项专业功能,如果想要备份,则需要为此构建自己的 pod。
这就是我解决它的方法(脚本第一部分归功于官方 arangodb github)。
脚本在做什么?
我们正在创建一个 cronjob,每 14 天 运行。然后我们启动一个 pod,它将使用 arangodump
工具转储(在本例中)整个数据库。
通过向它传递数据库 url、密码、用户名等数据并将其保存在 temp/dump
.
下的卷上
之后我们创建另一个使用 minio cli 工具的 pod,它允许与任何主要的对象存储提供商进行交互。
我们首先使用访问密钥和秘密为 gcloud 设置一个 mc 别名,您可以将其替换为任何其他 s3 兼容提供商 url。之后我们会将 /temp/dump
镜像到云存储桶(在本例中为 qute,将其替换为您自己的存储桶名称!)在具有最新备份日期的文件夹中。 $()
可用于执行 shell 命令并使用 return 值,仅供不知道的人使用。
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: backup-job
spec:
schedule: "0 0 */14 * *" #Runs the job at every 14 days
jobTemplate:
spec:
template:
metadata:
name: backup-job
spec:
initContainers:
- name: dump-create
image: "arangodb:3.7.3"
args:
- "arangodump"
- "--server.endpoint=$(ENDPOINT)"
- "--server.username=$(USERNAME)"
- "--server.password=$(PASSWORD)"
- "--server.database=MY-DATABASE"
- "--output-directory=/tmp/dump"
- "--overwrite"
volumeMounts:
- name: dump
mountPath: /tmp/dump
env:
- name: "PASSWORD"
valueFrom:
secretKeyRef:
name: signing-secret
key: root-password
- name: "USERNAME"
valueFrom:
configMapKeyRef:
name: signing-config
key: "admin-user"
- name: "ENDPOINT"
valueFrom:
configMapKeyRef:
name: signing-config
key: db-url
restartPolicy: OnFailure
containers:
- name: db-dump-upload
image: "minio/mc"
imagePullPolicy: IfNotPresent
command: ["/bin/sh","-c"]
args: ["mc alias set gcs https://storage.googleapis.com $ACCESSKEY $SECRETKEY; mc mirror /tmp/dump gcs/qute/$(date -I)"] #no () for env variables!!!!
volumeMounts:
- name: dump
mountPath: /tmp/dump
env:
- name: SECRETKEY
valueFrom:
secretKeyRef:
name: backup-secret
key: secret
- name: ACCESSKEY
valueFrom:
secretKeyRef:
name: backup-secret
key: access-key
volumes:
- name: dump
emptyDir: {}
我正在尝试让自动备份为我的 arangodb 集群部署工作。 我正在尝试遵循 documentation 但我想我不知何故搞砸了。
这是我的数据库-config.yaml:
apiVersion: "database.arangodb.com/v1alpha"
kind: "ArangoDeployment"
metadata:
name: "arangodb-cluster"
spec:
mode: Cluster
agents:
count: 3
args:
- --log.level=debug
dbservers:
count: 3
coordinators:
count: 3
---
apiVersion: "backup.arangodb.com/v1alpha"
kind: "ArangoBackup"
metadata:
name: "arangodb-backup"
namespace: default
spec:
policyName: "arangodb-backup-policy"
deployment:
name: "arangodb-backup-deployment"
upload:
repositoryURL: "https://s3.filebase.com/buffer"
credentialsSecretName: "backup-secret"
---
apiVersion: "backup.arangodb.com/v1alpha"
kind: "ArangoBackupPolicy"
metadata:
name: "arangodb-backup-policy"
spec:
schedule: "*/2 * * * *"
template:
upload:
repositoryURL: "https://s3.filebase.com/myBucket"
credentialsSecretName: "backup-secret"
---
apiVersion: v1
kind: Secret
metadata:
name: backup-secret
data:
token: mybase64EnodedJSONToken
type: Opaque
理想情况下,我会在我的存储桶中找到一些数据,但它是空的。我认为可能是:
- bucket size 太小了(但这似乎不太现实,因为那是一个只有一个文档和 4 个集合的测试部署,所以它不应该那么大)
- 不支持我正在使用的服务 2.1 我使用的服务配置错误
- 我误解了文档中的内容
我解码的 json 令牌看起来像这样(我用 rclones cli 生成它):
{
"Filebase": {
"access_key_id": "myID",
"acl": "private",
"endpoint": "https://s3.filebase.com",
"env_auth": "false",
"provider": "Other",
"secret_access_key": "myAccessKey",
"type": "s3"
}
} 我的编码看起来(有点)像这样(只是把它放在这里以防我以错误的方式编码 json 令牌):
ewogICAgIkZpbGViYXNlIXXXXXXX...X==
它是:301 字节长
我尝试了什么: 我试图深入了解正在发生的事情,但我缺乏正确执行此操作的经验,我也尝试从文档中添加一些内容但无济于事。
最后请注意,存储桶在 filebase.com 仪表板上设置为私有,我在那里使用免费套餐,cronjob 计时器上的 2 分钟仅用于测试。
编辑:似乎自定义备份 pod 是数据库的一项专业功能,如果想要备份,则需要为此构建自己的 pod。
这就是我解决它的方法(脚本第一部分归功于官方 arangodb github)。
脚本在做什么?
我们正在创建一个 cronjob,每 14 天 运行。然后我们启动一个 pod,它将使用 arangodump
工具转储(在本例中)整个数据库。
通过向它传递数据库 url、密码、用户名等数据并将其保存在 temp/dump
.
下的卷上
之后我们创建另一个使用 minio cli 工具的 pod,它允许与任何主要的对象存储提供商进行交互。
我们首先使用访问密钥和秘密为 gcloud 设置一个 mc 别名,您可以将其替换为任何其他 s3 兼容提供商 url。之后我们会将 /temp/dump
镜像到云存储桶(在本例中为 qute,将其替换为您自己的存储桶名称!)在具有最新备份日期的文件夹中。 $()
可用于执行 shell 命令并使用 return 值,仅供不知道的人使用。
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: backup-job
spec:
schedule: "0 0 */14 * *" #Runs the job at every 14 days
jobTemplate:
spec:
template:
metadata:
name: backup-job
spec:
initContainers:
- name: dump-create
image: "arangodb:3.7.3"
args:
- "arangodump"
- "--server.endpoint=$(ENDPOINT)"
- "--server.username=$(USERNAME)"
- "--server.password=$(PASSWORD)"
- "--server.database=MY-DATABASE"
- "--output-directory=/tmp/dump"
- "--overwrite"
volumeMounts:
- name: dump
mountPath: /tmp/dump
env:
- name: "PASSWORD"
valueFrom:
secretKeyRef:
name: signing-secret
key: root-password
- name: "USERNAME"
valueFrom:
configMapKeyRef:
name: signing-config
key: "admin-user"
- name: "ENDPOINT"
valueFrom:
configMapKeyRef:
name: signing-config
key: db-url
restartPolicy: OnFailure
containers:
- name: db-dump-upload
image: "minio/mc"
imagePullPolicy: IfNotPresent
command: ["/bin/sh","-c"]
args: ["mc alias set gcs https://storage.googleapis.com $ACCESSKEY $SECRETKEY; mc mirror /tmp/dump gcs/qute/$(date -I)"] #no () for env variables!!!!
volumeMounts:
- name: dump
mountPath: /tmp/dump
env:
- name: SECRETKEY
valueFrom:
secretKeyRef:
name: backup-secret
key: secret
- name: ACCESSKEY
valueFrom:
secretKeyRef:
name: backup-secret
key: access-key
volumes:
- name: dump
emptyDir: {}