Replicação de arquivos

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

[ Hits: 7.683 ]

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 [email protected]$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

limpa_bkp.sh

Backup de Roteadores e Switches

rotate.sh - Rotaciona arquivos de acordo com a data

Backup de Máquina Virtual - XenServer

Backup, Recuperação e Chroot


  

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

[email protected]

[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