vmbackup和vmrestore是何方神圣?

微信公众号:运维开发故事,作者:华仔

背景

在之前的文章中,给大家介绍了vmstorage、vminsert、vmselect、vmui、vmagent,分别代表了数据的存储、添加、查询、可视化以及数据的采集。想想是不是还差点什么?没错!还缺少数据的备份和还原。那么今天,它们来了!接下来,请让我为大家一一介绍。

vmbackup

vmbackup是一个数据备份的工具,可以从vmstorage即时的快照中去备份vm数据,同时支持将备份数据存储到存储系统,如:

  • GCS. Example: gs:///<path/to/backup>

  • S3. Example: s3:///<path/to/backup>

  • Any S3-compatible storage such as MinIO, Ceph or Swift. See these docs for details

  • Local filesystem. Example: fs://</absolute/path/to/backup>

vmbackup支持增量备份和全备。当备份数据存储路径已经有了之前的备份数据,增量备份将自动进行;而全备则可以通过-origin指定相同的远端存储去加速备份。因为在这种情况下,可以在远端存储进行新备份与已经存在的备份之间进行共有数据的复制,从而节省了时间和其他花销。备份进程可以在任何时间被打断,但当你使用vmbackup使用同样的参数进行再次备份时,备份将从打断处自动恢复。同时,通过vmbackup备份的数据能够被vmrestore用来恢复数据。

vmrestore

vmrestore被用于从通过vmbackup备份的数据中进行恢复数据,跟vmbackup备份进程一样,恢复数据进程也可以在任何时候被打断;当再次使用相同的命令和参数去恢复数据时,将从断点处自动恢复。原vmstorage数据存储的的数据将被恢复的数据所替换。

实操

数据备份

1、创建快照

上面提到过,vmbackup需要从即时的快照去备份数据,因此想要备份,我们需要先创建快照。vmstorage给我们提供了API去创建快照。使用以下的方式:

# request
curl http://<victoriametrics-addr>:8428/snapshot/create # 需要根据实际部署修改地址和端口

# response
{"status":"ok","snapshot":"<snapshot-name>"}

下面来实操一下:

[root@test ~]# curl http://172.16.47.122:8482/snapshot/create
{"status":"ok","snapshot":"20220119051931-16CA0D126A870F8B"}

我们再看看vmstorage的日志:

2022-01-19T05:19:31.767Z info VictoriaMetrics/lib/storage/storage.go:304 creating Storage snapshot for "/vm-data"...
2022-01-19T05:19:31.771Z info VictoriaMetrics/lib/storage/table.go:143 creating table snapshot of "/vm-data/data"...
2022-01-19T05:19:31.773Z info VictoriaMetrics/lib/storage/partition.go:1549 creating partition snapshot of "/vm-data/data/small/2022_01" and "/vm-data/data/big/2022_01"...
2022-01-19T05:19:31.920Z info VictoriaMetrics/lib/storage/partition.go:1570 created partition snapshot of "/vm-data/data/small/2022_01" and "/vm-data/data/big/2022_01" at "/vm-data/data/small/snapshots/20220119051931-16CA0D126A870F8B/2022_01" and "/vm-data/data/big/snapshots/20220119051931-16CA0D126A870F8B/2022_01" in 0.146 seconds
2022-01-19T05:19:31.920Z info VictoriaMetrics/lib/storage/table.go:171 created table snapshot for "/vm-data/data" at ("/vm-data/data/small/snapshots/20220119051931-16CA0D126A870F8B", "/vm-data/data/big/snapshots/20220119051931-16CA0D126A870F8B") in 0.149 seconds
2022-01-19T05:19:31.921Z info VictoriaMetrics/lib/mergeset/table.go:1161 creating Table snapshot of "/vm-data/indexdb/16CA0D126A874608"...
2022-01-19T05:19:31.963Z info VictoriaMetrics/lib/mergeset/table.go:1230 created Table snapshot of "/vm-data/indexdb/16CA0D126A874608" at "/vm-data/indexdb/snapshots/20220119051931-16CA0D126A870F8B/16CA0D126A874608" in 0.041 seconds
2022-01-19T05:19:31.963Z info VictoriaMetrics/lib/mergeset/table.go:1161 creating Table snapshot of "/vm-data/indexdb/16CA0D126A874607"...
2022-01-19T05:19:31.966Z info VictoriaMetrics/lib/mergeset/table.go:1230 created Table snapshot of "/vm-data/indexdb/16CA0D126A874607" at "/vm-data/indexdb/snapshots/20220119051931-16CA0D126A870F8B/16CA0D126A874607" in 0.003 seconds
2022-01-19T05:19:31.971Z info VictoriaMetrics/lib/storage/storage.go:361 created Storage snapshot for "/vm-data" at "/vm-data/snapshots/20220119051931-16CA0D126A870F8B" in 0.204 seconds

