Estamos ejecutando muchas máquinas virtuales Linux en un entorno de almacenamiento vmware / compartido, cada una con su propia instancia de postgreSQL (una combinación de 9.0 y 9.3). Actualmente, toda la VM se encuentra en una sola partición / volumen raíz, y hemos tenido un gran éxito (~ 8 años) usando instantáneas basadas en almacenamiento de los volúmenes VMFS subyacentes para el proceso de copia de seguridad / restauración (y la replicación en nuestro sitio de recuperación ante desastres).
Debido a la arquitectura de nuestro almacenamiento, sería ventajoso separar los archivos WAL de postgres en un volumen no en caché, en su mayoría de escritura, para darnos menos abandono de caché en el lado del almacenamiento. Con nuestro almacenamiento (Nimble Storage), podemos asignar ambos volúmenes a un solo grupo de protección / instantánea, pero no he podido obtener de nuestro proveedor que las instantáneas sucederán EXACTAMENTE al mismo tiempo en todos los volúmenes del grupo de protección - probablemente lo hará, pero siempre existe la posibilidad de que sus milisegundos se separen.
Con ese fin, realizamos algunos experimentos, todo mientras escribíamos datos en el DB lo más rápido posible usando pg_bench. Después de los experimentos, restauramos nuestros volúmenes de instantáneas y comenzamos los postgres VM +
- Instantánea de los volúmenes de datos y registros cerca de forma simultánea - resultado: DB recuperada
- Volumen de datos de instantánea primero, volumen de registro ~ 1 minuto después - resultado: DB recuperada
- Volumen de registro de instantánea primero, volumen de datos ~ 1 minuto después - resultado: DB recuperada
- Volumen del registro de instantáneas primero, volumen de datos ~ 3 minutos después, después de que un punto de control de WAL escribió nuevos datos en los archivos de datos: resultado: DB recuperada
Por lo tanto, las pruebas parecen decirnos, siempre y cuando ambas instantáneas sean consistentes a nivel de volumen, y relativamente juntas, obtendrá una copia consistente de la base de datos, en función del tiempo de la instantánea de volumen WAL / Log.
Mi pregunta: ¿es esto seguro? ¿Cuáles son los casos esquimales que nos faltan en nuestras pruebas y qué podría salir mal?
El documento de Postgres indica que esto no es seguro, pero las pruebas parecen indicar que es bastante robusto: http://www.postgresql.org/docs/9.1/static/backup-file.html
Si su base de datos se extiende a través de múltiples sistemas de archivos, es posible que no haya ninguna forma de obtener instantáneas congeladas exactamente simultáneas de todos los volúmenes. Por ejemplo, si sus archivos de datos y el registro WAL están en discos diferentes, o si los espacios de tablas están en sistemas de archivos diferentes, es posible que no sea posible utilizar la copia de seguridad de la instantánea porque las instantáneas deben ser simultáneas. Lea la documentación de su sistema de archivos con mucho cuidado antes de confiar en la técnica de instantánea consistente en tales situaciones.
NOTA: Sí, conocemos otras opciones para asegurarnos de que sean consistentes, como poner PostgreSQL en modo de copia de seguridad en caliente o usar la integración de VMware de nuestro almacenamiento para inmovilizar las propias máquinas virtuales, pero estamos buscando una solución solo de almacenamiento por velocidad, conveniencia, y cero impacto para nuestros clientes.
fuente
Respuestas:
La documentación que citó lo dice todo, pero no lo culparía si desea intentar verificar las afirmaciones del proveedor con respecto a las instantáneas tomadas al mismo tiempo. Quizás una forma de descubrir algo podría ser hacer una prueba de esfuerzo del sistema WAL más específicamente.
Por ejemplo, además de sus pruebas basadas en pgbench, intente agregar llamadas aleatorias
pg_switch_xlog()
para forzar la rotación de registros, intervalos de punto de control más cortos y más largos (acortamiento y alargamientocheckpoint_timeout
ycheckpoint_timeout
) e incluso utilizando tamaños pequeños o grandes archivos pared.A menos que haya algo que me falta, por sus instantáneas no tomadas al mismo tiempo, atribuiría sus DB recuperados quizás a un momento de suerte. En el último caso, se imagina que tomó la instantánea de registro mientras que la ubicación actual xlog era, digamos,
0/A1C0FFEE
. Luego tiene 3 minutos de carga particularmente pesada en el sistema, lo que provoca un ciclo completo a través de los archivos WAL, y su DB está ahora en el momento en0/DEADBEEF
que se toma la instantánea de datos. Cuando intente restaurar, los archivos WAL en los que se está escribiendo en el momento de la instantánea de datos se han ido y la recuperación fallará.fuente