0%

最近研究了跟了Ceph的RGW S3协议的multipart的一个bug15886,顺着bug分析了下多块上传的流程。问题主要是多块上传中,如果有相同upload id的重传,就有可能丢数据,目前H版和J版都已修复,并在s3-tests的master分支添加了对应的测试用例test_multipart_resend_first_finishes_last

Multipart是客户端发起的一个分块上传的协议。首先是一个POST消息,请求upload id,然后就是每一块的PUT上传,PUT过程类似普通块的上传。
如下图,是multipart的put流程图。出错逻辑主要是函数add_written_obj,他的作用是,记录正在写的对象,如果出错,那么会在销毁processor时清除该对象。问题在于原来函数调用位置在handle_obj_data,也就是写对象之前,导致对象重复时,实际没有写入,但把原来正确的对象清除了。修正后在throttle_data中调用,改在对象写成功后,就不会有问题了。

测试的用例是,先写A,然后以重传形式写B,然后complet B,再完成A。这时实际对象内容应该是A。在B写入时,发现upload id相同的分片存在,就会重新生成临时upload id,保证不重复,所以B也就是一个临时对象,最后complete的A为实际对象内容。

Ceph RGW Multipart 流程图

Fast 16年的论文全集前段时间出来了,先读了EC相关的,其他的后面找时间读。
全集地址:https://www.usenix.org/conference/fast16/technical-sessions

Efficient and Available In-memory KV-Store with Hybrid Erasure Coding and Replication

内存KV系统,贡献一:元数据使用副本,保持高效访问,在数据部分失效时,还能提供访问。数据部分使用ec,节省空间。
贡献二:online recovery,没看出来有啥特别的。。。可能是因为memcached没有提供复杂的恢复机制?
贡献三:在Memcached中实现了上述
他有个假设是后端还有持久化系统,所以我的理解,内存掉电时,如果不够恢复,那只能依靠其他了,这部分论文没有涉及。

Opening the Chrysalis: On the Real Repair Performance of MSR Codes

主要网络编码在工业系统中的应用,实现在了HDFS(批量编码,类似HDFS-Raid)Ceph(在线编码),并比较了多项参数。
网络编码
相比普通EC能节省传输带宽。主要思想,一个节点会存储不止一个编码块(例如r个),修复时,会将本节点的多个编码块编码成一个,所以只要传输1/r存储大小。
缺点,编码更复杂,计算开销也会上升。本片论文采用蝴蝶码,基于GF(2),所以计算开销不高,只能容忍2块丢失(m固定为2,k任意),感觉有点类似Raid6。
暂时还未找到公开代码。

又是除夕夜,从去年这时候开了博客,那时的新年愿望是坚持写博客,零零散散写了30篇,还挖了好多坑,算是完成了一半吧。今年愿望就是能坚持写些有质量的文章哈:)

简单回顾下2015。去年有缘加入了一家创业公司,也算正式进入存储行业,进入了ceph圈,认识了很多大牛。学了很多,做了很多,还有很多要去弥补,要更多的深入原理,多看基本经典书。

今年主要方向还在存储,主要是Ceph,有兴趣的可以一起讨论哈。最近贡献了Ceph的EC Overwrite模块,一些性能优化还没做好,本来要在Ceph Develop Mouthly要讨论下,然后很悲剧的话筒没调好,没能说上话。。。争取今年能够贡献更多核心模块,还得练好听力,不然赶不上老外的语速了。

Ceph编译安装经常会出现各种问题,这里记录下。

1.权限问题

默认ceph是以ceph用户启动的,可以查看src/init-ceph,导致在root用户下用ceph-deploy部署时,mon不能起来。
还没部署前,可以直接修改ceph为root就可以了。已经部署失败后,因为service文件已经写好了,还要改一个地方。
ls /etc/systemd/system/ceph-mon.target.wants/ 可以看到对应的文件为/usr/lib/systemd/system/ceph-mon@.service,所以修改该文件中setuser和setgroup后的用户即可。

2.selinux

需要关闭,否则可能会遇到filestore(/var/lib/ceph/tmp/mnt.icGL7K) mkjournal error creating journal on /var/lib/ceph/tmp/mnt.icGL7K/journal: (13) Permission denied 类似的错误

1
2
3
4
5
6
getenfoce       #查看当前设置
setenforce 0 #临时设置

永久设置,修改文件,然后重启
/etc/selinux/config
SELINUX=disabled

3.动态链接库找不到

默认是安装在/usr/local/bin,对应的库在/usr/local/lib
这种情况需要修改 /etc/ld.so.conf,添加 include /usr/local/lib,然后执行ldconfig 重新加载库。
如果要临时设置,也可以export LD_LIBRARY_PATH=/usr/local/lib

4.python文件找不到

问题同上,默认安装在/usr/local/。在.bashrc中添加python搜索路径,export PYTHONPATH=$PYTHONPATH:/usr/local/lib/python2.7/site-packages/

Ceph EC常用的编码RS(k, m),k块数据块,编码为m块校验块,可以容忍任意m块丢失。所以,为保证数据一致性,EC的写需要至少k块完成,才算写成功。
Ceph为保证这样的一致性,引入了rollback机制,任意操作都是可回滚的,保证在出错时,能够恢复成上一个完整的版本。

本篇就对象删除的流程简单介绍下rollback机制,相对比较好理解。

Read more »

对Ceph的性能测试,常见的有fio测试rbd,而对rados的直接测试,可以通过rados bench命令,本篇介绍另外一个命令rados load-gen

Read more »

传统的存储可靠性都是用多副本实现,但是很多大容量备份场景、多媒体内容存储等,多副本的存储成本已经不能忍受,ErasureCode是通用的解决方案,而且这些场景往往是一次写多次读,很适合EC的特点。

ErasureCode可以用1.5副本就实现丢失任意两块都可以恢复出原始数据,但EC也有很明显的缺点,修复数据代价太大,这个以后再讨论。

Ceph的EC目前支持append写,为丰富接口,对接nfs等,最近就在实现EC的overwrite,所以就从EC的角度,分析一下Ceph的PG层逻辑。

Read more »

ErasureCode应用在存储中的是满足MDS性质的线性分组码,最常用的是Reed Solomon编码。 将一份数据切成K块数据块,然后编码成M块校验块,放到K+M个OSD上,可以容忍任意M块丢失。

Ceph的EC支持主要是Loïc Dachary实现的。具体的PG层逻辑,复用了ReplicatedPG,写数据前的准备工作,都是在主OSD完成。
编码的工作由对应的plugin完成,可以很灵活的实现自己的编码。Plugin的选用是在创建ecpool时的ecprofile中指定的,具体的设置可以参考官网

已有的Plugin是Jerasure,Intel ISA,LRC,SHEL,前两者是采用硬件加速的编码库,后两者是基于RS改进的编码方案,主要改进了修复的效率和占用的资源。

Read more »

上一节分析了整体的读写流程,这节主要理一下OP出队过程中,主OSD上ReplicatePG->do_osd_op的过程。

读OP:OSD_OP_READ

OSD_OP_READ{:width=”40%”}

写OP:OSD_OP_WRITE

OSD_OP_WRITE