KVM + DRBD replicado entre dois servidores ativos-passivos com comutação manual

7

Eu preciso criar uma solução de cluster de dois nós (no estilo ativo-passivo), ou seja, um servidor está ativo enquanto o outro é passivo (standby) que continuamente obtém os dados replicados de ativos. Máquinas virtuais baseadas em KVM seriam executadas no nó ativo.

No caso de o nó ativo ficar indisponível por qualquer motivo, gostaria de manualmente mudar para o segundo nó (tornar-se ativo e o outro passivo).

Eu vi este tutorial: link

No entanto, não sou corajoso o suficiente para confiar em failover totalmente automático e construir algo complexo e confiar que ele funcione corretamente. Muito risco de situação de cérebro dividido, falha de complexidade de alguma forma, corrupção de dados, etc., enquanto meu requisito de tempo de inatividade máximo não é tão severo a ponto de exigir um failover automático imediato.

Estou com problemas para encontrar informações sobre como criar esse tipo de configuração. Se você fez isso, por favor, compartilhe o info / HOWTO em uma resposta.

Ou talvez seja possível criar um failover automático altamente confiável com nós do Linux? O problema com a alta disponibilidade do Linux é que parece haver uma onda de interesse no conceito há 8 anos e muitos tutoriais já são bastante antigos. Isto sugere que pode ter havido problemas substanciais com o HA na prática e alguns / muitos administradores simplesmente o abandonaram.

Se isso for possível, compartilhe as informações sobre como criá-las e suas experiências com clusters em execução em produção .

    
por LetMeSOThat4U 08.10.2018 / 14:42

5 respostas

3

Eu tenho uma instalação muito semelhante com a configuração que você descreveu: um servidor KVM com uma réplica stanby via DRBD ativo / passivo. Para ter um sistema o mais simples possível (e para evitar qualquer divisão automática de cérebros, por exemplo: devido ao fato de meu cliente mexer com a rede de clusters), também descartei o failover automático de clusters.

O sistema tem 5+ anos e nunca me deu nenhum problema. Minha configuração de volume é a seguinte:

  • um volume RAID dedicado para armazenamento de VMs;
  • um pequeno volume de sobreposição contendo arquivos de configuração do QEMU / KVM;
  • volumes maiores para discos virtuais;
  • um recurso DRBD gerenciando todo o dispositivo de bloco de matriz dedicado.

Eu escrevi alguns scripts de shell para me ajudar em caso de failover. Você pode encontrá-los aqui

Observe que o sistema foi arquitetado para desempenho máximo, mesmo à custa de recursos como instantâneos rápidos e discos virtuais baseados em arquivos (em vez de baseados em volume).

Reconstruindo uma configuração semelhante, ativa / passiva agora, eu gostaria de usar o ZFS e a replicação assíncrona contínua via send/recv . Não é uma replicação baseada em bloco em tempo real, mas é mais do que suficiente para 90% + caso. Eu testei essa configuração + switch de marcapasso automático no meu laboratório com grande satisfação, na verdade.

Se a replicação em tempo real for realmente necessária, eu usaria o DRBD em cima de um ZVOL + XFS. Se o uso de módulos de parte 3rdy (como o ZoL é) não for possível, eu usaria um recurso DRBD em cima de um lvmthin volume + XFS.

    
por 08.10.2018 / 21:39
6

Por que não usar itens que foram verificados por milhares de usuários e provaram sua confiabilidade? Você pode simplesmente implantar o servidor Hyper-V gratuitamente com, por exemplo, o StarWind VSAN Free e obter o verdadeiro HA sem quaisquer problemas. Veja este manual: link

    
por 15.10.2018 / 00:46
2

Você pode configurar totalmente o DRBD e usá-lo de maneira puramente manual. O processo não deve ser complexo de todo. Você simplesmente faria o que um cluster de marcapasso ou Rgmanager faz, mas à mão. Essencialmente:

  • Pare a VM no nó ativo
  • Desmembrar o DRBD no nó ativo
  • Promova o DRBD no nó de mesmo nível
  • Inicie a VM no nó do peer

