Existe uma maneira de espelhar dois servidores no Ubuntu?

8

Eu queria saber se é possível espelhar dois servidores, como você poderia fazer upload de arquivos para um servidor e eles enviariam para o outro servidor etc. Estou mais curioso em espelhar arquivos, ele não precisa espelhar o gerenciamento de pacotes e setup (Mas isso seria legal também!)

Kyle
fonte
Espelhamento de arquivo: Gluster ou DRDB; Espelhamento de site: verniz ou HAProxy; Espelhamento de banco de dados: replicação circular do MySQL ou replicação do Postgres .; - A maioria dos pacotes de servidores possui um modo de operação em cluster ou há proxies reversos que permitem fazer isso.
Tom O'Connor

Respostas:

6

Depende muito do trabalho em questão.

Por que você precisa de espelhamento de arquivos. Deseja atualizar algo como um site ou repositório de conteúdo em que normalmente não há problema em atualizar periodicamente. Ou você precisa de sincronização de dados em tempo real?

Para o espelhamento assíncrono periódico de arquivos, geralmente é suficiente ter uma área de armazenamento temporário na qual você carrega todos os seus dados. E de onde você o distribui para os servidores. No seu caso - com dois servidores - você pode criar algum compartilhamento de arquivos temporário no srv1 para onde transfere os dados (via FTP, NFS, DAV, SFTP etc.) e depois fazer um cronograma sincronizar os arquivos nos diretórios "ao vivo" de srv1 e srv2. A maneira mais fácil de usar o rsync nesse caso é gerar um par de chaves ssh que você usará para transferências de dados e que está autorizado em todos os servidores em seu cluster.

Exemplo:

srv1:/data/staging/  <= is where you upload your data
srv1:/data/production/ <= is where your servers get their production data from
srv2:/data/production/

srv1$ cat /etc/cron.d/syncdata.cron
=====
*/5 * * * * syncuser rsync -a --delete /data/staging/ /data/production/
*/5 * * * * syncuser rsync -az --delete -e ssh /data/staging/ srv2:/data/production/
=====

Isso deve lhe dar uma idéia básica. É claro que você deseja agrupar as chamadas rsync em alguns scripts e implementar um bloqueio adequado para que não seja executado duas vezes, caso a sincronização demore mais de 5 minutos, etc. Além disso, não é necessário dizer que uma área de teste não é obrigatória. Você também pode sincronizar srv1: production com srv2: production diretamente. Apenas o srv2 pode mostrar dados até 5 minutos mais antigos que o srv1. O que pode ser um problema, dependendo de como você equilibra os dois.

Outra maneira de distribuir arquivos de forma assíncrona é empacotá-los como rpm ou, no seu caso, arquivos deb. Coloque-os em um repositório central e instale-os / atualize através de algo como cfengine, monkey ou alguma solução baseada em barramento de mensagem diy. Isso tem o bom efeito colateral da versão dos dados implantados, mas é adequado apenas para quantidades menores de dados que você produz e implanta (como versões do seu próprio software). Você não gostaria de distribuir TBs de dados com isso e também não é adequado para espelhar conteúdo que muda com alta frequência, como a cada dois minutos.

Se você precisar replicar dados quase em tempo real, mas não necessariamente síncrono, em vez de chamar um cron de vez em quando, poderá usar algum método baseado em inotify, como o incron já mencionado, para chamar seus scripts de sincronização. Outra possibilidade é usar o Gamin (que também usa inotify, se presente no Kernel) e escrever seu próprio pequeno daemon de sincronização. Por último, mas não menos importante, se todos os arquivos forem carregados em um servidor via, por exemplo, SFTP, você poderá verificar se o seu servidor SFTP permite definir ganchos que são chamados após determinados eventos, como o upload de arquivos. Dessa forma, você pode dizer ao seu servidor para ativar seu script de sincronização sempre que novos dados forem carregados.

