kopia + S3 + ansible 实现集群管理快照备份 ¶
我司备份使用的华为云云备份服务,按照存储收费,数据没有特别重要,故而研究新的备份方案,想过之前使用过的 nfs + rsync ,考虑到我司使用的基本是云服务器,调研后发现后端存储可以使用 S3 更节省维护成本,使用 kopia + s3 进行存储。
这里是尝试失败过程,要想直接看结论跳转到最下面最终过程 ¶
当多个客户端连接服务器模式(UI/CLI)cron的快照功能均失败。
背景:项目中拥有很多台 linux 服务器,均需要备份,随着项目变大、数据备份量越大、无意间看到 kopia 拥有增量备份与快照和定时快照等自动策略。开始研究 kopia。我想实现一台服务端连接 S3 存储。多台客户端连接服务端进行配置存储,且按照全局 cron 策略自动快照。
遇到的问题:当多个cli客户端连接服务器模式(UI/CLI)cron 的快照功能均失败。 我看到 kopia 本身拥有了这些功能、但是我没有成功。不知是我哪里没有理解。我可以使用 ansible 进行批量管理、配合 crontab 执行 kopia snapshot create <file>
进行快照,但这却没有使用 kopia 本身的功能,让我很疑惑。
首先使用 compose 方式启动 ui 版本 ¶
效果:服务端 10.10.1.57 启动成功、尝试本机备份、成功。
因为测试 cron、 所以使用 * * * * * 来看效果 | 定时快照成功 |
---|---|
![]() |
![]() |
尝试切换场景新增多个客户端 ¶
项目还有好多台服务器、如果每台服务器都启动一个具有 ui 界面的服务,那么访问管理将会非常麻烦。尝试服务器使用 cli 方式。
看到描述 Kopia 的服务器模式公开一个 API 可以集中管理多台计算机的备份,集中管理多台机器备份的用户。可用于构建客户端工具,实现诸如触发快照、获取客户端状态以及访问已快照数据等功能。
服务端添加用户 ¶
因为没有看到 gui 界面有设置用户相关信息、但是看到服务端有 cli 方式可以实现。
容器按照 username@hostname 格式创建测试
docker compose exec -it kopia kopia server user add test@test1
创建成功
kopia server user list test@test1
在客户端服务器使用 cli 命令 连接服务端 ¶
新客户端服务器 10.1.1.157 使用 kopia repository connect server
kopia repository connect server --url https://10.1.1.57:51514 --server-cert-fingerprint 8B9C6F54E2DA881547CB42BAD5AD7A36EDB2E7408D34C6ECF662C556223601A2 --override-username=test --override-hostname=test1
查看 gui 效果并没有生效 ¶
![]() |
查看文档需要重启服务
重启服务
docker compose up -d --force-recreate
客户端替换用户名和主机名连接
kopia repository connect server --url https://10.1.1.57:51514 --server-cert-fingerprint 8B9C6F54E2DA881547CB42BAD5AD7A36EDB2E7408D34C6ECF662C556223601A2 --override-username=test --override-hostname=test1
连接成功
Connected to repository API Server.
NOTICE: Kopia will check for updates on GitHub every 7 days, starting 24 hours after first use.
To disable this behavior, set environment variable KOPIA_CHECK_FOR_UPDATES=false
Alternatively you can remove the file "/root/.config/kopia/repository.config.update-info.json".
再次查看 gui 效果没有生效 ¶
![]() |
尝试 cli 创建快照看是否成功 ¶
生成一个 20M 的文件 test.file
dd if=/dev/zero of=test.file bs=20M count=1
创建快照
kopia snapshot create test.file
Snapshotting test@test1:/tmp/test.file ...
* 0 hashing, 1 hashed (21 MB), 0 cached (0 B), uploaded 4.2 MB, estimating...
Created snapshot with root Ixee08052f46949a06c0bd5a4ccce54a69 and ID 43a3997e6d098f6d6afafb1fb24028d9 in 0s
**设置 cron 策略, 为了看效果写 * * * * * **
kopia policy set --snapshot-time-crontab " * * * " test@test1:/tmp/test.file
回到 gui 查看没有显示
![]() |
![]() |
服务端再次重启查看有显示
docker compose up -d --force-recreate
不能设置 policy | 点 edit 查看是有的、但是实际没有生效 |
---|---|
![]() |
![]() |
![]() |
命令行查看没有成功
root@datarc-server:/tmp# kopia snapshot list - test@test1:/tmp/test.file 2025-01-08 17:47:50 CST Ixee08052f46949a06c0bd5a4ccce54a69 21 MB -rw-r--r-- (latest-1,hourly-1,daily-1,weekly-1,monthly-1,annual-1)
尝试添加 acl ,直接放开允许所有用户查看系统中的所有快照。
kopia server acl enable
kopia server acl add --user "@" --access READ --target type=snapshot
**再次查看 ui , 还是失败 **
![]() |
![]() |
服务端使用 gui,客户端使用 cli 失败、尝试全部都用 cli ¶
S3 存储 ¶
Kopia 命令行界面 ¶
创建存储库 ¶
使用kopia repository create s3
命令来创建repository
。
kopia repository create s3 \
--bucket="..." \
--access-key="..." \
--secret-access-key="..." \
--prefix="service-backup" \
--region="..." \
--endpoint="..." \
--override-hostname="..." \
--description="service-backup"
系统将要求输入所需的存储库密码。请记住,此密码用于加密您的数据,因此请确保它是一个安全的密码!
从 CLI 启动 Kopia 服务器: ¶
1. 第一次启动、使用自动生成证书
kopia server start \
--tls-generate-cert \
--address https://10.1.1.57:5152 \
--config-file=/root/.config/kopia/repository.config \
--log-level=error \
--file-log-level=error \
--log-dir="/tmp/2025" \
--tls-cert-file /root/kopia.cert --tls-key-file /root/kopia.key
# 输出
SERVER CERT SHA256: d3f49ebf15adf6d4f4dsa4564905104664e0d2a7d64cc44c50db47dsab983123S
SERVER ADDRESS: https://10.1.1.57:5152
2. 生成证书后、后续启动
kopia server start \
--address https://10.1.1.57:5152 \
--config-file=/root/.config/kopia/repository.config \
--log-level=error \
--file-log-level=error \
--log-dir="/tmp/2025" \
--tls-cert-file /root/kopia.cert --tls-key-file /root/kopia.key
3. 授权用户 username@hostname 格式创建测试
kopia server user add test@test1
创建成功
kopia server user list test@test1
4. 客户端连接服务器
kopia repository connect server --url https://10.1.1.57:5152 --server-cert-fingerprint d3f49ebf15adf6d4f4530db4564905104664e0d2a7d64cc44c50db472adb983123S --override-username=test --override-hostname=test1
5. 新增快照并设置策略
生成一个 20M 的文件 test.file
dd if=/dev/zero of=test.file bs=20M count=1
创建快照
kopia snapshot create test.file
Snapshotting test@test1:/tmp/test.file ...
* 0 hashing, 1 hashed (21 MB), 0 cached (0 B), uploaded 4.2 MB, estimating...
Created snapshot with root Ixee08052f46949a06c0bd5a4ccc32131a69 and ID 43a3997e6d098f6d6afafb1fb24028d9 in 0s
**设置 cron 策略, 为了看效果写 * * * * * **
kopia policy set --snapshot-time-crontab " * * * " test@test1:/tmp/test.file
列出快照 ¶
kopia snapshot list
查看还是失败
-
kopia 有自己的快照功能但是不能用,尝试使用其他办法。
-
可以使用 类似 ansible 和 bash 脚本方式进行工作。
分割线-----------下面是最终过程。 ¶
备份日常维护管理 ¶
进入虚拟环境
cd /opt/kopia-roles/ && pipenv shell
查看可以使用的tag ¶
ansible-playbook -i inventory.ini site.yml --list-tasks
增加快照 ¶
1. 在 inventory.ini
中的 kopia_backup_client
中添加相关信息,示例如下:
vim inventory.ini
[kopia_backup_client]
caddy ansible_ssh_host=10.1.1.86
inventory_hostname
和 快照频率和目录
vim kopia_backup_client/templates/client_crontab.j2
{% if inventory_hostname == 'caddy' %}
0 */3 * * * root /usr/local/bin/kopia snapshot create /root/mysql /root/docs /root/datarc
3. 执行 ansible 任务、进行客户端安装等操作
ansible-playbook -i inventory.ini site.yml --tags=kopia_backup_client
管理快照 ¶
1. 查看本机器所有快照和历史记录 对于目录中的每个文件/目录,Kopia 都会存储其名称、大小、属性和包含文件或目录内容的对象 ID。
kopia snapshot list
2. 查看具体文件的历史记录
kopia snapshot list /root/mysql
3. 比较两个快照的内容
kopia diff <快照ID 1 > <快照ID 2>
4. 列出快照目录的内容
kopia ls -l <快照ID>
5. 检查文件的内容 在检查的文件或目录的对象标识符时使用 可使用参数调整显示格式:
kopia show <快照ID>
还原快照(本机器) ¶
Kopia 为您提供三个选项:
- 将快照的内容挂载为本地磁盘,以便您可以从快照中浏览和复制文件/目录,就像快照是您机器上的本地目录一样
- 将快照中包含的所有文件/目录还原到您指定的任何本地或网络位置
- 从快照中选择性地恢复单个文件
1. 挂载快照并从快照还原文件/目录
将快照的内容挂载为本地文件系统,并使用常规文件命令检查它,使用以下命令检查内容:
mkdir /tmp/mnt
kopia mount k0c5b442ff0a2a30120e8d6198ff4e1df /tmp/mnt &
ls -l /tmp/mnt/
umount /tmp/mnt
目前建议使用挂载方式从快照恢复文件/目录。
2. 从快照恢复文件/目录
kopia snapshot restore snapshot_id path/to/target_directory
解释: - kopia snapshot restore:启动从快照恢复数据的过程。 - snapshot_id:要恢复的快照的唯一标识符。此 ID 可从快照列表中获取。 - path/to/target_directory:恢复的数据将放置的目标路径。
示例:
root@kopia:~# kopia ls -l k3a25947255000cbe75d9154c1055299b
drwxr-xr-x 2389445509 2025-02-20 08:59:52 CST kd89941f20232ce58ab5e77bf862a37d2 data/
-rw-r--r-- 368 2024-02-20 10:16:01 CST 4a9a1c1f5a6f8a9907e3c0b8cddaf5cb compose.yaml
3. 恢复文件至本地文件
kopia snapshot restore 4a9a1c1f5a6f8a9907e3c0b8cddaf5cb ./1.txt
4. 恢复文件夹至本地文件夹
kopia snapshot restore kd89941f20232ce58ab5e77bf862a37d2/data/ ./data