Naturalmente, isso exigirá que ambos os nós tenham os pacotes apropriados instalados e que as configurações e definições da VM existam em ambos os nós.

Posso garantir que a pilha de HA do Linux (corosync e marca-passo) ainda esteja ativamente desenvolvida e suportada. Muitos guias são antigos, o software existe há 10 anos. Quando feito corretamente, não há grandes problemas ou problemas. Não é abandonado, mas não é mais "novo e excitante".

    
por 08.10.2018 / 18:45
1

Os clusters ativos / passivos ainda são muito usados em muitos lugares e em execução na produção. Veja abaixo nossa configuração de produção , ela está funcionando bem e você pode deixá-la em execução no modo manual ( orchestrate=start ) ou ativar o failover automático ( orchestrate=ha ). Usamos o zfs para se beneficiar do zfs send / receive e zfs snapshots, mas também é possível usar o drbd se você preferir a replicação síncrona.

Pré-requisitos:

  • 2 nós (em meus nós físicos de configuração 2, 400 quilômetros de distância)
  • discos internos
  • 1 pool zfs em cada nó
  • vlan esticado (na minha configuração usamos "vrack" no provedor de hospedagem OVH)

Etapas:

  • instale o agente opensvc nos dois nós ( link )
  • forma o cluster opensvc (3 comandos necessários, descritos no screencast no link )
  • crie uma confiança ssh de raiz entre os dois nós
  • crie um serviço do opensvc por convidado do kvm [arquivo de configuração do serviço abaixo]

root@node1:~$ svcmgr -s win1 print config

[DEFAULT]
env = PRD
nodes = node1.acme.com node2.acme.com
id = 7a10881d-e5d5-4817-a8fe-e7a2004c5520
orchestrate = start

