Ceph IO 模式:丑陋的一面

shan

Ceph IO patterns: the good, the bad and the ugly details

Ceph IO 模式分析的最终部分:丑陋的一面

在开始之前,我想退一步思考一下。我将要揭示的不仅与 Ceph 相关,而且与分布式存储系统更为普遍。所以是的,这很丑陋,但并非仅针对 Ceph,请记住这一点。

丑陋的一面

I.1. RBD 上的 IO 模式

一次 IO 进入 Ceph 会导致 2 次写入,好吧……第二次写入是最糟糕的!

原理

IO patterns on RBD

在上次基准测试中,我们有过类似的假设,但我们没有机会揭示这一事实。幸运的是,英特尔的人们将这个假设变成了现实。这种现象很容易理解。基本上,由于其分布式特性,Ceph 会确定性地存储对象。因此,对象(来自不同的客户端)将映射到相同的 OSD 磁盘。最终,连续流会混合在一起。Ceph 会排队 IO 操作,例如,你可能会得到以下操作

  • object1 指向 pg1.1
  • object2 指向 pg1.2
  • object3 指向 pg1.3
  • object4 指向 pg1.4
  • object5 指向 pg1.5

而 OSD 1 负责这 5 个 PG。但是,没有人知道这些 5 个目录在文件系统(/var/lib/ceph/osd/osd.1/current/pg1.{1,2,3,4,5})上在块设备上的位置如何。如图所示,PG 在块设备上具有确定的(由文件系统决定)位置。总而言之,磁盘的大部分时间都花在从一个磁道跳到另一个磁道上,从而降低了整体性能。

由于我讨厌改写,我将引导你访问英特尔团队的优秀博客文章 这里,该文章更详细地解释了这种行为。

I.2. 使用纠删编码可能会更糟

重用 Loic Dachary 的图片。

Erasure VS replication

这只是一个假设。之前的现象可能会被放大,因为纠删码将数据分成块。如图所示,我们不是写入 3 个对象,而是写入 13 个对象:10 个 1M(切分)+ 3 个(奇偶校验)。我相信纠删码会节省你的空间,但也会降低你的性能。

你必须验证这一点。

最后两个部分有点偏离了 IO 模式主题,但我认为它们很重要,需要考虑。

II. 内存位腐败

内存位腐败是指位从一个位置移位。在像 Ceph 这样的分布式复制环境中,这可能会导致大量数据损坏,因为损坏将简单地传播到整个集群。位移可能很难察觉,因为客户端写入文件,然后文件在进入 Ceph 集群后立即损坏。使用 ECC 内存来防止这种事件是一种普遍的良好做法。

有关更多详细信息,请阅读 Wikipedia 页面。

III. 软件定义存储

Ceph 是软件定义存储,这意味着你的所有 IO 都由软件实体计算、存储和平衡,该实体由人类编程。因此,由于任何原因导致的软件故障都可能破坏所有数据。过去我们已经看到 Ceph 中的功能或标志导致数据损坏,不幸的是,一旦你发现它,就为时已晚。我知道这是最糟糕的情况,但可能性是存在的。

本文标志着我对 IO 模式分析的结束,我真诚地希望这些文章能帮助你更好地了解 Ceph 的内部原理。