Armazenamento em cluster para pequenos clusters web usando drbd+ocfs2

Sobre o que vamos falar:
Como implementar rapidamente um armazenamento compartilhado para dois servidores com soluções drbd+ocfs2.

Para quem isso será útil:
Este tutorial será útil para administradores de sistema e todos que estão escolhendo uma forma de implementar um armazenamento ou querem experimentar a solução.

De quais soluções desistimos e por quê

Frequentemente nos deparamos com a situação em que precisamos implementar um armazenamento compartilhado em um pequeno web cluster com boa performance em leitura e gravação. Testamos várias opções de implementações de armazenamento compartilhado para nossos projetos, mas poucas conseguiram nos satisfazer em vários aspectos ao mesmo tempo. Agora, vamos explicar o porquê.

  • O Glusterfs não nos atendeu em performance de leitura e gravação, surgiram problemas com a leitura simultânea de um grande número de arquivos, houve uma alta carga na CPU. O problema de leitura de arquivos poderia ser resolvido acessando-os diretamente nos bricks, mas isso nem sempre é aplicável e, de modo geral, é inadequado.

  • O Ceph nos desagrada pela complexidade excessiva, que pode ser prejudicial em projetos com 2-4 servidores, especialmente se o projeto for posteriormente mantido. Além disso, existem sérias limitações de desempenho que forçam a construção de clusters de armazenamento separados, assim como com o glusterfs.

  • O uso de um único servidor NFS para implementar o armazenamento compartilhado levanta questões sobre a resiliência.

  • S3 é uma excelente solução popular para alguns tipos de tarefas, mas não é um sistema de arquivos, o que limita seu campo de aplicação.

  • Lsyncd. Já que começamos a falar sobre "não-sistemas de arquivos", vale a pena mencionar esta solução popular. Além de não ser adequada para troca bidirecional (mas se realmente for necessário, é possível), ela também não funciona de forma estável com um grande número de arquivos. Um adicional curioso é que ela é de thread única. A razão para isso está na arquitetura do programa: ele usa inotify para monitorar os objetos em operação, que ele configura ao iniciar e ao reescanear. O método de transferência utilizado é o rsync.

Tutorial: como implementar um armazenamento compartilhado com drbd+ocfs2

Uma das soluções mais convenientes para nós foi a combinação ocfs2+drbd. Agora, vamos mostrar como é possível implementar rapidamente um armazenamento compartilhado para dois servidores base de dados de soluções. Mas primeiro, um pouco sobre os componentes:

DRBD — sistema de armazenamento padrão do Linux que permite replicar dados entre servidores em blocos. Sua principal aplicação está na construção de armazenamentos com alta disponibilidade.

OCFS2 — sistema de arquivos que permite o uso compartilhado do mesmo armazenamento entre várias sistemas. Faz parte da distribuição do Linux e consiste em um módulo do kernel e ferramentas de espaço de usuário para trabalhar com o sistema de arquivos. O OCFS2 pode ser usado não apenas sobre o DRBD, mas também sobre iSCSI com múltiplas conexões. No nosso exemplo, estamos usando DRBD.

Todas as ações são realizadas no ubuntu server 18.04 em configuração mínima.

Passo 1. Configurando o DRBD:

No arquivo /etc/drbd.d/drbd0.res descrevemos nosso dispositivo de bloco virtual /dev/drbd0:

resource drbd0 {
    syncer { rate 1000M; }
    net {
        allow-two-primaries;
        after-sb-0pri discard-zero-changes;
        after-sb-1pri discard-secondary;
        after-sb-2pri disconnect;
    }
    startup { become-primary-on both; }
    on drbd1 {
        meta-disk internal;
        device /dev/drbd0;
        disk /dev/vdb1;
        address 10.10.10.192:7789;
}
    on drbd2 {
        meta-disk internal;
        device /dev/drbd0;
        disk /dev/vdb1;
        address 10.10.10.193:7789;
}
}

