CEPH 集群中数据存储方式

转载

如何 :: 数据存储在 Ceph 集群中

how data is stored in ceph storage

这绝对是你想要了解的事情,数据 _ _ _ Ceph 集群中是如何存储的?

现在展示一个易于理解的 Ceph 数据存储图。

## 池 (POOLS) : Ceph 集群拥有池,池是存储对象的逻辑分组。这些池由 PG(放置组)组成。在创建池时,我们必须提供池将包含的放置组数量,以及对象副本的数量(通常采用默认值,除非另有指定)。

  • 创建具有 128 个放置组的池 (pool-A)

# ceph osd pool create pool-A 128
pool 'pool-A' created

  • 列出池

# ceph osd lspools
0 data,1 metadata,2 rbd,36 pool-A,

  • 查找池正在使用的总放置组数

# ceph osd pool get pool-A pg_num
pg_num: 128

  • 查找池正在使用的复制级别(查看 rep size 值以获取复制)

# ceph osd dump | grep -i pool-A
pool 36 'pool-A' rep size 2 min_size 1 crush_ruleset 0 object_hash rjenkins pg_num 128 pgp_num 128 last_change 4051 owner 0

  • 更改池的复制级别(与上一步比较,rep size 已更改)

# ceph osd pool set pool-A size 3
set pool 36 size to 3

# ceph osd dump | grep -i pool-A
pool 36 'pool-A' rep size 3 min_size 1 crush_ruleset 0 object_hash rjenkins pg_num 128 pgp_num 128 last_change 4054 owner 0

这意味着 pool-A 的所有对象都将在 3 个不同的 OSD 上复制 3 次

现在,将一些数据放入 pool-A 中,数据将以对象的形式存储 :-) 经验法则。

# dd if=/dev/zero of=object-A bs=10M count=1
1+0 records in
1+0 records out
10485760 bytes (10 MB) copied, 0.0222705 s, 471 MB/s

# dd if=/dev/zero of=object-B bs=10M count=1
1+0 records in
1+0 records out
10485760 bytes (10 MB) copied, 0.0221176 s, 474 MB/s

  • 将一些对象放入 pool-A

# rados -p pool-A put object-A object-A

# rados -p pool-A put object-B object-B

  • 检查池包含多少个对象

# rados -p pool-A ls
object-A
object-B

## 放置组 (PG) : Ceph 集群将对象链接到 PG。包含对象的这些 PG 跨多个 OSD 传播,从而提高了可靠性。

## 对象 : 对象是 Ceph 集群中数据存储的最小单位,所有内容都以对象的形式存储,这就是 Ceph 集群也被称为对象存储集群的原因。对象映射到 PG,这些对象/它们的副本始终分布在不同的 OSD 上。这就是 Ceph 的设计方式。

  • 定位对象,它属于哪个 PG 以及存储在哪里?

# ceph osd map pool-A object-A
osdmap e4055 pool 'pool-A' (36) object 'object-A' -> pg 36.b301e3e8 (36.68) -> up [122,63,62] acting [122,63,62]

# ceph osd map pool-A object-B
osdmap e4055 pool 'pool-A' (36) object 'object-B' -> pg 36.47f173fb (36.7b) -> up [153,110,118] acting [153,110,118]

现在,我们已经创建了一个 pool-A,将其复制级别更改为 3,并将对象(object-A 和 object-B)添加到 pool-A。观察上面的输出。它会抛出大量信息

  1. OSD 映射版本 ID 是 e4055
  2. 池名称是 pool-A
  3. 池 ID 是 36
  4. 对象名称(查询的对象,object-A 和 object-B)
  5. 此对象所属的放置组 ID 是 (36.68) 和 (36.7b)
  6. 我们的 pool-A 将复制级别设置为 3,因此此池的每个对象都应该在不同的 OSD 上有 3 个副本,这里我们的对象的 3 个副本位于 OSD.122、OSD.63 和 OSD.62 上
  • 登录到包含 OSD 122、63 和 62 的 Ceph 节点
  • 您可以看到您的 OSD 已挂载

# df -h /var/lib/ceph/osd/ceph-122
Filesystem Size Used Avail Use% Mounted on
/dev/sdj1 2.8T 1.8T 975G 65% /var/lib/ceph/osd/ceph-122

  • 浏览到存储实际对象的目录

# pwd
/var/lib/ceph/osd/ceph-122/current

  • 在此目录下,如果执行 ls 命令,您将看到 PG ID。在我们的例子中,object-A 的 PG ID 是 36.68

# ls -la | grep -i 36.68
drwxr-xr-x 1 root root 54 Jan 24 16:45 36.68_head

  • 浏览到 PG head 目录,给出 ls,您就找到了您的对象。

# pwd
/var/lib/ceph/osd/ceph-122/current/36.68_head

# ls -l
total 10240
-rw-r--r-- 1 root root 10485760 Jan 24 16:45 object-A__head_B301E3E8__24

故事的寓意

  • Ceph 存储集群可以拥有多个池
  • 每个池应该有多个放置组。PG 越多,集群性能越好,设置的可靠性越高。
  • 一个 PG 包含多个对象。
  • 一个 PG 跨多个 OSD 传播,即对象分布在 OSD 上。第一个映射到 PG 的 OSD 将是其主 OSD,相同 PG 的其他 ODS 将是其辅助 OSD。
  • 一个对象可以映射到一个 PG
  • 许多 PG 可以映射到一个 OSD

池需要多少个 PG?

(OSDs * 100)
总 PG = ------------ 副本数

# ceph osd stat
osdmap e4055: 154 osds: 154 up, 154 in

应用公式得到 = (154 * 100) / 3 = 5133.33

现在,将此值四舍五入到下一个 2 的幂,这将为您提供具有 3 的复制大小和整个集群中 154 个 OSD 的池应有的 PG 数量。

最终值 = 8192 PG