database - sincronizar - replicacion sql server 2012 paso a paso
Diferencia entre la replicación de secuencias y la replicación lógica (1)
TL; DR : la replicación lógica envía cambios fila por fila, la replicación física envía cambios de bloque de disco. La replicación lógica es mejor para algunas tareas, la replicación física para otras.
A partir de 9.5 la replicación lógica es bastante inmadura. Use la replicación física si está haciendo esta pregunta.
La replicación de secuencias puede ser una replicación lógica. Todo es un poco complicado.
WAL-envío vs transmisión
Hay dos formas principales de enviar datos desde el maestro a la réplica en PostgreSQL:
WAL-shipping o archivado continuo , donde los archivos de registro de escritura anticipada individuales se copian de
pg_xlog
mediante elpg_xlog
archive_command
ejecuta en el maestro a otra ubicación. Unrestore_command
configurado enrestore_command
de la réplica se ejecuta en la réplica para recuperar los archivos para que la réplica pueda reproducir la WAL.Esto es lo que se usa para la replicación de un punto en el tiempo (PITR), que se usa como un método de copia de seguridad continua.
No se requiere una conexión de red directa al servidor maestro. La replicación puede tener largos retrasos, especialmente sin un conjunto de tiempo de
archive_timeout
. El envío WAL no se puede utilizar para la replicación síncrona.replicación de transmisión , donde cada cambio se envía a uno o más servidores de réplica directamente a través de una conexión TCP / IP a medida que se produce. Las réplicas deben tener una conexión de red directa que el maestro haya configurado en la opción
primary_conninfo
.La replicación de secuencias tiene poco o ningún retraso, siempre que la réplica sea lo suficientemente rápida para mantenerse al día. Puede ser utilizado para la replicación síncrona . No puede usar la replicación de transmisión por secuencias para PITR 1, por lo que no es muy útil para la copia de seguridad continua. Si sueltas una tabla en el master, oops, también se suelta en las réplicas.
Por lo tanto, los dos métodos tienen propósitos diferentes.
Asíncrono vs streaming síncrono
Además de eso, hay una replicación de transmisión síncrona y asíncrona :
En la replicación de transmisión asíncrona, las réplicas pueden quedarse atrás del maestro a tiempo cuando el maestro es más rápido / más ocupado. Si el maestro falla, es posible que pierda datos que aún no se hayan replicado.
Si la réplica asíncrona queda muy por detrás del maestro, el maestro podría desechar la información que necesita la réplica si
wal_keep_segments
es demasiado bajo y no se utiliza ninguna ranura, lo que significa que tiene que volver a crear la réplica desde cero. O elpg_xlog
del maestro puede llenarse y hacer que el maestro deje de funcionar hasta que se libere espacio en el disco siwal_keep_segments
es demasiado alto o se usa una ranura.En la replicación sincrónica, el maestro no termina de cometer hasta que una réplica confirma que recibió la transacción 2 . Nunca pierdes datos si el maestro falla y tienes que conmutar por error a una réplica. El maestro nunca desechará los datos que necesita la réplica ni llenará su xlog y se quedará sin espacio en el disco debido a los retrasos de la réplica. A cambio, puede hacer que el maestro se ralentice o incluso deje de funcionar si las réplicas tienen problemas, y siempre tiene algún impacto en el rendimiento del maestro debido a la latencia de la red.
Cuando hay varias réplicas, solo una es sincrónica a la vez. Ver
synchronous_standby_names
.
No se puede tener envío de registro síncrono.
En realidad, puede combinar el envío de registros y la replicación asíncrona para protegerse de tener que volver a crear una réplica si se queda muy atrás, sin riesgo de que afecte al maestro. Esta es una configuración ideal para muchas implementaciones, combinada con el monitoreo de cuán lejos está la réplica detrás del maestro para garantizar que esté dentro de los límites aceptables de recuperación de desastres.
Lógico vs fisico
Además de eso , tenemos replicación de transmisión lógica frente a física , tal como se introdujo en PostgreSQL 9.4:
En la transmisión física, los cambios de replicación se envían casi a nivel de bloque de disco, como "en el desplazamiento 14 de la página 18 del disco de la relación 12311, se escribió una tupla con un valor hexadecimal 0x2342beef1222 ....".
La replicación física lo envía todo : el contenido de cada base de datos en la instalación de PostgreSQL, todas las tablas en cada base de datos. Envía entradas de índice, envía los datos de la tabla completamente nueva cuando
VACUUM FULL
, envía datos para transacciones que se retrotraen, etc. Por lo tanto, genera una gran cantidad de "ruido" y envía una gran cantidad de datos en exceso. También requiere que la réplica sea completamente idéntica, por lo que no puede hacer nada que requiera una transacción, como crear tablas temporales o no registradas. La consulta de la réplica retrasa la replicación, por lo que las consultas largas en la réplica deben cancelarse.A cambio, es simple y eficiente aplicar los cambios en la réplica, y la réplica es exactamente igual a la maestra. DDL se replica de manera transparente, como todo lo demás, por lo que no requiere un manejo especial. También puede transmitir grandes transacciones a medida que ocurren, por lo que hay poco retraso entre confirmar en el maestro y confirmar en la réplica, incluso para grandes cambios.
La replicación física es madura, bien probada y ampliamente adoptada.
La replicación de transmisión lógica , nueva en 9.4, envía cambios a un nivel superior y mucho más selectivamente.
Replica solo una base de datos a la vez. Envía solo cambios de fila y solo para transacciones confirmadas, y no tiene que enviar datos de vacío, cambios de índice, etc. Puede enviar datos de forma selectiva solo para algunas tablas dentro de una base de datos. Esto hace que la replicación lógica sea mucho más eficiente en ancho de banda.
Operar a un nivel más alto también significa que puede realizar transacciones en las bases de datos de réplica. Puede crear tablas temporales y sin registro. Incluso mesas normales, si quieres. Puede utilizar contenedores de datos externos, vistas, crear funciones, lo que quiera. No hay necesidad de cancelar las consultas si se ejecutan demasiado tiempo tampoco.
La replicación lógica también se puede usar para crear una replicación de múltiples maestros en PostgreSQL, que no es posible mediante la replicación física.
Sin embargo, a cambio, no puede (actualmente) transmitir grandes transacciones a medida que ocurren. Tiene que esperar hasta que se comprometan. Por lo tanto, puede haber un retraso prolongado entre una transacción grande que comprometa en el maestro y se aplica a la réplica.
Repite las transacciones estrictamente en el orden de compromiso, por lo que las transacciones pequeñas y rápidas pueden atascarse detrás de una transacción grande y retrasarse bastante tiempo.
DDL no se maneja automáticamente. Debe mantener las definiciones de la tabla sincronizadas entre el maestro y la réplica, o la aplicación que usa la replicación lógica debe tener sus propias instalaciones para hacerlo. Puede ser complicado hacer esto bien.
El proceso de aplicación en sí mismo es más complicado que "escribir algunos bytes donde también se me indique". También requiere más recursos en la réplica que la replicación física.
Las implementaciones actuales de replicación lógica no son maduras, ni están ampliamente adoptadas, ni son particularmente fáciles de usar.
Demasiadas opciones, dime que hacer.
Uf. Complicado, ¿eh? Y ni siquiera me he metido en los detalles de replicación retrasada, slots, wal_keep_segments
, líneas de tiempo, cómo funciona la promoción, Postgres-XL, BDR y multimaster, etc.
Entonces, ¿qué debes hacer ?
No hay una sola respuesta correcta. De lo contrario, PostgreSQL solo soportaría eso de una manera. Pero hay algunos casos de uso comunes:
Para la copia de seguridad y la recuperación de desastres, use pgbarman
para hacer copias de seguridad básicas y retener WAL para usted, proporcionando una copia de seguridad continua fácil de administrar. Aún debe realizar copias de seguridad periódicas pg_dump
como seguro adicional.
Para una alta disponibilidad con cero riesgo de pérdida de datos, utilice la replicación sincrónica de transmisión.
Para una alta disponibilidad con un bajo riesgo de pérdida de datos y un mejor rendimiento , debe usar la replicación de transmisión asíncrona. O bien tiene habilitado el archivado WAL para el repliegue o use una ranura de replicación. Monitorea qué tan lejos está la réplica detrás del maestro usando herramientas externas como Icinga.
Referencias
¿Alguien podría decirme más sobre la diferencia entre la replicación física y la replicación lógica en PostgreSQL?