Se você precisar de espelhamento síncrono de dados em tempo real, um sistema de arquivos em cluster pode estar em ordem. DRDB já foi nomeado. É muito bom para replicação no nível do bloco e frequentemente usado para configurações MySQL disponíveis com alta disponibilidade. Você também pode querer dar uma olhada no GFS2, OCFS2, Luster e GlusterFS. Embora o Luster e o GlusterFS não sejam realmente adequados para uma configuração de dois servidores.

Lukas Loesche
fonte
DRBD parece bom. É ruim usá-lo com um servidor ativo? Como, como isso afetaria o servidor ativo?
Kyle
Depende - o que o servidor ao vivo está fazendo? É um servidor web, servidor de banco de dados, servidor de arquivos etc.? O DRBD faz replicação síncrona, com todas as implicações que o acompanham. Dependendo se você planeja seguir Primárias simples ou Primárias duplas, serão aplicadas determinadas restrições de cache de E / S (e sistema de arquivos) que, por sua vez, afetarão seus aplicativos. Para mais detalhes, sugiro a leitura do Guia do Usuário do DRBD drbd.org/users-guide-emb, que está muito bem escrito e explica todas as implicações em grande detalhe.
Lukas Loesche
5

Basicamente, você tem 3 possibilidades:

  1. Deixe seu aplicativo enviar os arquivos para os dois servidores.
  2. Replicação assíncrona, por exemplo, rsync a cada 15 minutos (ou menos) com uma tarefa cron
  3. Replicação síncrona no sistema de arquivos (por exemplo, GlusterFS ) ou no nível do dispositivo de bloco (por exemplo, DRBD ). Se você usar a replicação no nível do dispositivo de bloco, precisará de um sistema de arquivos que suporte o bloqueio distribuído (por exemplo, OCFS2 ou GFS2 ) se desejar ter acesso r / w aos arquivos de ambos os servidores ao mesmo tempo.
joschi
fonte
1

Dependendo do seu caso de uso específico - Você pode usar algo semelhante ao DRBD http://www.drbd.org/

Keiran Holloway
fonte
1

Se você está tentando criar uma solução de backup aqui (o que eu pessoalmente fiz na mesma configuração), tenha cuidado. Você precisa fazer backup de muitos aspectos diferentes, um dos quais (possivelmente) é o maior apagamento acidental - qualquer sistema de replicação ativo apenas replicará o apagamento e não fornecerá segurança. Para essa replicação diária, funciona, mas é uma resposta bastante fraca. Experimente o RSnapshot.

O uníssono pode muito bem funcionar para você, mas não tenho experiência pessoal.

A execução do Rsync nas duas direções com os sinalizadores apropriados pode funcionar, mas tem a questão bastante complicada de como lidar com arquivos excluídos, sem manipulação especial, simplesmente restaura os arquivos, o que é bom se você nunca excluir algo como eu, mas um pouco pobre caso contrário. Também faz coisas estranhas se um arquivo é movido.

Seja lá o que você estiver fazendo, se houver uma situação em que os arquivos possam ser editados simultaneamente nas duas extremidades, você terá um problema. uníssono é a única solução que conheço que pode lidar com isso de maneira satisfatória.

Thingomy
fonte
Observe que os loops mencionados abaixo não serão um problema com o Rsync, pois ele mantém as datas de modificação dos arquivos transferidos, se definidas corretamente.
Thingomy
0

Se for unidirecional (quero dizer, sempre de um servidor para outro servidor, mas não vice-versa), você poderá usar incron. É como o cron, mas baseado em eventos do sistema de arquivos.

Sempre que um arquivo é criado ou alterado, ele aciona um scp ou rsync no outro servidor.

Bidirecional tem o problema de loops :).

chmeee
fonte
0

depende de suas necessidades ..... eu tenho uma configuração muito "barata e fácil" para servidores da web em cluster.

Eu simplesmente tenho um "servidor de arquivos" (NFS) onde todos os servidores web montam os seguintes diretórios:

/etc/apache/sites-enabled
/etc/apache2/sites-avaliable
/var/www

morto simples e trabalhando

bmaeser
fonte
0

clonezilla também pode olhar para o que usa rsync

dream_liner2k2
fonte
Não tenho certeza se o clonezilla é aplicável aqui ... porém, é um bom utilitário.
HopelessN00b