Replicação de arquivos

Publicado por Ricardo Lino Olonca (última atualização em 22/05/2013)

[ Hits: 8.798 ]

Homepage: ricardoolonca.blogspot.com.br

Download replicacao.sh




Tenho um servidor de mídia com cerca de 2 TB de arquivos e precisava manter/criar uma réplica desse servidor para o caso de uma pane. E, claro, precisava manter os arquivos sincronizados.

Tentei algumas soluções, como rsync, mas este demorava muito e se fosse colocado no cron acontecia de encavalar vários processos do rsync. Tentei também usar o inosync, mas alguns arquivos de cache geravam problemas. Então criei esse script que deve ser colocado no /etc/init.d e rodar como serviço.

Basicamente ele roda com prioridade baixa, não afetando o desempenho do servidor. Pode fazer o sincronismo para vários servidores ao mesmo tempo beneficiando-se do cache de leitura do disco, e ainda impede que vários processos de rsync sejam encavalados. Em meu ambiente um arquivo leva cerca de 5 minutos para ser replicado para o outro servidor, mas esse valor ainda pode ser melhorado. A única ressalva é fazer com que o servidor origem se autentique no destino através de troca de chaves. Altere as variáveis de acordo com o teu ambiente.

  



Esconder código-fonte

#!/bin/bash
### BEGIN INIT INFO
# Provides:         rsync_server 
# Required-Start:   networking
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Sincronismo dos arquivos entre os Frontend Master e Slave
### END INIT INFO

# Feito do Ricardo Lino Olonca em 18/04/2013
# Versao Beta 0.1.1

##############################
# Variáveis

# Pasta a ser copiada
ORIGEM=/home/ricardo/

# Pasta destino
DESTINO=/home/ricardoolonca/

# Pasta a serem excluídas da cópia
# O caminho deve ser relativo a pasta ORIGEM
EXCLUDE="
.aMule/
.VirtualBox/
.local/share/Trash/
Programas/
Música/
Vídeos/
.mozilla/firefox/ht1sguqp.default/Cache/
.wine/
.cache/
.aqemu/
.ssh/
"

# Prioridade do processo
# Quanto maior, mais lento ele será
NICE=19

# Caminho do programa rsync
RSYNC=/usr/bin/rsync

# Tempo de espera para uma nova cópia, em segundos
TEMPO=60

# Usuário usado na sncronização
USUARIO=ricardoolonca

# Servidor de destino
SERVIDORDESTINO='
10.50.0.32
172.20.1.127
'
##############################

# Inicio do programa
processo(){
    for i in $EXCLUDE
    do
   x="--exclude=$i $x"
    done
    if [ -r $ORIGEM ] && [ -x $RSYNC ]
    then
   while true
   do
     for i in $SERVIDORDESTINO
     do
       nice -$NICE $RSYNC -avrp --delete $ORIGEM $USUARIO@$i:$DESTINO $x >/dev/null 2>/dev/null &
     done
     for i in $SERVIDORDESTINO
     do
       while true
       do
      ps wax | grep rsync | grep $i 2>/dev/null >/dev/null
      if [ $? -eq 0 ]
      then
        sleep 60
      else
        break
      fi
       done
     done
     sleep $TEMPO
   done
    else
   echo Há um erro na configuração
    fi
}

case $1 in
  "start")
   processo &
    ;;
  "stop")
    echo Parando o daemon de sincronização dos arquivos do site
    id=`ps wax | grep $0 | grep start | sed s/^" "//g | cut -d" " -f1 | head -1`
    kill $id
    ;;
  "restart")
    ps wax
    $0 stop
    sleep 5
    $0 start
    ;;
  "status")
    ps wax | grep $0 | grep -v grep | grep -v status >/dev/null
    if [ $? -eq 0 ] 
    then
   echo Daemon de sincronismo dos arquivos rodando
    else
   echo Daemon de sincronismo dos arquivos parado
    fi
    ;;
  *)
    echo "Daemon de sincronismo dos arquivos do site"
    echo "Uso: $0 <start|stop|restart|status>"
esac

Scripts recomendados

Backup de MySql para outro servidor FTP!

Backup dinâmico de banco de dados MySQL

Backup incremental com rsync

Backup de diretórios do sistema Linux

sync_local - backup/restauração local


  

Comentários
[1] Comentário enviado por pedrosainfp em 18/09/2014 - 11:22h

Ola Ricardo, muito bom seu trabalho com rsync. porem uso o Fedora 20 e estou usando seu script. porem quando uso p stop o mesmo não aborta o script.
como faria pra que isso acontecesse

pedrosa@pedrosainfo.com.br

[2] Comentário enviado por ricardoolonca em 02/10/2014 - 11:09h

Com o programa rodando, execute:

# ps wax | grep replicacao.sh | grep start | sed s/^" "//g | cut -d" " -f1 | head -1

O que acontece? Deveria mostrar o PID do processo. Com esse PID eu executo o kill.


[3] Comentário enviado por byraulzito em 31/01/2015 - 07:44h


Parabéns pelo Script!!!!

[4] Comentário enviado por QuestLoder em 22/05/2015 - 10:36h

Opa obrigado por ter partilhado.

Estou fazer os testes no meu ambiente.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts