我们团队目前正在决定是否在 cephfs 目录上实现快照,从而试图了解快照对集群造成的影响和性能问题。
我们主要关心的是“当数据写入快照下的文件时,集群会受到怎样的影响?”。我们能够发现 Ceph 使用 Copy-on-write 机制来克隆快照,所以我的问题是,例如,如果我在快照下有一个 1GB 的文件,并且我将另外 10MB 的数据附加到文件中,那么由于新的写入,将复制多少数据?
我的理解是,由于 Ceph 将文件条带化为多个对象,因此只会复制包含最后一个 stripe_unit 的对象(假设它没有完全填充)并将新数据添加到其中,然后 Ceph 以某种方式设法包含新对象当我请求当前版本文件时,当我从快照请求文件时将包含旧对象。复制的数据 = O(10MB),我的意思是它按照数据写入的顺序,以及一些元数据更改。
或者由于 Ceph 现在使用 Bluestore 作为存储层,它是否有更好的优化(与上述情况相比),比如在编辑与最后一个 stripe_unit 对应的对象时,ceph 只会将新数据写入磁盘中的某个位置,然后编辑对象的元数据以包含新数据的位置,并维护基于快照的元数据版本,以便为我们提供以前时间点的文件内容。复制/写入的数据 = 10MB 和一些更多的元数据更改(与上述情况相比)。
或者是 Ceph 将复制整个文件并编辑文件的新副本的情况,即复制的数据为 1GB + 10MB。我假设情况并非如此,因为它显然不是大文件的最佳选择。
PS:任何关于测量快照对集群的影响的资源以及任何解释 Ceph 快照内部的资源都将非常感激。我在互联网上进行了广泛的搜索,但找不到任何相关数据。尝试阅读代码,但你们可能会猜到它是怎么回事。