O Ceph oferece uma alternativa à replicação normal de dados em pools conhecidos como de eliminação ou com codificação de eliminação. Os pools de eliminação não têm todas as funcionalidades dos pools replicados, mas exigem menos armazenamento bruto. Um pool de eliminação padrão capaz de armazenar 1 TB de dados requer 1,5 TB de armazenamento bruto. Isso equivale a um pool replicado que precisa de 2 TB de armazenamento bruto para a mesma quantidade de dados.
Para obter informações sobre a Codificação de Eliminação, visite https://en.wikipedia.org/wiki/Erasure_code.
Ao usar o FileStore, você não pode acessar pools com codificação de eliminação pela interface do RBD, a menos que você tenha uma camada de cache configurada. Consulte a Seção 9.3, “Pool com codificação de eliminação e camada de cache” para obter mais detalhes ou use o BlueStore.
Verifique se as regras CRUSH para os pools de eliminação usam indep
para step
. Para saber os detalhes, consulte a Seção 6.3.2, “firstn e indep”.
O pool com codificação de eliminação mais simples é equivalente ao RAID5 e requer pelo menos três hosts. Este procedimento descreve como criar um pool para fins de teste.
O comando ceph osd pool create
é usado para criar um pool do tipo de eliminação. 12
representa o número de grupos de posicionamento. Com os parâmetros padrão, o pool é capaz de resolver a falha de um OSD.
root #
ceph osd pool create ecpool 12 12 erasure
pool 'ecpool' created
A string ABCDEFGHI
é gravada em um objeto denominado NYAN
.
cephadm >
echo ABCDEFGHI | rados --pool ecpool put NYAN -
Para fins de teste, os OSDs agora podem ser desabilitados. Por exemplo, desconecte-os da rede.
Para testar se o pool é capaz de resolver a falha de dispositivos, o conteúdo do arquivo pode ser acessado com o comando rados
.
root #
rados --pool ecpool get NYAN -
ABCDEFGHI
Quando o comando ceph osd pool create
é invocado para criar um pool de eliminação, o perfil padrão é usado, a menos que outro perfil seja especificado. Os perfis definem a redundância dos dados. Para fazer isso, defina dois parâmetros denominados aleatoriamente k
e m
. k e m definem em quantos pacotes
os dados são divididos e quantos pacotes de codificação são criados. Em seguida, os pacotes redundantes são armazenados em OSDs diferentes.
Definições necessárias para perfis de pool de eliminação:
quando a função de codificação é chamada, ela retorna pacotes do mesmo tamanho: pacotes de dados que podem ser concatenados para reconstruir o objeto original e pacotes de codificação que podem ser usados para reconstruir um pacote perdido.
o número de pacotes de dados, que é o número de pacotes em que objeto original é dividido. Por exemplo, se k = 2
, um objeto de 10 KB será dividido em k
objetos de 5 KB cada um.
o número de pacotes de codificação, que é o número de pacotes adicionais calculado pelas funções de codificação. Se houver 2 pacotes de codificação, isso significa que 2 OSDs poderão ser eliminados sem perda de dados.
define para quais dispositivos os pacotes são distribuídos. Um tipo de compartimento de memória precisa ser definido como valor. Para todos os tipos de compartimento de memória, consulte a Seção 6.2, “Compartimentos de memória”. Se o domínio de falha for rack
, os pacotes serão armazenados em racks diferentes para aumentar a resiliência em caso de falhas no rack.
Com o perfil de codificação de eliminação padrão usado na Seção 9.1, “Criando um pool com codificação de eliminação de exemplo”, você não perderá os dados do cluster se houver falha em um único OSD. Dessa forma, para armazenar 1 TB de dados, ele precisa de mais 0,5 TB de armazenamento bruto. Isso significa que 1,5 TB de armazenamento bruto é necessário para 1 TB de dados. Isso equivale a uma configuração RAID 5 comum. Para comparação: um pool replicado precisa de 2 TB de armazenamento bruto para armazenar 1 TB de dados.
As configurações do perfil padrão podem ser exibidas com:
root #
ceph osd erasure-code-profile get default
directory=.libs
k=2
m=1
plugin=jerasure
crush-failure-domain=host
technique=reed_sol_van
A escolha do perfil correto é importante, porque ele não poderá ser modificado após a criação do pool. Um novo pool com um perfil diferente precisa ser criado, e todos os objetos do pool anterior precisam ser movidos para o novo.
Os parâmetros mais importantes do perfil são k
, m
e crush-failure-domain
porque definem o overhead de armazenamento e a durabilidade dos dados. Por exemplo, se a arquitetura desejada tiver que sustentar a perda de dois racks com um overhead de armazenamento de 66%, o seguinte perfil poderá ser definido:
root #
ceph osd erasure-code-profile set myprofile \
k=3 \
m=2 \
crush-failure-domain=rack
O exemplo na Seção 9.1, “Criando um pool com codificação de eliminação de exemplo” pode ser repetido com este novo perfil:
root #
ceph osd pool create ecpool 12 12 erasure myprofilecephadm >
echo ABCDEFGHI | rados --pool ecpool put NYAN -root #
rados --pool ecpool get NYAN - ABCDEFGHI
O objeto NYAN será dividido em três (k=3
), e dois pacotes adicionais serão criados (m=2
). O valor de m
define quantos OSDs podem ser perdidos simultaneamente sem nenhuma perda de dados. O crush-failure-domain=rack
criará um conjunto de regras CRUSH para garantir que dois pacotes não sejam armazenados no mesmo rack.
Para obter mais informações sobre os perfis de codificação de eliminação, consulte http://docs.ceph.com/docs/master/rados/operations/erasure-code-profile.
Os pools com codificação de eliminação requerem mais recursos do que os pools replicados e não têm algumas funcionalidades, como gravações parciais. Para compensar essas limitações, é recomendado definir uma camada de cache antes do pool com codificação de eliminação.
Por exemplo, se o pool “hot-storage” for constituído de armazenamento rápido, o “ecpool” criado na Seção 9.2, “Perfis de codificação de eliminação” poderá ser acelerado com:
root #
ceph osd tier add ecpool hot-storageroot #
ceph osd tier cache-mode hot-storage writebackroot #
ceph osd tier set-overlay ecpool hot-storage
Isso colocará o pool “hot-storage” como uma camada do ecpool no modo write-back para que cada gravação e leitura no ecpool realmente usem o hot-storage e aproveitem os benefícios da flexibilidade e velocidade.
Ao usar o FileStore, não é possível criar uma imagem RBD em um pool com codificação de eliminação, pois ele requer gravações parciais. No entanto, é possível criar uma imagem RBD em um pool com codificação de eliminação quando uma camada do pool replicado definiu uma camada de cache:
root #
rbd --pool ecpool create --size 10 myvolume
Para obter mais informações sobre camadas de cache, consulte o Capítulo 10, Camadas de cache.
Para marcar um pool EC como pool RBD, sinalize-o de acordo:
root #
ceph osd pool application enable rbd ec_pool_name
O RBD pode armazenar dados da imagem em pools EC. No entanto, o cabeçalho e os metadados da imagem ainda precisam ser armazenados em um pool replicado. Considerando que você tem um pool chamado “rbd” para esta finalidade:
root #
rbd create rbd/image_name --size 1T --data-pool ec_pool_name
Você pode usar a imagem normalmente, como qualquer outra, com exceção de que todos os dados serão armazenados no pool ec_pool_name em vez do “rbd”.