为了承受OSD丢失,一个Ceph pool与一个类型相关联(大多数情况下每个磁盘有一个OSD)。当创建pool时,默认选择replicate,这意味着每个object都被复制到多个磁盘上。可以使用Erasure Code pool类型替代replicate,以节省空间。
CREATING A SAMPLE ERASURE CODED POOL
最简单的erasure coded pool相当于RAID5,并且至少需要三台主机:
1 | ceph osd pool create ecpool 12 12 erasure |
请注意,pool 中的12表示placement groups的数量。
ERASURE CODE PROFILES
默认的erasure code profile会承受丢失1个OSD。它相当于一个大小为2的replicated pool,但需要1.5TB而不是2TB来存储1TB的数据。默认profile显示:
1 | ceph osd erasure-code-profile get default |
选择正确的profile非常重要,因为在创建pool后无法对其进行修改:需要创建具有不同profile的新pool,并将先前pool中的所有objects都移动到新的pool中。
profile最重要的参数是K,M和crush-failure-domain,因为它们定义了存储开销和数据持久性。例如,期望在系统架构中必须承受两个racks间的损失,并且控制额外增加40%存储开销,则可以定义以下profile:
1 | ceph osd erasure-code-profile set myprofile \ |
NYAN object将被分成三部分(K = 3),并创建两个附加chunks(M = 2)。M的值定义了可以同时丢失多少OSD而不损失任何数据。crush-failure-domain = rack将创建一个CRUSH rule,以确保没有两个chunks存储在同一个rack中。
更多信息可以在erasure code profiles documentation中找到。
ERASURE CODING WITH OVERWRITES
默认情况下,erasure coded pools仅适用于像RGW那样,完整object writes和appends的场景。Luminous版本,可以为每个pool设置启用erasure coded pool的partial writes。 这让RBD和CephFS可以将他们的数据存储在erasure coded pool中:
1 | ceph osd pool set ec_pool allow_ec_overwrites true |
这只能对bluestore OSD上的pool启用,因为bluestore的checksumming用于在deep-scrub过程中检查bitrot或其他corruption。除了不安全之外,使用filestore进行ec overwrites,相对于bluestore性能低。
Erasure coded pools不支持omap(ObjectMap),因此要将它们与RBD和CephFS一起使用,必须明确指示它们将data存储在ec pool中,将metadata存储在replicated pool中。对于RBD,这意味着在创建image时,需要使用–data-pool指定erasure coded pool:
1 | rbd create --size 1G --data-pool ec_pool replicated_pool/image_name |
对于CephFS,在创建file system时或者通过file layouts设定一个erasure coded pool作为默认的data pool。
ERASURE CODED POOL AND CACHE TIERING
Erasure coded pools需要比replicated pools更多的资源,并且缺少一些功能,如omap。为了克服这些限制,可以在erasure coded pool之前设置一个cache tier。
例如,hot-storage pool由fast storage设备组成:
1 | ceph osd tier add ecpool hot-storage |
hot-storage pool作为ecpool的tier,将数据以writeback模式回写至ecpool,所以每次write和read这个ecpool的时候,实际使用的是hot-storage。
更多信息可以在cache tiering documentation中找到。
GLOSSARY
chunk
当encoding function被调用时,它返回相同大小的chunks。Data chunks可以连接起来重建original object和coding chunks,这些chunks可以用来重建丢失的chunk。
K
data chunks的数量,即original object被划分成chunks的数量。例如,如果K = 2,10KB objects分为每个5KB的K个objects。
M
coding chunks的数量,即由encoding functions计算的附加chunks的数量。如果有2个coding chunks,这意味着2个OSD可以在不丢失数据的情况下out。
TABLE OF CONTENT
Erasure code profiles
Jerasure erasure code plugin
ISA erasure code plugin
Locally repairable erasure code plugin
SHEC erasure code plugin
附录
ObjectMap参考链接:
【1】http://bean-li.github.io/ceph-omap
【2】https://my.oschina.net/u/2460844/blog/604530
【3】http://www.wzxue.com/ceph-filestore
ceph中所有块设备、对象存储、文件存储最后都要转化为对象(object),这个object包含3个元素:data、xattr、omap。
- data是保存对象的数据。
- xattr是保存对象的扩展属性,每个对象文件都可以设置文件的属性,这个属性是一个key/value值对,但是受到文件系统的限制,key/value对的个数和每个value的大小都进行了限制。
- 如果要设置的对象的key/value不能存储在文件的扩展属性中,还存在另外一种方式保存omap,omap实际上是保存到了key/vaule 值对的数据库levelDB(L版是RocksDB)中,在这里value的值限制要比xattr中好的多。