最后去vmstorage的存储路径下看看文件:

# 我这里是直接去我的nfs下vmstorage对应的存储path下查看的。
# 可以很清楚看到我们之前的快照
[root@test ~]# cd /nfs_data/pvc-b06968ca-f31e-4d93-b16d-cf66a10c64d9/
[root@test pvc-b06968ca-f31e-4d93-b16d-cf66a10c64d9]# ls -al
total 24
drwxr-xr-x 6 root root 4096 Jan 14 13:49 .
drwxr-xrwx 6 root root 4096 Jan 14 13:49 ..
drwxr-xr-x 4 root root 4096 Jan 14 13:49 data
-rw-r--r-- 1 root root    0 Jan 14 13:49 flock.lock
drwxr-xr-x 5 root root 4096 Jan 14 13:49 indexdb
drwxr-xr-x 2 root root 4096 Jan 14 13:49 metadata
drwxr-xr-x 3 root root 4096 Jan 19 13:19 snapshots
[root@test pvc-b06968ca-f31e-4d93-b16d-cf66a10c64d9]# cd snapshots/
[root@test snapshots]# ls -al
total 12
drwxr-xr-x 3 root root 4096 Jan 19 13:19 .
drwxr-xr-x 6 root root 4096 Jan 14 13:49 ..
drwxr-xr-x 4 root root 4096 Jan 19 13:19 20220119051931-16CA0D126A870F8B
[root@test snapshots]# cd 20220119051931-16CA0D126A870F8B/
[root@test 20220119051931-16CA0D126A870F8B]# ls -al
total 16
drwxr-xr-x 4 root root 4096 Jan 19 13:19 .
drwxr-xr-x 3 root root 4096 Jan 19 13:19 ..
drwxr-xr-x 2 root root 4096 Jan 19 13:19 data
lrwxrwxrwx 1 root root   55 Jan 19 13:19 indexdb -> ../../indexdb/snapshots/20220119051931-16CA0D126A870F8B
drwxr-xr-x 2 root root 4096 Jan 19 13:19 metadata

其实也可以通过vmstorage提供的API去查看我们刚刚创建的快照

