纠删码

A Ceph pool is associated to a type to sustain the loss of an OSD(i.e. a disk since most of the time there is one OSD per disk). Thedefault choice when creating a pool is replicated,meaning every object is copied on multiple disks. The Erasure Code pool type can be usedinstead to save space.

创建样板纠删码存储池

The simplest erasure coded pool is equivalent to RAID5 andrequires at least three hosts:

  1. $ ceph osd pool create ecpool 12 12 erasure
  2. pool 'ecpool' created
  3. $ echo ABCDEFGHI | rados --pool ecpool put NYAN -
  4. $ rados --pool ecpool get NYAN -
  5. ABCDEFGHI

Note

the 12 in pool create stands forthe number of placement groups.

纠删码配置

The default erasure code profile sustains the loss of a single OSD. Itis equivalent to a replicated pool of size two but requires 1.5TBinstead of 2TB to store 1TB of data. The default profile can bedisplayed with:

  1. $ ceph osd erasure-code-profile get default
  2. directory=.libs
  3. k=2
  4. m=1
  5. plugin=jerasure
  6. ruleset-failure-domain=host
  7. technique=reed_sol_van

Choosing the right profile is important because it cannot be modifiedafter the pool is created: a new pool with a different profile needsto be created and all objects from the previous pool moved to the new.

The most important parameters of the profile are K, M andruleset-failure-domain because they define the storage overhead andthe data durability. For instance, if the desired architecture mustsustain the loss of two racks with a storage overhead of 40% overhead,the following profile can be defined:

  1. $ ceph osd erasure-code-profile set myprofile \
  2. k=3 \
  3. m=2 \
  4. ruleset-failure-domain=rack
  5. $ ceph osd pool create ecpool 12 12 erasure myprofile
  6. $ echo ABCDEFGHI | rados --pool ecpool put NYAN -
  7. $ rados --pool ecpool get NYAN -
  8. ABCDEFGHI

The NYAN object will be divided in three (K=3) and two additionalchunks will be created (M=2). The value of M defines how manyOSD can be lost simultaneously without losing any data. Theruleset-failure-domain=rack will create a CRUSH ruleset that ensuresno two chunks are stored in the same rack.

纠删码 - 图1

More information can be found in the erasure code profiles documentation.

纠删码存储池与缓存分级

Erasure coded pools require more resources than replicated pools andlack some functionalities such as partial writes. To overcome theselimitations, it is recommended to set a cache tierbefore the erasure coded pool.

For instance, if the pool hot-storage is made of fast storage:

  1. $ ceph osd tier add ecpool hot-storage
  2. $ ceph osd tier cache-mode hot-storage writeback
  3. $ ceph osd tier set-overlay ecpool hot-storage

will place the hot-storage pool as tier of ecpool in writeback_mode so that every write and read to the _ecpool are actually usingthe hot-storage and benefit from its flexibility and speed.

It is not possible to create an RBD image on an erasure coded poolbecause it requires partial writes. It is however possible to createan RBD image on an erasure coded pools when a replicated pool tier seta cache tier:

  1. $ rbd create --size 10G ecpool/myvolume

更详细的文档请参阅分级缓存

术语

  • chunk
  • when the encoding function is called, it returns chunks of the samesize. Data chunks which can be concatenated to reconstruct the originalobject and coding chunks which can be used to rebuild a lost chunk.
  • K
  • the number of data chunks, i.e. the number of chunks in which theoriginal object is divided. For instance if K = 2 a 10KB objectwill be divided into K objects of 5KB each.
  • M
  • the number of coding chunks, i.e. the number of additional chunks_computed by the encoding functions. If there are 2 coding _chunks,it means 2 OSDs can be out without losing data.

内容列表