Nuestra réplica establecida se ha roto ("el segmento WAL solicitado ya se ha eliminado" durante el tiempo de inactividad) No podemos detener fácilmente al maestro nuevamente.
Podemos hacer
pg_start_backup()
,rsync ${PGDATA}/
maestro a esclavo,pg_stop_backup()
... mientras el master postgresql todavía está bajo carga completa? (O pg_start_backup()
conducirá a
- cerraduras de mesa,
- Bloques de E / S,
- inconsistencias,
- alarma de incendios,
- respuesta lenta de db
En otras palabras, ¿ pg_start_backup()
afectará nuestra aplicación?
postgresql
replication
Daniel
fuente
fuente
Respuestas:
pg_start_backup
realizará un punto de control, como señala dezso. Esto tiene un impacto, pero su base de datos realiza puntos de control con bastante frecuencia de todos modos, y debe hacerlo para funcionar, por lo que claramente no son un problema para usted. Un punto de control temprano significa que se han acumulado menos datos, lo que significa que, en todo caso, un punto de controlpg_start_backup
tendrá un impacto menor de lo normal.Donde debe preocuparse es el rsync o
pg_basebackup
paso equivalente . La lectura de E / S de esto no será tan mala ya que es secuencial, pero probablemente dañará significativamente el rendimiento de E / S de su base de datos, y también tenderá a expulsar los datos calientes de la memoria caché de RAM a favor de menos -usados, lo que provoca que la memoria caché se agite a medida que los datos más necesarios se vuelven a leer.Puede usar
nice
yionice
para ayudar a limitar el impacto de E / S (pero no el impacto de la memoria caché); Sin embargo, hay un costo para eso. La copia de seguridad llevará más tiempo, y hasta que complete la copia de seguridad y ejecutepg_stop_backup
su sistema, según tengo entendido, está acumulando WAL que no puede eliminar, acumulando deudas de puntos de control para un GRAN punto de control al final de la ejecución de la copia de seguridad, y está acumulando tabla e índice hincha porque no puede limpiar las filas muertas. Por lo tanto, realmente no puede permitirse que la copia de seguridad tome para siempre, especialmente si tiene tablas de rotación muy altas.Al final, es difícil decir si puede usar de forma segura
pg_start_backup
ypg_stop_backup
para copias de seguridad en caliente en su entorno. La mayoría de la gente puede, pero si está cerca del límite de lo que puede hacer su hardware, tiene requisitos de tiempo ajustados, no puede permitirse el riesgo de un bloqueo y tiene tablas de rotación muy altas, así como tablas muy grandes, puede ser problemático .Desafortunadamente, necesitas probarlo y verlo.
Si puede, puede valer la pena emitir un informe y
CHECKPOINT
luego tomar una instantánea atómica del volumen en el que se encuentra su base de datos utilizando LVM, las herramientas de su SAN, EBS o lo que sea que esté utilizando. Si puede hacer esto, puede copiar la instantánea a su gusto. Este enfoque no es adecuado para realizar una copia de seguridad base para PITR / espera activa / espera activa, pero es perfectamente bueno para una copia de seguridad estática y tiene un impacto mucho menor en el sistema. Sin embargo, solo puede hacer esto si sus instantáneas son atómicas y toda su base de datos, incluida WAL, está en un solo volumen.Una posibilidad que aún no he investigado es combinar los dos enfoques. Se me ocurre que uno podría ( no probado y posiblemente incorrecto e inseguro , aún no lo sé):
pg_start_backup
pg_stop_backup
pg_stop_backup
Esencialmente, la idea es reducir el tiempo que la base de datos debe retrasar sus puntos de control tomando un punto en el tiempo de cada volumen que pueda copiar a su gusto.
fuente
Esta es una excavación grave, pero tengo que corregir algo aquí.
La respuesta anterior dice:
Eso no es cierto. El sistema mantendrá el número de WAL indicado en su configuración (consulte la documentación en línea ). Básicamente, el valor más alto entre:
Imaginemos este caso:
luego, después de iniciar "pg_start_backup ()", sus archivos WAL rotarán durante su copia de seguridad. Cuando finalice su copia de seguridad, intentará restaurarla en otro motor de base de datos. El motor en el lanzamiento solicitará al menos el archivo WAL generado cuando emitió "pg_start_backup ()".
La base de datos no aceptará el arranque hasta que proporcione el archivo WAL "0000000x0000000B000000D0" (donde x es su TimelineID ). Este archivo WAL es el mínimo indispensable para que el sistema arranque. Por supuesto, con solo este archivo, perderá datos, ya que el resto de los datos se encuentran en los archivos WAL que no tiene, pero al menos, tendrá un motor de base de datos en funcionamiento.
Por lo tanto, debe archivar WAL o debe guardar los archivos WAL necesarios usted mismo, pero Postgresql no lo hará por usted.
fuente
pg_basebackup --xlog-method=stream
embargo, esto se puede evitar si no me equivoco.max_wal_senders
mínimo establecido en 2. Esta es una buena manera de evitar el problema de "falta de WAL" al final de la copia de seguridad.En cuanto a mi experiencia con PostgreSQL, es una operación relativamente segura a menos que tenga un gran impacto en el rendimiento en ese momento. Si lo tiene, es mejor pausar temporalmente la escritura de todos sus clientes.
Solo tuve un caso crítico al sincronizar mi maestro con el esclavo bajo carga y fue causado por OOM killer (sí, realmente deberías deshabilitar COMPLETAMENTE OOM Killer en los nodos de la base de datos, no lo sabía ese día).
Así que restauré la base de datos de la copia de seguridad nocturna y di a postgres todos los segmentos WAL del directorio pg_archive para su reproducción (solo los copié en la carpeta pg_xlog). Todo salió bien, pero el tiempo de inactividad era inevitable, por supuesto.
fuente