PostgreSQL: ¿Puedo hacer pg_start_backup () en vivo, ejecutando db bajo carga?

19

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

  1. pg_start_backup(),
  2. rsync ${PGDATA}/ maestro a esclavo,
  3. 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?

Daniel
fuente
¿Has revisado los documentos ? Dice "Por defecto, pg_start_backup puede tardar mucho tiempo en finalizar. Esto se debe a que realiza un punto de control, y la E / S requerida para el punto de control se extenderá durante un período de tiempo significativo, por defecto la mitad de su punto de control intervalo (consulte el parámetro de configuración checkpoint_completion_target). Esto suele ser lo que desea, ya que minimiza el impacto en el procesamiento de consultas ". Sin embargo, lo que esto significa en la práctica (y en su caso) no está del todo claro.
dezso

Respuestas:

11

pg_start_backuprealizará 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 control pg_start_backuptendrá un impacto menor de lo normal.

Donde debe preocuparse es el rsync o pg_basebackuppaso 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 nicey ionicepara 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 ejecute pg_stop_backupsu 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_backupy pg_stop_backuppara 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 CHECKPOINTluego 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
  • Dispare instantáneas de todos los espacios de tabla, el directorio de datos principal y el volumen xlog
  • pg_stop_backup
  • Copie WAL hasta el archivo final de pg_stop_backup
  • Copie los datos de los volúmenes capturados

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.

Craig Ringer
fuente
Después de comprender que pg_start_backup () es principalmente "una cosa de control controlado", nos ganamos la confianza para simplemente intentarlo y ver. Parece que el impacto en la aplicación en ejecución fue insignificante. (master datadir principal en SSD) :-) La idea "no probada y posiblemente insegura" que propuso está un poco por encima de nuestro nivel de competencia y ansia de aventura.
Daniel
Ah, y no ionizamos el rsync en el primer intento. Porque en realidad queríamos ver la carga adicional en el maestro. Como nunca necesitamos una segunda ejecución rsync, todo está bien. Aprendimos algo de eso.
Daniel
7

Esta es una excavación grave, pero tengo que corregir algo aquí.

La respuesta anterior dice:

Puede usar nice e ionice para ayudar a limitar el impacto de E / S (pero no el impacto de caché); Sin embargo, hay un costo para eso. La copia de seguridad tomará más tiempo, y hasta que complete la copia de seguridad y ejecute pg_stop_backup, su sistema está, según tengo entendido, 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 y índice de hinchazón porque no puede limpiar 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.

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:

  • (2 + checkpoint_completion_ratio) * checkpoint_segments + 1
  • wal_keep_segments

Imaginemos este caso:

  • su copia de seguridad lleva mucho tiempo, ya que hay cientos de conciertos para copiar
  • tiene una pequeña retención de WAL (checkpoint_segments a 3, por ejemplo)
  • no has configurado el archivo WAL

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 ()".

pg_start_backup 
-----------------
B/D0020F18
(1 row)

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.

Sterfield
fuente
3
Muy buena observación. Sin pg_basebackup --xlog-method=streamembargo, esto se puede evitar si no me equivoco.
tomorrow__
2
Sí, desde PG 9.2, puede transmitir el WAL con la copia de seguridad base. Se abrirá una segunda secuencia, por lo que debe tener un max_wal_sendersmínimo establecido en 2. Esta es una buena manera de evitar el problema de "falta de WAL" al final de la copia de seguridad.
sterfield
4

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.

Riki_tiki_tavi
fuente