meta-disk internal — utilizar os mesmos dispositivos de bloco para armazenar metadados
device /dev/drbd0 — usar /dev/drbd0 como caminho para o drbd.
disk /dev/vdb1 — usar /dev/vdb1
syncer { rate 1000M; } — usar largura de banda de um gigabit do canal
allow-two-primaries — opção importante que permite que alterações sejam aceitas em dois servidores primários
after-sb-0pri, after-sb-1pri, after-sb-2pri — opções que controlam as ações do nó ao detectar split-brain. Mais detalhes podem ser encontrados na documentação.
become-primary-on both — estabelece ambos os nós como primários.

No nosso caso, temos duas VMs idênticas, com uma rede virtual dedicada com largura de banda de 10 gigabits.

No nosso exemplo, os nomes de rede dos dois nós do cluster são drbd1 e drbd2. Para um funcionamento correto, é necessário mapear os nomes e endereços IP dos nós no /etc/hosts.

10.10.10.192 drbd1
10.10.10.193 drbd2

Passo 2. Configurando os nós:

Em ambos os servidores, execute:

drbdadm create-md drbd0

Armazenamento em cluster para pequenos clusters web usando drbd+ocfs2

modprobe drbd
drbdadm up drbd0
cat /proc/drbd

Obtivemos o seguinte:

Armazenamento em cluster para pequenos clusters web usando drbd+ocfs2

Podemos iniciar a sincronização. No primeiro nó, é necessário executar:

drbdadm primary --force drbd0

Verifique o status:

cat /proc/drbd

Armazenamento em cluster para pequenos clusters web usando drbd+ocfs2

Ótimo, a sincronização começou. Esperamos a conclusão e vemos a situação:

Armazenamento em cluster para pequenos clusters web usando drbd+ocfs2

Passo 3. Iniciando a sincronização no segundo nó:

drbdadm primary --force drbd0

Obtivemos o seguinte:

Armazenamento em cluster para pequenos clusters web usando drbd+ocfs2

Agora podemos escrever no drbd a partir de dois servidores.

Passo 4. Instalação e configuração do ocfs2.

Usaremos uma configuração bastante trivial:

cluster:
     node_count = 2
     name = ocfs2cluster

node:
     number = 1
     cluster = ocfs2cluster
     ip_port = 7777
     ip_address = 10.10.10.192
     name = drbd1

node:
     number = 2
     cluster = ocfs2cluster
     ip_port = 7777
     ip_address = 10.10.10.193
     name = drbd2

Ele precisa ser gravado em /etc/ocfs2/cluster.conf ambas as nodos.

Criamos um sistema de arquivos no drbd0 em qualquer nodo:

mkfs.ocfs2 -L "testVol" /dev/drbd0

Aqui criamos um sistema de arquivos com o rótulo testVol no drbd0, usando os parâmetros padrões.

Armazenamento em cluster para pequenos clusters web usando drbd+ocfs2

Em /etc/default/o2cb, é necessário definir (como em nosso arquivo de configuração)

O2CB_ENABLED=true 
O2CB_BOOTCLUSTER=ocfs2cluster 

e executar em cada nodo:

o2cb register-cluster ocfs2cluster

Em seguida, ativamos e adicionamos ao início automático todas as unidades necessárias:

systemctl enable drbd o2cb ocfs2
systemctl start drbd o2cb ocfs2

Parte disso já será iniciada durante a configuração.

Passo 5. Adicionamos pontos de montagem no fstab em ambas as nodos:

/dev/drbd0 /media/shared ocfs2 defaults,noauto,heartbeat=local 0 0

O diretório /media/shared deve ser criado previamente.

Aqui usamos as opções noauto, que significa que o sistema de arquivos não será montado na inicialização (prefiro montar sistemas de arquivos de rede via systemd) e heartbeat=local, que significa o uso do serviço heartbeat em cada nodo. Existe também o heartbeat global, que é mais adequado para grandes clusters.

A seguir, podemos montar /media/shared e verificar a sincronização do conteúdo.

Pronto! Como resultado, obtemos um armazenamento mais ou menos tolerante a falhas, com possibilidade de escalabilidade e desempenho decente.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster