注意
本文档适用于 Ceph 开发版本。
CLAY code plugin
CLAY(简称耦合层)代码是一种纠删码,旨在当节点/OSD/机架发生故障并正在修复时,显著节省网络带宽和磁盘IO。设:
d = 修复过程中接触到的OSD数量
如果jerasure被配置为k=8和m=4,失去一个OSD需要d=8其他节点的数据来修复。并且,恢复一个1GiB的数据需要下载8 X 1GiB = 8GiB的信息。
然而,在clay插件d的情况下,它是可配置的,范围在:
k+1 <= d <= k+m-1
默认情况下,CLAY代码插件选择d=k+m-1,因为它在网络带宽和磁盘IO方面提供了最大的节省。在clay插件配置为k=8, m=4和d=11的情况下,当单个OSD发生故障时,会接触11个OSD,并从每个OSD下载250MiB,导致总下载量为11 X 250MiB = 2.75GiB的信息。下面提供了更通用的参数。当对存储在TB级数据量的机架进行修复时,收益非常显著。
插件
总磁盘IO量
jerasure,isa
\(k S\)
clay
\(\frac{d S}{d - k + 1} = \frac{(k + m - 1) S}{m}\)
其中S是正在修复的单个OSD上存储的数据量。在上表中,我们使用了d的最大可能值,因为这将导致从OSD故障中恢复所需的最小数据下载量。
纠删码配置示例
一个可以用来观察减少带宽使用的配置示例:
ceph osd erasure-code-profile set CLAYprofile \
plugin=clay \
k=4 m=2 d=5 \
crush-failure-domain=host
ceph osd pool create claypool erasure CLAYprofile
创建CLAY配置文件
要创建一个新的CLAY代码配置文件:
ceph osd erasure-code-profile set {name} \
plugin=clay \
k={data-chunks} \
m={coding-chunks} \
[d={helper-chunks}] \
[scalar_mds={plugin-name}] \
[technique={technique-name}] \
[crush-failure-domain={bucket-type}] \
[crush-device-class={device-class}] \
[directory={directory}] \
[--force]
其中:
k={data chunks}
- 描述:
每个对象被分成数据块个部分,每个部分存储在不同的OSD上。
- 类型:
整数
- 必需:
是。
- 示例:
4
m={coding-chunks}
- 描述:
对每个对象进行计算并将它们存储在不同的 OSD 上。编码块的数量也是可以同时下线的 OSD 数量,而不会丢失数据。coding chunks for each object and store them on different OSDs. The number of coding chunks is also the number of OSDs that can be down without losing data.
- 类型:
整数
- 必需:
是。
- 示例:
2
d={helper-chunks}
- 描述:
在单个块恢复过程中请求发送数据的OSD数量。d需要选择,使得d,节省越多。
- 类型:
整数
- 必需:
否。
- 设备空间利用率达到此阈值百分比之前,将 OSD 视为:
k+m-1
scalar_mds={jerasure|isa|shec}
- 描述:
scalar_mds指定用作分层结构构建块的插件。它可以是一个jerasure, 是, shec
- 类型:
字符串
- 必需:
否。
- 设备空间利用率达到此阈值百分比之前,将 OSD 视为:
jerasure
technique={technique}
- 描述:
技术指定在指定的‘scalar_mds’插件中选择的 技术。支持的 技术 是‘reed_sol_van’、‘reed_sol_r6_op’、‘cauchy_orig’、‘cauchy_good’、‘liber8tion’(用于jerasure)、‘reed_sol_van’、‘cauchy’(用于isa)和‘single’、‘multiple’(用于shec)。
- 类型:
字符串
- 必需:
否。
- 设备空间利用率达到此阈值百分比之前,将 OSD 视为:
reed_sol_van(用于jerasure、isa)、single(用于shec)
crush-root={root}
- 描述:
用于 CRUSH 规则第一步的 crush bucket 的名称。例如第一步使用默认.
- 类型:
字符串
- 必需:
否。
- 设备空间利用率达到此阈值百分比之前,将 OSD 视为:
default
crush-failure-domain={bucket-type}
- 描述:
确保没有两个块在同一 bucket 中具有相同的故障域。例如,如果故障域是主机,则不会将两个块存储在同一主机上。它用于创建 CRUSH 规则步骤,例如步骤.
- 类型:
字符串
- 必需:
否。
- 设备空间利用率达到此阈值百分比之前,将 OSD 视为:
主机
crush-device-class={device-class}
- 描述:
限制放置到特定类别的设备(例如,
ssd
或hdd
,使用 CRUSH 映射中的 crush device class 名称。- 类型:
字符串
- 必需:
否。
- 设备空间利用率达到此阈值百分比之前,将 OSD 视为:
directory={directory}
- 描述:
Set the 目录从其中加载消息码插件的名称。
- 类型:
字符串
- 必需:
否。
- 设备空间利用率达到此阈值百分比之前,将 OSD 视为:
/usr/lib/ceph/erasure-code
--force
- 描述:
通过同名覆盖现有配置文件。
- 类型:
字符串
- 必需:
否。
子块的概念
CLAY代码能够在磁盘IO和网络带宽方面节省,因为它是一种向量码,并且能够以更细粒度的子块来查看和操作块内的数据。对于CLAY代码,块内的子块数量由以下公式给出:
子块计数 =\(q^{\frac{k+m}{q}}\),其中\(q = d - k + 1\)
在OSD修复过程中,从可用OSD请求的帮助信息只是块的一部分。实际上,在修复过程中访问的块内子块数量由以下公式给出:
修复子块计数 =\(\frac{sub---chunk \: count}{q}\)
示例
对于配置为k=4, m=2, d=5的情况,子块计数为8,修复子块计数为4。因此,在修复过程中只读取半个块。
当k=8, m=4, d=11子块计数为64,修复子块计数为16。从可用OSD读取四分之一的块来修复故障块。
给定工作负载时如何选择配置
只读取块内所有子块中的几个子块。这些子块不一定在块内连续存储。为了获得最佳的磁盘IO性能,读取连续数据是有帮助的。因此,建议选择条带大小,使得子块大小足够大。
对于给定的条带大小(基于工作负载固定),选择k
, m
, d
使得:
子块大小 =\(\frac{stripe-size}{k sub-chunk count}\)= 4KB, 8KB, 12KB …
对于大型工作负载,条带大小较大,容易选择k、m、d。例如,考虑条带大小为64MB,选择k=16, m=4和d=19将会导致1024个子块计数和4KB的子块大小。
对于小型工作负载,k=4, m=2是一个提供网络和磁盘IO收益的良好配置。
与LRC的比较
局部可恢复码(LRC)也是设计用来在单个OSD恢复过程中节省网络带宽和磁盘IO。然而,LRC的重点是保持修复过程中接触的OSD数量(d)最小,但这以存储开销为代价。在clay代码的情况下,它有存储开销m/k。在lrc的情况下,它除了m
的奇偶校验外,还存储(k+m)/d个奇偶校验,导致存储开销(m+(k+m)/d)/k。两者clay和lrc都可以从任何m
OSD的故障中恢复。
参数
磁盘IO,存储开销(LRC)
磁盘IO,存储开销(CLAY)
(k=10, m=4)
7 * S, 0.6 (d=7)
3.25 * S, 0.4 (d=13)
(k=16, m=4)
4 * S, 0.5625 (d=4)
4.75 * S, 0.25 (d=19)
其中S
是正在恢复的单个OSD上存储的数据量。
由 Ceph 基金会带给您
Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.