# 到这里我们的快照已经准备就绪了
[root@test ~]# curl http://172.16.47.122:8482/snapshot/list
{"status":"ok","snapshots":[
"20220119051931-16CA0D126A870F8B"

2、数据备份

有了上面的快照,下面我们来进行备份,我这边没有s3、gcs,直接用local filesystem,将其备份到本地/opt目录下

# 通过刚刚创建的快照进行备份
./vmbackup-prod -storageDataPath=/vm-data -snapshotName=20220119051931-16CA0D126A870F8B -dst=fs:///opt

# 输出如下
2022-01-19T05:45:29.709Z info VictoriaMetrics/lib/logger/flag.go:12 build version: vmbackup-20210715-111047-tags-v1.63.0-0-g61cc13c16
2022-01-19T05:45:29.709Z info VictoriaMetrics/lib/logger/flag.go:13 command line flags
2022-01-19T05:45:29.709Z info VictoriaMetrics/lib/logger/flag.go:28 flag "concurrency"="10" (is_set=false)
2022-01-19T05:45:29.709Z info VictoriaMetrics/lib/logger/flag.go:28 flag "configFilePath"="" (is_set=false)
2022-01-19T05:45:29.709Z info VictoriaMetrics/lib/logger/flag.go:28 flag "configProfile"="" (is_set=false)
2022-01-19T05:45:29.709Z info VictoriaMetrics/lib/logger/flag.go:28 flag "credsFilePath"="" (is_set=false)
2022-01-19T05:45:29.709Z info VictoriaMetrics/lib/logger/flag.go:28 flag "customS3Endpoint"="" (is_set=false)
2022-01-19T05:45:29.709Z info VictoriaMetrics/lib/logger/flag.go:28 flag "dst"="fs:///opt" (is_set=true)
...省略...
00_22197_20220119051721.456_20220119051724.766_16CA152B5133B4AD/timestamps.bin", file_size: 0, offset: 0, size: 0} from src fslocal "/vm-data/snapshots/20220119051931-16CA0D126A870F8B" to dst fsremote "/opt"
2022-01-19T05:45:30.374Z info VictoriaMetrics/lib/backup/actions/backup.go:164 uploaded 125373885 out of 125373885 bytes from src fslocal "/vm-data/snapshots/20220119051931-16CA0D126A870F8B" to dst fsremote "/opt" in 627.488079ms
2022-01-19T05:45:30.374Z info VictoriaMetrics/lib/backup/actions/backup.go:171 backup from src fslocal "/vm-data/snapshots/20220119051931-16CA0D126A870F8B" to dst fsremote "/opt" with origin fsnil is complete; backed up 125373885 bytes in 0.664 seconds; deleted 0 bytes; server-side copied 0 bytes; uploaded 125373885 bytes

# 再去/opt目录下确保数据备份正确
/vm-data # cd /opt/
/opt # ls -al
total 24
drwxr-xr-x    1 root     root          4096 Jan 19 05:45 .
drwxr-xr-x    1 root     root          4096 Jan 14 05:49 ..
-rw-------    1 root     root             2 Jan 19 05:45 backup_complete.ignore
drwx------    4 root     root          4096 Jan 19 05:45 data
drwx------    4 root     root          4096 Jan 19 05:45 indexdb
drwx------    3 root     root          4096 Jan 19 05:45 metadata

3、创建第二个快照

[root@test /]# curl http://172.16.47.122:8482/snapshot/create
{"status":"ok","snapshot":"20220119055254-16CA0D126A870F8C"}

4、增量备份

# 备份
./vmbackup-prod -storageDataPath=/vm-data -snapshotName=20220119055254-16CA0D126A870F8C  -dst=fs:///opt
# 日志输出
...省略...
2022-01-19T05:55:18.548Z info VictoriaMetrics/lib/backup/actions/backup.go:171 backup from src fslocal "/vm-data/snapshots/20220119055254-16CA0D126A870F8C" to dst fsremote "/opt" with origin fsnil is complete; backed up 127597222 bytes in 0.214 seconds; deleted 2714902 bytes; server-side copied 0 bytes; uploaded 4938239 bytes

从日志上不难看出,增量备份时,delete file 的值不为0,这里删除的是第一次快照中存在,但在第二次快照中不会存在的数据;另外
花费的时间也明显小于咱们第一次全备。

5、再做一个快照,测试server-side copy

# 创建快照
[root@test ~]# curl http://172.16.47.122:8482/snapshot/create
{"status":"ok","snapshot":"20220119073821-16CA0D126A870F8D"}

6、全备,备份时添加-origin参数

# 备份,添加-origin指定之前备份数据所在目录
./vmbackup-prod -storageDataPath=/vm-data -snapshotName=20220119073821-16CA0D126A870F8D  -dst=fs:///ss -origin=fs:///opt

# 从命令输出来看,确定有进行server-side copy
...省略...
2022-01-19T07:44:56.657Z info VictoriaMetrics/lib/backup/actions/backup.go:171 backup from src fslocal "/vm-data/snapshots/20220119073821-16CA0D126A870F8D" to dst fsremote "/ss" with origin fsremote "/opt" is complete; backed up 131747249 bytes in 0.190 seconds; deleted 0 bytes; server-side copied 121316947 bytes; uploaded 10430302 bytes

数据恢复

上面我们创建了多个快照,也进行了多次备份。这里我选择从fs:///ss目录下的备份进行恢复到/tt目录下

# 进行恢复
./vmrestore-prod  -src=fs:///ss -storageDataPath=/tt
# vm停止,再进行数据恢复;恢复后,vm再次重启时-storageDataPath参数需要指定为/tt目录,即恢复的数据所在的目录
# 控制台输出
...省略...
2022-01-19T07:58:32.117Z info VictoriaMetrics/lib/logger/flag.go:28 flag "src"="fs:///ss" (is_set=true)
2022-01-19T07:58:32.117Z info VictoriaMetrics/lib/logger/flag.go:28 flag "storageDataPath"="/tt" (is_set=true)
...省略...
2022-01-19T07:58:32.751Z info VictoriaMetrics/lib/backup/actions/restore.go:185 downloaded 131747249 out of 131747249 bytes from fsremote "/ss" to fslocal "/tt" in 624.892637ms
2022-01-19T07:58:32.751Z info VictoriaMetrics/lib/backup/actions/restore.go:192 restored 131747249 bytes from backup in 0.635 seconds; deleted 0 bytes; downloaded 131747249 bytes

# 查看/tt目录下的恢复的数据
/vm-data # ls -al /tt/
total 20
drwxr-xr-x    5 root     root          4096 Jan 19 07:58 .
drwxr-xr-x    1 root     root          4096 Jan 19 07:44 ..
drwx------    4 root     root          4096 Jan 19 07:58 data
-rw-r--r--    1 root     root             0 Jan 19 07:58 flock.lock
drwx------    4 root     root          4096 Jan 19 07:58 indexdb
drwx------    2 root     root          4096 Jan 19 07:58 metadata

注:在进行恢复数据期间,vm应该停止。

Troubleshooting

  • 当发现备份数据时很慢,可以通过设置-concurrency参数来设置并发来加快上传数据至存储系统

  • 如果vmbackup/vmrestore使用了太多的带宽,可以通过maxBytesPerSecond参数进行限制

  • 如果备份/恢复数据时被打断,使用相同的命令参数重新备份/恢复即可,将在断点处自动恢复

  • 单节点vm备份的数据不能被用于恢复数据至集群版本vm

总结

以上就是本次我对vmbackup和vmrestore的简单介绍了,更多内容请查看官网。如果你觉得vm不错,动手试试看吧!

参考

  • https://docs.victoriametrics.com
<think>好的,我现在需要回答用户的问题:“探索技术前沿Java的路在何方?”首先,我要理解用户的需求。用户可能是一位Java开发者,希望了解Java未来的发展方向前沿技术,以便规划自己的学习路径或项目方向。接下来,我要确保回答结构清晰,分点列出,并符合用户提供的系统级指令,特别是数学表达式的格式要求,不过这个问题可能不涉及太多数学内容,但还是要留意可能的公式使用。 首先,回顾Java的最新版本特性。Java近几年更新频繁,每六个月发布一个新版本,所以需要提到最新的LTS版本,比如Java 17或21,以及引入的新特性,例如模式匹配、记录类、虚拟线程等。这部分需要准确,可能需要查阅当前Java版本的信息,确保信息不过时。 然后,考虑云原生微服务架构。Java在云原生环境中的应用,如Quarkus、MicronautSpring Boot等框架的优化,以及GraalVM对原生编译的支持。需要解释这些技术如何提升Java在云端的性能,比如启动时间内存占用。 接下来是响应式编程协程。Project Loom引入的虚拟线程对并发编程的影响,以及响应式框架如ReactorRxJava的持续发展。这部分需要说明这些技术如何改善高并发应用的处理能力。 机器学习AI集成也是一个方向。虽然Python主导AI领域,但Java也有Deeplearning4j等库,可以探讨Java在大规模企业级AI应用中的潜力。 另外,内存管理性能优化,比如ZGCShenandoah垃圾收集器的改进,提升Java在处理大数据高吞吐量应用时的效率。 最后,生态系统社区动态,包括Kotlin的互操作性、JVM语言的发展,以及开源社区的贡献,这些都会影响Java的未来。 需要确保每个部分都有明确的子标题,使用中文,结构清晰,避免使用Markdown格式,但保持段落分明。同时检查是否有数学表达式需要转换,比如算法复杂度可能涉及大O符号,如$O(n)$,需要使用正确的LaTeX格式。不过这个问题可能较少涉及数学,但还是要留意。 最后,总结部分要概括Java的未来趋势,强调其适应性持续创新。确保语言口语化,自然流畅,避免生硬的技术术语堆砌,让读者容易理解。同时检查LaTeX格式是否正确,比如变量或公式是否用$...$包围,独立公式是否用$$...$$,但根据问题内容,可能这部分内容不多。 可能还需要验证一些技术细节的准确性,例如Project Loom的状态是否已经集成到最新JDK,或者GraalVM的应用情况。如果有不确定的地方,应该用更通用的表述,避免错误信息。另外,确保所有技术名词的中英文对应正确,比如“虚拟线程”对应“Virtual Threads”,“记录类”对应“Record Classes”等。 现在,组织这些思路,按照用户要求的结构,分点阐述,每个部分用数字小标题,保持段落简短,信息准确可靠。</think>探索技术前沿的 Java 发展路径可从以下方向展开,结合最新趋势生态演进逐步分析: --- ### 1. **语言特性持续增强** Java 通过半年更新周期(每 6 个月发布新版本)保持活力。例如: - **模式匹配**:简化代码逻辑,如 `instanceof` 自动类型转换: ```java if (obj instanceof String s) { /* 直接使用 s */ } ``` - **记录类(Record)**:声明不可变数据模型,例如: $$ \text{record Point(int x, int y) {} } $$ - **虚拟线程(Loom 项目)**:通过轻量级线程支持百万级并发,减少传统线程的资源消耗,公式化描述其优势: $$ \text{吞吐量} \propto \frac{1}{\text{线程切换成本}} $$ --- ### 2. **云原生与性能优化** Java 在容器化环境中持续突破: - **GraalVM 原生镜像**:将 Java 编译为独立可执行文件,启动时间从秒级降至毫秒级(如 $<50\text{ms}$),内存占用降低 70% 以上。 - **框架适配**:Quarkus/Micronaut 等框架优化反射类加载,更适合微服务场景。 --- ### 3. **响应式与高并发编程** - **Project Reactor 与 Virtual Threads 结合**:虚拟线程降低异步编程复杂度,响应式流(如 `Flux`)处理背压问题,满足实时数据流需求。 - **协程化 I/O**:通过结构化并发 API(JDK 21+)简化多任务协作,避免回调地狱。 --- ### 4. **AI/ML 集成** - **Deeplearning4j 与 Tribuo**:提供分布式训练支持,适合集成到企业级 Java 应用中。 - **TensorFlow Java API**:直接调用预训练模型,例如图像分类耗时优化: $$ \text{推理延迟} = O(\text{模型参数量} \times \text{硬件加速因子}) $$ --- ### 5. **内存管理与垃圾回收** - **ZGC/Shenandoah GC**:实现亚毫秒级停顿,满足低延迟场景(如金融交易系统)。 - **堆外内存管理**:通过 `Project Panama` 优化原生内存访问,提升大数据处理效率。 --- ### 6. **多语言与跨平台生态** - **Kotlin 互操作**:JetBrains 推动 Kotlin 与 Java 无缝混合编程。 - **WebAssembly 支持**:通过 TeaVM 等工具将 Java 字节码编译为 WASM,拓展浏览器端应用。 --- ### 总结:Java 的“路在何方”? - **核心方向**:轻量化(云原生)、高并发(虚拟线程)、智能化(AI 工具链)。 - **竞争力**:依托 JVM 生态稳固性,在企业级开发中持续领跑,同时吸收现代编程范式(如函数式、响应式)。 开发者需关注 Loom、Valhalla(值类型)等关键项目,并掌握 Quarkus/GraalVM 等云原生技术栈。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值