19 Pools codificados para eliminação #
O Ceph oferece uma alternativa à replicação normal de dados em pools conhecidos como de eliminação ou codificados para eliminação. Os pools de eliminação não oferecem todas as funcionalidades que os pools replicados (por exemplo, eles não podem armazenar metadados para pools RBD), 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, o que permite a falha de um único disco. Isso equivale a um pool replicado que precisa de 2 TB de armazenamento bruto para a mesma finalidade.
Para obter informações sobre o Código de Eliminação, visite https://en.wikipedia.org/wiki/Erasure_code.
Para obter uma lista de valores de pool relacionados a pools EC, consulte Valores de pool codificado para eliminação.
19.1 Pré-requisito para pools codificados para eliminação #
Para usar a codificação de eliminação, você precisa:
Definir uma regra de eliminação no Mapa CRUSH.
Definir um perfil de código de eliminação que especifica o algoritmo de codificação a ser usado.
Criar um pool usando a regra e o perfil mencionados anteriormente.
Lembre-se de que a modificação do perfil e dos detalhes no perfil não será possível depois que o pool for criado e tiver dados.
Verifique se as regras CRUSH para os pools de eliminação usam indep
para step
. Para saber os detalhes, consulte a Seção 17.3.2, “firstn e indep
”.
19.2 Criando um pool codificado para eliminação de exemplo #
O pool codificado para 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.cephuser@adm >
ceph osd pool create ecpool 12 12 erasure pool 'ecpool' createdA string
ABCDEFGHI
é gravada em um objeto denominadoNYAN
.cephuser@adm >
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
.cephuser@adm >
rados --pool ecpool get NYAN - ABCDEFGHI
19.3 Perfis de código de eliminação #
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:
- chunk
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.
- k
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 emk
objetos de 5 kB cada um. Omin_size
padrão nos pools codificados para eliminação ék + 1
. No entanto, recomendamos que omin_size
seja no mínimok + 2
para evitar perda de gravações e dados.- m
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.
- crush-failure-domain
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 17.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. Observe que isso exige k+m racks.
Com o perfil de código de eliminação padrão usado na Seção 19.2, “Criando um pool codificado para eliminação de exemplo”, você não perderá os dados do cluster se houver falha em um único OSD ou host. 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 (porque k=2, m=1). 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:
cephuser@adm >
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 (consulte a Seção 18.6, “Migração de pool”).
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. Observe que isso é válido apenas com um Mapa CRUSH que tenha compartimentos de memória do tipo “rack”:
cephuser@adm >
ceph osd erasure-code-profile set myprofile \
k=3 \
m=2 \
crush-failure-domain=rack
O exemplo na Seção 19.2, “Criando um pool codificado para eliminação de exemplo” pode ser repetido com este novo perfil:
cephuser@adm >
ceph osd pool create ecpool 12 12 erasure myprofilecephuser@adm >
echo ABCDEFGHI | rados --pool ecpool put NYAN -cephuser@adm >
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.
19.3.1 Criando um novo perfil de código de eliminação #
O comando a seguir cria um novo perfil de código de eliminação:
#
ceph osd erasure-code-profile set NAME \
directory=DIRECTORY \
plugin=PLUGIN \
stripe_unit=STRIPE_UNIT \
KEY=VALUE ... \
--force
- DIRECTORY
Opcional. Defina o nome do diretório do qual o plug-in de código de eliminação é carregado. O padrão é
/usr/lib/ceph/erasure-code
.- PLUGIN
Opcional. Use o plug-in de código de eliminação para calcular blocos de codificação e recuperar blocos ausentes. Os plug-ins disponíveis são “jerasure”, “isa”, “lrc” e “shes”. O padrão é “jerasure”.
- STRIPE_UNIT
Opcional. A quantidade de dados em um pacote, por distribuição. Por exemplo, um perfil com 2 pacotes de dados e stripe_unit=4K coloca a faixa 0-4K no pacote 0, 4K-8K no pacote 1 e 8K-12K no pacote 0 novamente. Esse valor deve ser um múltiplo de 4K para obter o melhor desempenho. O valor padrão é extraído da opção de configuração do monitor
osd_pool_erasure_code_stripe_unit
quando um pool é criado. O "stripe_width" de um pool que usa este perfil será o número de pacotes de dados multiplicado por esta "stripe_unit".- KEY=VALUE
Os pares de chave/valor das opções específicas ao plug-in de código de eliminação selecionado.
- --force
Opcional. Substitua um perfil existente pelo mesmo nome e permita definir uma stripe_unit sem alinhamento de 4K.
19.3.2 Removendo um perfil de código de eliminação #
O comando a seguir remove um perfil de código de eliminação conforme identificado por seu NAME:
#
ceph osd erasure-code-profile rm NAME
Se o perfil for referenciado por um pool, haverá falha na exclusão.
19.3.3 Exibindo detalhes do perfil de código de eliminação #
O comando a seguir exibe os detalhes de um perfil de código de eliminação conforme identificado por seu NAME:
#
ceph osd erasure-code-profile get NAME
19.3.4 Listando perfis de código de eliminação #
O comando a seguir lista os nomes de todos os perfis de código de eliminação:
#
ceph osd erasure-code-profile ls
19.4 Marcando pools codificados para eliminação com dispositivo de blocos RADOS #
Para marcar um pool EC como pool RBD, sinalize-o de acordo:
cephuser@adm >
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:
cephuser@adm >
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”.