分享

Ceph中纠删码的读写过程与缓存分层

 hello_worldw6 2017-08-23

之前一直在关注Ceph读写过程与修复,现将之前看到的内容记录下来。欢迎探讨。


读写过程

上图大体可以表示从文件到保存在存储实体上的过程,详细步骤如下:

 

1.       RADOS中需要配置Object Size的值,也就是每个Object大小的最大值,一般情况下会设置为2M到4M。当一个file存进ceph中时,会根据Object Size将file进行切分。若file的大小不足Object Size,则直接按原大小映射到一个Object中;若file的大小大于Object Size,则file会被切分为若干个完整大小的Object,和一个不完整大小的Object。对于小文件,映射不足一个完整的Object时,并不会发生填充,Object大小就是原始文件的大小。

Object的大小,可以在ceph.file.layout中object_size进行配置。

$ touch file

$ getfattr -n ceph.file.layout file

# file: file

ceph.file.layout="stripe_unit=4194304 stripe_count=1object_size=4194304 pool=cephfs_data"

 

2.       从Object映射到PG的过程就是简单的Hash运算。将Object id计算出一个hash值然后与mask位与就可以得到PG的id值。

 

3.       Crush算法的作用是定位数据存放的位置,在这个步骤中就是将PG映射到一个OSD set中。在三副本replicated下,set中就会有三个osd。第一个就是primary osd,负责接受读写请求和维护一致性以及进行修复。后两个就是replicated osd。

 

4.       写文件的过程是,client先写到primary osd上,然后再由primary osd写到replicated osd上。为了维护强一致性,具体的流程如下。

 

1)      通过上述过程,client找到primary osd,并将Object写入到其上。

2)      再由primary osd写到set中的secondary osd上。

3)      再由primary osd写到set中的Tertiary osd上。2、3基本上是同时进行的。

4)      Secondary osd接收到Object,写入后给Primaryosd发送一个Ack,确认已经写入。

5)      Tertiary osd接收到Object,写入后给Primaryosd发送一个Ack,确认已经写入。4、5过程也可以是同时进行的。

6)      Primary osd在接收到另两个都已经写入的确认后,向client发送一个Ack,表示此Object已经写入完毕。

 

至此一个Object的写过程就已经结束了。需要强调的是,上述1. ,2. ,3.都是发生在client上,而4.过程是client直接与Primary osd联系,减少了cluster中需要传输的总数据量。

 

使用纠删码

使用纠删码也只是上述过程中3、4步骤有所不同。


纠删码编码与解码的运算过程都是在Primary osd做的。一个Object通过Crush算法找到Primary osd,client完全写Object到Primary osd上。之后的过程如上图所示,根据纠删码的参数设置(K,M;K为数据块个数,M为编码块个数),Object在Primary osd上被切分成K个chunk或者说是fragment。若原来Object的大小不能被K整除,则会进行一些填充,以保证每个chunk大小相同。每个chunk的obj_name都相同,用shardk来标记。

 

使用纠删码,原来的Object会产生K+M个chunk。第一个chunk存在Primary ods上,剩下的K+M-1个chunk,Primary osd会依次发送到相应的osd上。

 

在读文件时,Primary osd会收集相应osd上的chunk,然后在Primary osd恢复出原Object,发给client。Primary osd会优先收集数据块进行拼接重建出原Object,编码块用于恢复出丢失的块。

 

纠删码的具体配置过程可以参考:

http://docs./docs/master/dev/erasure-coded-pool/

 

纠删码的默认参数为:

 

缓存分层

单独使用纠删码会产生较大程度的延迟,影响SLA。所以较新版本的ceph中都会将纠删码和缓存分层(Cache Tiering)结合起来使用。

 

缓存分层包括创建一个相对快速的存储设备池,比如说SSD,将其配置为一个缓存层。和一个后备的相对经济的存储设备层,该层主要放置经过纠删码编码后的数据块。Ceph objecter处理Objects的放置位置,tiering agent处理何时将Objects从cache写入到后备存储层。缓存层和后备存储层的存在相对于client都是透明的。

 

Cache tiering agent自动处理缓存层和后备存储层间的数据迁移。有两种模式可以选择:

 

l  Writeback 模式:client写数据到缓存层,并从缓存层接收ACK,同时缓存层中的数据写入到存储层。当client需要存储层中的数据时,tiering agent会写先从存储层中读数据到缓存层,然后再发送给client。

 

l  Read-only模式:client直接写数据到存储层。读数据时,tiering agent先将要读取的Objects从存储层复制到缓存层,再由缓存层发送给client。

 

 

要设置缓存分层就需要有两个池,一个作为后备存储,另一个作为cache。

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多