Ceph - Nó único
Às vezes, precisamos apenas testar algo, um comando, algum comportamento de software ou até mesmo algum tipo de integração. O Ceph é uma plataforma de armazenamento definida por software e, devido ao seu uso em muitos casos de uso enormes, algumas implementações mais simples podem passar despercebidas, se tornando complicadas ou impossíveis.
Tudo o que você precisa é de uma máquina, virtual ou não, com 2 núcleos de CPU, 4GB de RAM e, pelo menos, 3 discos.
Você pode usar o Red Hat Ceph ou o Ceph Community; este exemplo seguirá o armazenamento do Red Hat Ceph, mas, apesar da ativação do repositório, todos os outros comandos são os mesmos.
Lembre-se, este é um cluster Ceph simples para estudo, não espere desempenho ou resiliência de dados. A versão usada aqui é a Red Hat Ceph 5; a versão equivalente da comunidade é a versão Pacific.
Preparando a Máquina
Precisamos de uma distribuição Linux instalada nesta máquina; neste caso, será uma RHEL 8.6, mas você pode usar qualquer distribuição suportada pelo Ceph que desejar.
Esta máquina precisa de 4 discos, um para o sistema e os outros três para os OSDs, os Demônios de Armazenamento de Objetos do Ceph. Estou usando libvirt para gerenciar esta máquina virtual, então posso criar os outros discos com a interface gráfica ou com o comando qemu-img
:
cd /var/lib/libvirt/images/
qemu-img create -f qcow2 osd1.qcow2 100G
qemu-img create -f qcow2 osd2.qcow2 100G
qemu-img create -f qcow2 osd3.qcow2 100G
Neste caso, embora os discos tenham 100G, esses discos são thin
, eles ocupam apenas o espaço efetivamente utilizado.
Agora precisamos anexar os discos na máquina virtual:
Instalando o Ceph
Com o Linux instalado e os três discos anexados, adicione ou habilite os repositórios Ceph. No caso do RHEL, use o seguinte comando:
subscription-manager repos \
--enable=rhceph-5-tools-for-rhel-8-x86_64-rpms
Usaremos o cephadm
, uma nova ferramenta do projeto Ceph, para provisionar nosso cluster baseado em contêineres; juntamente com esse pacote, também precisamos do podman
para gerenciar os contêineres, ceph-common
para usar comandos comuns do Ceph e ceph-base
para algumas ferramentas mais avançadas:
dnf install podman cephadm ceph-common ceph-base -y
Para instalar a versão “community”, consulte https://docs.ceph.com/en/latest/cephadm/install/.
Após a instalação do pacote, podemos usar o comando cephadm
para inicializar nosso cluster Ceph:
cephadm bootstrap \
--cluster-network 192.168.122.0/24 \
--mon-ip 192.168.122.185 \
--registry-url registry.redhat.io \
--registry-username '<user>' \
--registry-password '<passwd>' \
--dashboard-password-noupdate \
--initial-dashboard-user admin \
--initial-dashboard-password ceph \
--allow-fqdn-hostname
Configurando o Ceph
Agora que nosso cluster está em funcionamento, precisamos adicionar alguns OSDs para começar a criar discos, sistemas de arquivos ou buckets. Para cada disco que criamos, um OSD é necessário. Podemos ver na saída do comando ceph -s
que precisamos de pelo menos 3 OSDs:
Existem algumas maneiras de adicionar um OSD dentro de um cluster Ceph, duas delas são:
ceph orch daemon add osd ceph0.libvirt.local:/dev/sdb
# or
ceph orch apply osd --all-available-devices
A primeira deve ser executada para cada disco e a segunda pode ser usada para criar automaticamente um OSD para cada disco disponível em cada nó do cluster. Vamos usar a segunda opção, pode levar um tempo para atualizar, mas podemos usar o ceph -s
ou até mesmo ceph orch ps
para observar os novos OSDs:
Precisamos de um último passo antes de usarmos o Cluster Ceph. Após um tempo, se olharmos para ceph -s
, veremos um aviso sobre a disponibilidade dos dados e sua redundância:
Por que isso acontece?
Cada disco, sistema de arquivos ou bucket dentro de um cluster Ceph pertence a um pool, uma partição lógica que é usada para armazenar objetos. Não se deixe enganar por este “objeto”, o Ceph é baseado em RADOS (Armazenamento de Objetos Distribuídos Confiável e Autônomo) e este “objeto” aqui é apenas uma unidade que o Ceph usa para organizar qualquer dado dentro dele.
Por padrão, cada pool tem alguns grupos de posicionamento (PGs) para armazenar dados dentro dele, e por padrão cada pg é replicado duas vezes, isso significa que um único objeto tem duas cópias espalhadas em cada cópia do mesmo pg, mas em lugares diferentes. Este “lugar” por padrão é um host, então cada pg será replicado em hosts diferentes.
Essa configuração é incrível e garante uma alta disponibilidade de dados dentro do Ceph. O problema é que nosso cluster Ceph tem apenas uma única máquina, tornando impossível replicar os pgs e tornando nosso cluster inútil.
Felizmente, essa é a configuração padrão (e sábia), podemos dizer ao Ceph para replicar cada pg dentro de diferentes OSDs em vez de hosts, e podemos fazer isso modificando o mapa crush.
Se apressarmos e esquecermos dessa modificação, todos os comandos que criam discos, sistemas de arquivos ou buckets ficarão parados indefinidamente.
Modificando o Crush Map
O mapa crush é um mapa do cluster e é usado para mapear os dados de forma pseudo-aleatória para os OSDs, distribuindo os dados pelo cluster e seguindo uma replication policy e domínio de falha configurados. É o mapa crush que diz ao Ceph para replicar os pgs em diferentes hosts, este mapa crush é o que iremos modificar.
Primeiro, precisamos extrair o mapa crush:
ceph osd getcrushmap -o crushmap.cm
Em seguida, usamos o crushtool
para descompilar o mapa crush em um formato legível por humanos:
crushtool --decompile crushmap.cm -o crushmap.txt
Depois, modificamos o mapa crush substituindo host por osd:
Recompilamos o crush map:
crushtool --compile crushmap.txt -o new_crushmap.cm
E então atualizamos o cluster ceph com o novo crush map:
ceph osd setcrushmap -i new_crushmap.cm
Depois de um tempo, a mensagem de aviso do ceph -s
desaparecerá e nosso cluster estará pronto para ser utilizado:
Testando o cluster
O armazenamento em bloco fornecido pelo Ceph é chamado de rbd, que significa RADOS block device. Para criar discos, precisamos de um pool habilitado para trabalhar com rbd. Os comandos abaixo criam um pool chamado “rbd” e em seguida ativam esse pool para ser usado para rbd.
ceph osd pool create rbd
ceph osd pool application enable rbd rbd
Depois disso, podemos usar a linha de comando rbd para criar e listar os discos disponíveis:
rbd create mysql --size 1G
rbd create mongodb --size 2G
rbd list
Conclusão
Ceph é uma solução robusta que pode fornecer todos os tipos de armazenamento que precisamos, mas pode parecer um pouco assustador se pensarmos no Ceph como um grande cluster com muitas máquinas e petabytes de dados.
Apesar da robustez da plataforma, ainda podemos usá-la em ambientes com recursos muito limitados para estudar e praticar.