单副本多机器的快照问题

假如我有一个space,单副本10个partition分布在3台机器上,这时候create snapshot后,show snapshots显示快照在三台机器上都有,但是实际上是不是每个机器上快照的内容都不相同?

如果是3副本,5机器,创建快照。一个机器上有partition2 3 4的快照,另一个机器有3 4 5的快照,如果我想把所有partition的快照集中在一起,但是每个partition的快照只有一个,有什么办法可以做到吗?

然而我看了checkpoints和data目录,在数据层面似乎没有记录本机有哪些partition的情况,这种情况下,是不是只能按照原来的拓扑结构进行恢复?

1 个赞

首先解释一下你的几个问题:

但是实际上是不是每个机器上快照的内容都不相同?

是的,对于 space 做一次快照后,所有的分片的快照分散在 partition 所在机器上本地,而没有收束到一个物理位置。

partition的快照集中在一起,但是每个partition的快照只有一个,有什么办法可以做到吗?

现在暂时没有办法,我们在做 br,能将所有 partition 快照集中在一起。但仍然是 partition 有几个副本,快照就会存储几个冗余,也即完全的物理克隆,然后收束到一块。

然而我看了checkpoints和data目录,在数据层面似乎没有记录本机有哪些partition的情况,这种情况下,是不是只能按照原来的拓扑结构进行恢复?

是的,你理解的很对。现在恢复最大的问题就是只能按照原来的拓扑结构进行恢复。这种做法的优势在于备份和恢复速度很快,劣势在于受限于之前集群物理拓扑。

关于如何更好的备份,我们也在探讨。近期会出一个 br 工具,但是仍然是按照物理拓扑直接备份的。如果你有更好的 idea,在兼顾大数据量备份恢复速度的同时,能做到逻辑备份,欢迎来社区贡献。

如果是副本数量=机器数量的情况,比如3副本3机器,是不是只需要保存一台机器上的快照就行了,因为一台机器上就含有所有的分片数据。

现在的结构我觉得快照冗余是不可避免的,因为rocksdb层面就没有把分区区分开来。如果想避免冗余,就得让rocksdb那里区分partition,这样就可以做到每个分片只保存一份,然后根据show hosts的信息进行恢复。但是如果要在数据层面区分partition,似乎就得一个partition启动一个rocksdb才行,这样看起来不太好。

另外你们有实验过create snapshots的速度吗,假如一个space有几百g甚至几个T的数据,这个命令一般耗时多少?我试过4G的space,耗时1s多,但是不敢在线上测试。怕阻塞时间太长了影响服务。

是不是只需要保存一台机器上的快照就行了。

如果都拷贝到一台机器上,得要求用户配置 ssh 免密,才能用 scp 之类的工具自动拷贝。
但是如果存到对象存储等其他外存上,是可以做到的,只需要配置下对象存储的身份信息即可。
这个年后会发布一款 br 工具,实现相关功能。

似乎就得一个partition启动一个rocksdb才行,这样看起来不太好。

你说的很对~ 的确是首先得把同一个 space 中 partition 物理分开,才能做到去重。

这个命令一般耗时多少?

这个实现上都是对 sst 和 wal 的硬链接,所以应该耗时不会太久。至于有没有测过不同量级数据的备份时间,我不太知道。我跟同事确认了下,还没有严格测过,但是可以给出一个大概上限,即 1T 左右的数据,用时不会超过一分钟。
用时和 partition 的数量(partition多 sst 就多)、sst 的数量(每个做硬连接)、机器的数量(发 rpc到不同机器)呈正相关。

好的,谢谢

1 个赞

如果你觉得 muniao 的某个回复解决了你的困惑,可以勾选该条回复为解决方案哈~ 谢谢 sworduo

此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。