[fs#1]
mnt_opt = rw,xattr,acl
mnt = /srv/{svcname}
dev = data/{svcname}
type = zfs

[container#0]
type = kvm
name = {svcname}
guestos = windows
shared = true

[sync#1]
src = data/{svcname}
dst = data/{svcname}
type = zfs
target = nodes
recursive = true
schedule = @12h

Algumas explicações:

  • o serviço é denominado "win1" e cada {svcname} no arquivo de configuração do serviço é uma referência que aponta para o nome real do serviço (win1)
  • início do serviço, faça o seguinte:
    • monte o conjunto de dados do zfs data/win1 no ponto de montagem /srv/win1
    • inicie o contêiner kvm win1
  • ressource sync#1 é usado para declarar uma replicação de conjunto de dados zfs assíncrona para o nó escravo (dados / win1 no nó1 são enviados para dados / win1 no nó2), uma vez por 12 horas no exemplo (zfs send / receive é gerenciado pelo agente opensvc)
  • O agente
  • opensvc também está lidando com a replicação de configuração do kvm qemu e definindo-o quando o serviço é relocado para o nó escravo

Alguns comandos de gerenciamento:

  • svcmgr -s win1 start inicia o serviço
  • svcmgr -s win1 stop pare o serviço
  • svcmgr -s win1 stop --rid container#0 pare o container referenciado container # 0 no arquivo de configuração
  • svcmgr -s win1 switch realocar o serviço para o outro nó
  • svcmgr -s win1 sync update aciona uma cópia de conjunto de dados zfs incremental
  • svcmgr -s win1 sync full aciona uma cópia completa do conjunto de dados do zfs

Alguns serviços que eu gerencio também precisam de snapshots zfs regularmente (diário / semanal / mensal), com retenção, neste caso eu adiciono o seguinte trecho de configuração ao arquivo de configuração de serviço, e o agente opensvc faz o trabalho. / p>

[sync#1sd]
type = zfssnap
dataset = data/{svcname}
schedule = 23:00-23:59@61
keep = 7
name = daily
recursive = true
sync_max_delay = 1d

[sync#1sw]
type = zfssnap
dataset = data/{svcname}
schedule = 23:00-23:59@61 sun
keep = 4
name = weekly
recursive = true
sync_max_delay = 7d

[sync#1sm]
type = zfssnap
dataset = data/{svcname}
schedule = 23:00-23:59@61 * *:first
keep = 6
name = monthly
recursive = true
sync_max_delay = 31d

Conforme solicitado, também adiciono uma configuração lvm / drbd / kvm:

configuração do recurso drbd /etc/drbd.d/kvmdrbd.res :

resource kvmdrbd {
    device /dev/drbd10;
    disk /dev/drbdvg/drbdlv;
    on node1 {
        address 1.2.3.4:12345;
        meta-disk internal;
    }
    on node2 {
        address 4.3.2.1:12345;
        meta-disk internal;
    }
}

arquivo de configuração do serviço opensvc /etc/opensvc/kvmdrbd.conf :

root@node1# svcmgr -s kvmdrbd print config
[DEFAULT]
env = PRD
nodes = node1.acme.com node2.acme.com
id = 7a10881d-f4d3-1234-a2cd-e7a2018c4321
orchestrate = start

[disk#1]
type = lvm
vgname = {env.drbdvgname}
standby = true

[disk#2]
type = drbd
standby = true
shared = true
res = {svcname}

[fs#0]
mnt = {env.basedir}/{svcname}
type = ext4
dev = /dev/{env.drbddev}
shared = true

[container#0]
type = kvm
name = {svcname}
shared = true

[sync#i0]
schedule = @1440

[env]
basedir = /srv
drbddev = drbd10
drbdvgname = drbdvg

Algumas explicações:

  • na minha configuração, eu replico lvm lv com drbd. Eu crio um sistema de arquivos no dispositivo de blocos drbd. Neste sistema de arquivos, eu crio 1 arquivo simples por disco que quero apresentar para o convidado kvm.
  • disk#1 : é o lvm vg que hospeda o grande volume lógico. deve ter pelo menos 5 GB.
  • disk#2 : é o disco drbd apontado pelo nome do recurso drbd. Se o serviço opensvc tiver o nome "foo", você deverá ter o /etc/drbd.d/foo.res. Ou altere o parâmetro do disco # 2.res no arquivo de configuração do serviço.
  • fs#0 : o sistema de arquivos principal que hospeda todos os arquivos do disco para o kvm guest
  • container#0 : o convidado kvm, mesmo nome do serviço opensvc no exemplo. O agente deve ser capaz de resolver o convidado kvm, fazer uma verificação de ping antes de aceitar iniciar o serviço (se o ping responder, o convidado kvm já está sendo executado em algum lugar, e não é uma boa idéia iniciá-lo. pelo agente opensvc)
  • standby = true : significa que esse recurso deve permanecer ativo quando o serviço estiver sendo executado no outro nó. Em nosso exemplo, é necessário manter o drbd rodando bem
  • shared = true : link
por 06.11.2018 / 19:27
0

Atualmente estou em um sistema extremamente similar. 2 servidores, um ativo, um backup e ambos possuem algumas VMs em execução dentro deles. O banco de dados está sendo replicado e os servidores de arquivos estão em constante sincronia com o rsync (mas apenas de um jeito). Em caso de emergência, o servidor secundário está sendo servido. Havia a ideia de usar o Pacemaker e o Corosync, mas como isso tem que ser 100%, não tive coragem de experimentar. Minha ideia é que o NginX esteja vigiando os servidores. Isso pode ser feito porque estou usando um webapplication, mas no seu caso, não sei se você poderia usá-lo. O DRBD é uma bagunça para mim. Os servidores anteriores estavam usando e enquanto aparentemente funcionava, parecia que eu estava tentando dissecar um corpo humano.

Verifique isso, isso pode ajudá-lo: link

Não parece difícil, na verdade, em um ambiente pequeno, eu já tentei e trabalhei. Fácil de aprender, fácil de fazer, fácil de manter. Na verdade, acho que é isso que você está procurando.

    
por 08.10.2018 / 15:02