Estoy intentando sincronizar contenido entre dos servidores. Los servidores son compilaciones idénticas (Ubuntu 12.04LTS) y tienen este trabajo cron ejecutándose para sincronizar el contenido:
rsync -arzc --update --delete /htdocs/testing/www/cms_uploads/* [email protected]:/htdocs/testing/www/cms_uploads/
pero obtengo algunos resultados extraños cuando pruebo el proceso como se detalla a continuación.
Primer examen
- Subido aaaa.jpg al Nodo2
- se sincroniza con el Nodo1
- Eliminar del Nodo1
- Reaparece en el Nodo1
- Eliminar del Nodo2
- Eliminado del Nodo1
Segunda prueba
- Subido bbbb.png al Nodo1
- Se sincroniza con Node2
- Eliminar del Nodo2
- Reaparece en el Nodo2
- Eliminar del nodo 1
- Reaparece en el Nodo1
Todo lo que intento hacer es asegurarme de que el mismo contenido sea exactamente el mismo en ambos servidores todo el tiempo. ¿Qué estoy haciendo mal?
Respuesta1
rsync
no está configurado para realizar sincronizaciones bidireccionales. Sin ayuda específica (por ejemplo, sincronización desde la máquina que se cambió) y mucha suerte, no puede hacerlo.
Se necesita suerte para que los cambios sean poco frecuentes y alejados. Si tanto el Nodo1 como el Nodo2 se modifican antes de que se inicie la siguiente sincronización (desde cualquiera de las máquinas), algunos cambios se pierden en la sincronización.
Ver tambiéneste
Respuesta2
Hay algo fundamentalmente roto en el planteamiento del problema. Supongamos que sus servidores están sincronizados y luego crea un archivo aaaa.jpg
en el Nodo 2. ¿Debería la próxima sincronización eliminar ese archivo falso del Nodo 2 (dado que no existe en el Nodo 1, debe haberse eliminado), o debería ¿copiar el archivo al Nodo 1 (dado que no existe en el Nodo 1, debe crearse recientemente)?
El orden en el que ejecutes las sincronizaciones determinará lo que suceda en cada caso. Está prácticamente garantizado que esto no dará el resultado deseado en muchos casos. Peor aún, si las sincronizaciones se ejecutan en paralelo (de modo que uno de los hosts se actualiza mediante su propio trabajo de sincronización y al mismo tiempo es atravesado por el trabajo de sincronización que se ejecuta en el otro host), el resultado parecerá bastante aleatorio.
Rsync está diseñado fundamentalmente para la sincronización unidireccional. No puede simplemente ejecutar dos trabajos rsync y esperar realizar una sincronización bidireccional.
Unísonoes un sincronizador de archivos diseñado para sincronización bidireccional. Es lo más parecido a la herramienta adecuada para su tarea. Configúrelo y ejecútelo unison -auto remote.example.com://path/to/directory /path/to/directory
en uno de los hosts.
No importa qué herramienta utilice, existe la posibilidad de que se produzcan conflictos, por ejemplo, si el mismo archivo se reemplaza por dos versiones diferentes en dos máquinas diferentes. No existe una buena forma automatizada de resolver dichos conflictos, por lo que será necesaria la intervención manual.
En la mayoría de las configuraciones, lo correcto es designar un único servidor como lugar para cargar y sincronizar todos los demás servidores desde ese servidor maestro. Si alguien carga un archivo en un esclavo, haga que transmita la carga al maestro; no cambie nada localmente. Siempre que un archivo cambie en el maestro, envíelo a los esclavos.
Respuesta3
rsync tiene una opción -u que hace:
"Esto obliga a rsync a omitir cualquier archivo que exista en el destino y tenga una hora de modificación más reciente que el archivo de origen. (Si un archivo de destino existente tiene una hora de modificación igual a la del archivo de origen , se actualizará si los tamaños son diferentes.)"
Entonces, un script de shell que contiene
1) el comando que usted proporcionó más la opción -u y menos la opción -c y
2) el mismo comando pero con la dirección invertida
puede ordenar- de lograr una sincronización bidireccional pero con dos problemas:
1) los archivos eliminados (o renombrados) en el servidor remoto se copiarán desde el local b/c rsync pensará que encontró un nuevo archivo en el local, y
2) si Se cambia un solo archivo en ambas ubicaciones entre sincronizaciones, solo se conservarán los cambios más recientes.