PostgreSQL
Transcripción
PostgreSQL
PostgreSQL Agenda • Backup Continuo PITR • Streaming Replication • Nuevas Funcionalidades 9.2 y 9.3 Nicolas Domínguez Florit [email protected] Ignacio Bisso [email protected] PostgreSQL Backup Continuo Estrategia de Backup Es frecuente pensar al backup como el Proceso para obtener una copia de seguridad con el objetivo de ser restaurada ante una eventual pérdida de datos. FRECUENTES PUNTOS DEBILES VENTANA - Lo Configuramos, lo ponemos a . PERDIDA DE funcionar y nos olvidamos. - No analizamos la Ventana de Pérdida y PERIODICIDAD sus efectos sobre las aplicaciones DOWN - TIME - No se hacen pruebas de restore, ni verificamos si se genera OK el backup PRUEBAS de - No analizamos la capacidad de RESTORE restaurar distintos elementos RECURSOS (tabla/filas) (Granularidad) ESPACIO FISICO Backup Contínuo - Generalidades 1/2 • Existe en todas las bases de datos (con diferentes nombres) • Ventaja: Reduce al mínimo la Ventana de Pérdida, con un buen costo beneficio. • Consiste en resguardar toda la actividad transaccional en LOGS (en postgres WAL) • A medida que un LOG se llena el mismo motor de base de datos lo backupea Backup Contínuo - Generalidades 2/2 • Requiere un punto de inicio, es decir un Backup Total inicial • Al momento del restore, disponemos también de muchos backups pequeños (los LOGs) para restaurar en forma secuencial. • El restore es una secuencia de varios restores: – Restore del BACKUP TOTAL inicial – Múltiples restores de los LOGs (o WALs) • Disponible en Postgres e Informix (y otros) Métodos de Backup en Postgres PG_DUMP COPIA de FILE SYSTEM BACKUP CONTINUO(PITR) Granularidad Cluster/BasedeDatos/Tabla Cluster Completo Cluster Completo Ventana de Perdida Grande Grande Pequeña o Nula Down Time Puede hacerse con Usuarios Postgres debe estar off-line Puede hacerse con Usuarios Complejidad Baja Baja Media Formato del Backup Texto o Comprimido Duración depende el formato Periodicidad La frecuencia es importante Es una copia exacta de la imagen en el file system rápido La frecuencia es importante Formado por varios componentes, de diferente formato rápido La frecuencia tiene menos importacia Ejemplo de Restore sin Backup Continuo pg_ctl stop tar cf $PGDATA Modificaciones a la BD desde aplicaciones Pilagá /Diaguita /Mapuche /Guaraní 04:00 PM falla de un disco, salida de servicio de postgres 05:00 PM tar xf < mi_full_backup.tar 6:00 AM Full Backup File System Datos recuperados hasta las 06 AM (se perdieron las modificaciones realizadas en las últimas 10 horas) (*) Dependiendo de la severidad de la falla, es posible que sean necesarias tareas previas al restore. (Reinstalación de linux, postgres,) Ejemplo de Restore sin Backup Continuo 04:00 PM falla de un disco, postgres sale de servicio Postgres backupea WAL segments en forma continua Full backup file system (online) 6:00 AM 6:30AM Backup WAL AA Backup full file system 05 PM Restore full backup +WAL AA+WAL AB+WAL AC Modificaciones a la BD desde aplicaciones Pilaga /Diaguita /Mapuche / Guaraní 1:16PM Backup WAL AB 3:38PM Backup WAL AC Datos recuperados hasta las 3:38 PM (*) Dependiendo de la severidad de la falla, es posible que sean necesarias tareas previas al restore. (Reinstalación de Linux, de Postgres ) Segmentos WAL (1/3) • Cada WAL tiene 16 Mb y es un archivo • Se almacenan en $PGDATA/pg_xlog • Cada vez que se llena un WAL, se crea el próximo. Sus nombres son de la forma: – 000000010000000000000001 al 000000010000000000000009 – 00000001000000000000000A al 00000001000000000000000Z • Para backupear los WAL hay que modificar 2 parámetros archive_mode = on archive_command = 'cp %p /usr/local/carpetadebackupdewals/%f‘ – %p es el archivo con el path completo – %f es solo el nombre del file Segmentos WAL (2/3) Qué Pasa cuando operamos normalmente con las BDs? • Las transacciones se graban en los WAL segments, y los van llenando. • Cuando se llena un WAL Segment Postgres ejecuta el comando del parámetro archive_command • Este comando debería copiar el WAL recien completado a una carpeta en un lugar seguro (disco remoto) • Se borra el WAL Segment del directorio pg_xlog (en realidad se lo renombra y se reutiliza el archivo para otro WAL) Segmentos WAL (3/3) En algunos casos cuando Postgres necesita swichear al siguiente WAL file renombra uno ya existente que esta backupeado y no tiene transacciones abiertas. Esto puede generar algo de confusión porque podemos ver que el WAL 00000000AA fue modificado a las 10:22 y el WAL 00000000AB fue modificado a las 10:18 En realidad el archivo WAL 00000000AB es el mismo archivo que antes se llamaba 0000000012, el cual fue accedido por última vez a las 10:18, luego se lo renombró a 00000000AB Backup Total Inicial de Postgres 1. Desde psql ejecutar # select pg_start_backup(’Full Backup - Testing’); pg_start_backup() pg_start_backup crea un label, y lo graba en el WAL file. 0/6BA9328 Es opcional, pero se recomienda 2. Desde línea de comandos hacer un backup base. tar -cvf /usr/local/mi_backup.tar $PGDATA 3. Desde psql ejecutar # select pg_stop_backup(); 0/6BA9384 Este es el Backup Total Inicial!!! pg_stop_backup también crea un label y lo graba en el WAL file. Es opcional, pero se recomienda Backup Total Inicial de Postgres Todo Backup Inicial tiene un archivo en el pg_xlog con extensión .backup que describe ese backup Preparativos para restaurar un Backup Continuo 1) Se supone que postgres está bajo (sino bajarlo) 2) Tres Elementos Necesarios A) El backup Total Inicial (es lo principal, sin esto no hay restore posible) B) El directorio con los WAL backupeados por Postgres (muy importantes) C) El directorio pg_xlog (con los WAL aun sin backupear que estaban en pg_xlog al momento de la caída. Contienen las últimas transacciones. Dependiendo del daño en disco puede ser que se hayan perdido ) 3) Para chequear podemos ver el archivo .backup del backup Inicial que queremos restaurar, para determinar el primer WAL que necesitamos. Ese WAL debe existir en el directorio de B) 4) Renombrar el pg_xlog actual a pg_xlog_recientes 5) Revisar si en pg_xlog_recientes existen WAL segments que no están backupeados [son los de C)]. Backupearlos a mano si queremos recuperarlos. Restaurar un Backup Continuo y Todos los segmentos WAL disponibles 6) Restaurar con un tar (o el comando que corresponda) el backup base (no levantar postgres todavía) 7) Modificar el archivo recovery.conf (ver recovery.done) 8) Levantar Postgres. (cuando postgres levanta encuentra el recovery.conf, y comienza a copiar los WAL y a aplicar las transacciones en los WAL) Postgres finalmente levanta cuando haya procesado TODOS los segmentos WAL disponibles Restaurar un Backup Continuo y los WAL Segments con PITR 6) Restaurar con un tar (o el comando que corresponda) el backup base (no levantar postgres todavía) 7) Modificar el archivo recovery.conf seteando el parámetro recovery_target_time con la fecha y hora donde queremos parar de restaurar 8) Levantar Postgres. (Idem al restore anterior, solo que procesa las transacciones previas al recovery_target_time) Como zafar si no hicimos Backup PostgreSQL Streaming Replication Streaming Replication: Idea • El restore de un Backup compuesto de muchos WAL puede demorar tiempo. • Algunas organizaciones no pueden tener su base de datos fuera de línea por mucho tiempo. • Backup Continuo es una solución al problema de "Recuperación Ante Desastres" • Backup Continuo NO es una solución al problema de “Alta Disponibilidad” Streaming Replication: Qué es ? • Funcionalidad de PostgreSQL que permite tener un servidor de base de datos espejado (o stand by), que se actualiza permanentemente con los cambios que recibe el servidor primario. • Disponible a partir de la versión 9 de Postgres. • Se puede combinar con otro feature (también incluido en 9) llamado "Hot Stand By". El cual permite usar el servidor espejado para hacer lecturas. Streaming Replication: Beneficios • Alta Disponibilidad: Mediante una copia completa de la base de producción lista para ser usada en una emergencia. (En realidad tenemos un servidor completo duplicado) • Balanceo de Carga: Utilizando el servidor espejado para aplicaciones Read Only • Existen diferentes niveles de sincronismo Nodo Primario Nodo Stand By (ReadOnly) Los NO de Streaming Replication • Granularidad Unica: No se puede replicar una tabla, esquema, o database. Solo el Cluster completo. • No soporta diferentes versiones de Postgres. • No soporta diferentes plataformas de S.O. • No se puede tener Multi-master replication. Basado en WALs • Este tipo de replicación está basada en los WAL. • En el servidor primario cada modificación a los datos (o DDL) se graba en los WAL. • Los WAL son enviados y procesados en el servidor Stand By para generar una imagen idéntica al primario. Streaming Replication Niveles de Sincronismo • Log Shipping Standby (file based) – Se envía el archivo WAL completo al Stand By – El Stand By tiene una demora de “1 WAL” – Claramente es Asíncrono • Streaming Replication – Se envían los registros de la WAL luego del commit – El Stand By esta menos retrasado. – Es posible monitorear el “delay” Streaming Replication: Gráfico Streaming Replication • Configuración – Se configura como Log Shippping y se agrega el parámetro primary_conninfo en recovery.conf – Puede ser Sincrónico o Asincrónico. • Asincrónico: Es el default ( si cae el primario podría haber pequeñas pérdidas de datos. Transacciones comiteadas que aun no fueron replicadas) • Sincrónico: Sin pérdida de transacciones pero el Commit es más lento (cada commit espera recibir la confirmación de que el commit ha sido recibido y escrito al Log de transacciones en disco en el postgres primario y el standby) Cómo lo configuramos ? • Preparación previa de algunos archivos de configuración • Backup en el cluster primario y restore en el servidor espejado • Levantar postgres en el servidor espejado • Testear que todo este funcionando Configuración previa Postgres Primario Activamos el backup automático de WAL • archive_mode: Activa el archivado de WAL en primario. • archive_command: Indica el comando de copia de WAL Configuración previa Postgres Primario • max_wal_senders: Con este parámetro definimos el número máximo de conexiones que se pueden realizar desde servidores stand by al servidor primario via SR (1 por servidor stand by) • wal_keep_segments: Este parámetro define el número máximo de ficheros WAL que mantendremos sin reciclar en el servidor primario en el caso que SR se retrase en la replicación de datos. Si utilizamos además de SR, transferencia de ficheros WAL, este parámetro no es tan importante de configurar. • listen_addresses: Con este parámetro definimos la IP por la que podremos acceder via TCP/IP a postgreSQL. • wal_level: Este parámetro define cuanta información se grabará en los ficheros WAL generados. Se pueden utilizar tres valores, minimal, archive y hot_standby. En nuestro caso utilizamos el valor hot_standby, porque vamos a utilizar esta funcionalidad. Configuración previa Postgres Stand By • listen_addresses: Con este parámetro definimos la IP por la que podremos acceder via TCP/IP a postgreSQL. • hot_standby: Para definir que este servidor esclavo se podrá utilizar para realizar consultas de solo lectura. Configuración previa SRV Stand By ARCHIVO recovery.conf • standby_mode: (on) Este parámetro define que el servidor no saldrá del modo de recuperación y continuará probando la restauración continua de información WAL • primary_conninfo: Este parámetro define el servidor maestro usado por SR para leer los registros WAL del primario (streaming replication) • trigger_file: Con este parámetro se define un fichero que en caso de crearse/existir sacará al servidor standby del modo "hot standby" y de recuperación continua. • restore_command: Con este parámetro definimos el comando a utilizar, si es necesario, para restaurar los ficheros WAL que fueron backupeados desde el servidor primario. Failover Activar el Stand By como Primario • Postgres NO provee ningún mecanismo para detectar la caida del primario (hearbeat) • Decisión de hacer failover: – El DBA – Algún software externo a postgres – Cuidado con tener 2 primarios • Activación del Failover: – pg_ctl promote – trigger_file setting en recovery.conf Test PostgreSQL Nuevas Funcionalidades 9.2 y 9.3 Nuevas Funcionalidades 9.2 / 9.3 • Vistas Materializadas (materialized views) 9.3 (1) create view test1 as select 1 as a where pg_sleep(5) is not null; CREATE VIEW $ \timing Timing is on. $ select * from test1; a --1 (1 row) Time: 5008.621 ms $ select * from test1; a --1 (1 row) Time: 5001.657 ms $ select * from test1; a --1 (1 row) Time: 5001.519 ms Nuevas Funcionalidades 9.2 / 9.3 • Vistas Materializadas (materialized views) 9.3 (2) create materialized view test2 as select 1 as a where pg_sleep(5) is not null; SELECT 1 $ \timing Timing is on. $ select * from test2; a --1 (1 row) Time: 8.060 ms $ select * from test2; a --1 (1 row) $ select * from test2; a --1 (1 row) Time: 0.311 ms Time: 0.263 ms Nuevas Funcionalidades 9.2 / 9.3 • Vistas Materializadas (materialized views) 9.3 REFRESH MATERIALIZED VIEW test2; REFRESH MATERIALIZED VIEW Time: 5037.111 ms (3) Nuevas Funcionalidades 9.2 / 9.3 • Vistas actualizables 9.3 (1) CREATE VIEW cliente_v AS SELECT * FROM cliente; SELECT * FROM cliente_v; 1;"Tita" 2;"Antonia" 3;"Ramiro" INSERT INTO cliente_v VALUES (4,’Luana'); SELECT * FROM cliente_v; 1;"Tita" 2;"Antonia" 3;"Ramiro" 4;"Luana" Nuevas Funcionalidades 9.2 / 9.3 • Vistas actualizables 9.3 (2) Los peros: - Se permiten INSERT, UPDATE y DELETE para ser utilizado en la vista de la misma forma que en una taba normal. - Solo sirve para vistas simples. - Debe tener UNA entrada en su lista FROM (que debe ser una tabla u otra vista actualizable) - La definición de vista no debe contener DISTINCT, GROUP BY, HAVING, LIMIT, OFFSET. - La definición de vista no debe contener operaciones de conjuntos (UNION, INTERSECT o EXCEPT). - Todas las columnas del select deben ser simples referencias a columnas. No pueden ser expresiones literales o funciones. Nuevas Funcionalidades 9.2 / 9.3 • Checksum 9.3 (1) Sumas de verificación de páginas de datos CRC-16 algorithm for the checksum calculation. - El parametro data_checksums es de solo lectura. Solo puede setear con el parametro initdb. (no esta presente en el postgresql.conf). - Verificación del estado del parametro: postgres=# SHOW data_checksums; data_checksums on (1 row) postgres=# select * from corruption_test; WARNING: page verification failed, calculated checksum 63023 but expected 48009 ERROR: invalid page in block 0 of relation base/12896/16409 Nuevas Funcionalidades 9.2 / 9.3 • Conectores de datos Foraneos Modificables 9.3 (1) CREATE TABLE cliente (id integer, nombre text); INSERT INTO cliente VALUES (1,'Tita'),(2,'Antonia'),(3,'Ramiro'),(4,'Delfina'); CREATE EXTENSION postgres_fdw; CREATE SERVER source FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'localhost', dbname 'prueba', port '5433'); CREATE USER MAPPING FOR postgres SERVER source OPTIONS ( user 'postgres', password 'postgres'); CREATE FOREIGN TABLE cliente_externo ( id serial, nombre text ) SERVER source options ( table_name 'cliente' ); Nuevas Funcionalidades 9.2 / 9.3 • Conectores de datos Foraneos Modificables 9.3 SELECT * FROM cliente; 1;"Tita" 2;"Antonia" 3;"Ramiro" 4;"Delfina" (2) SELECT * FROM cliente_externo; 1;"Tita" 2;"Antonia" 3;"Ramiro" 4;"Delfina" INSERT INTO cliente VALUES (5,'Francisca'); SELECT * FROM cliente; 1;"Tita" 2;"Antonia" 3;"Ramiro" 4;"Delfina" 5;"Francisca" SELECT * FROM cliente_externo; 1;"Tita" 2;"Antonia" 3;"Ramiro" 4;"Delfina" 5;"Francisca" Nuevas Funcionalidades 9.2 / 9.3 • Conectores de datos Foraneos Modificables 9.3 (3) INSERT INTO cliente_externo VALUES (6,'Luana'); SELECT * FROM cliente; 1;"Tita" 2;"Antonia" 3;"Ramiro" 4;"Delfina" 5;"Francisca" 6;"Luana" SELECT * FROM cliente_externo; 1;"Tita" 2;"Antonia" 3;"Ramiro" 4;"Delfina" 5;"Francisca" 6;"Luana" Nota: El driver debe soportar la funcionalidad de modificación Nuevas Funcionalidades 9.2 / 9.3 • Pg_dump paralelo 9.3 (1) Desde 9.1 existe pg_restore –j realiza el respaldo de tablas en paralelo. A partir de 9.3 pg_dump –j xx xx: número de procesos + Reduce el tiempo de backup - Incrementa la carga en el servidor - Se puede utilizar solo con pg_restore –Fd (directory) Nuevas Funcionalidades 9.2 / 9.3 • Triggers disparados por eventos 9.3 (1) CREATE EVENT TRIGGER name ON event [ WHEN filter_variable IN (filter_value [, ... ]) [ AND ... ] ] EXECUTE PROCEDURE function_name() event: ddl_command_start,ddl_command_end and sql_drop filter_variable: Nombre de la variable que se va a utilizar en el filtro. Actualmente la unica disponible es TAG. filter_value: Valor (o lista de valores) asociada al filtro Nuevas Funcionalidades 9.2 / 9.3 • Triggers disparados por eventos 9.3 (2) CREATE OR REPLACE FUNCTION abort_any_command() RETURNS event_trigger LANGUAGE plpgsql AS $$ BEGIN RAISE EXCEPTION 'command % is disabled', tg_tag; END; $$; CREATE EVENT TRIGGER abort_ddl ON ddl_command_start EXECUTE PROCEDURE abort_any_command(); CREATE TABLE a (id integer); ERROR: command CREATE TABLE is disabled ********** Error ********** ERROR: command CREATE TABLE is disabled SQL state: P0001 Nuevas Funcionalidades 9.2 / 9.3 • Triggers disparados por eventos 9.3 (3) ALTER EVENT TRIGGER abort_ddl disable; CREATE EVENT TRIGGER abort_ddl_2 ON ddl_command_start WHEN tag IN ('DROP TABLE') EXECUTE PROCEDURE abort_any_command(); CREATE TABLE a (id integer); ok DROP TABLE a; ERROR: command DROP TABLE is disabled ********** Error ********** ERROR: command DROP TABLE is disabled SQL state: P0001 Nuevas Funcionalidades 9.2 / 9.3 • IF EXISTS 9.2 (3) ALTER TABLE zzz ADD COLUMN t1 integer; ERROR: relation "zzz" does not exist ALTER TABLE IF EXISTS t1 ADD COLUMN q integer; NOTICE: relation "zzz" does not exist, skipping object create alter drop index not supported works works table works works works sequence not supported works works view not supported works works function not supported not supported works Nuevas Funcionalidades 9.2 / 9.3 • INDEX-ONLY SCAN 9.2 (1) Cuando un índice btree contiene todas las columnas que se requieren en la consulta, postgres evita irlas a buscar al heap. • JSON 9.2 / 9.3 (1) Se agregaron nuevas funciones para parsear datos que vienen en formato JSON Nuevas Funcionalidades 9.2 / 9.3 • CASCADING STREAMING REPLICATION 9.2 (1) Agrega la posibilidad de replicación en cascada (para streaming log replication). Los servidores esclavos (Standby servers), ahora pueden encargarse de enviar la WAL a otro servidor. Se usa para reducir el numero de conexiones directas entre el master y los esclavos. Foro de Postgres http://comunidad.siu.edu.ar/foro/index.php?board=17.0 PostgreSQL ¡MUCHAS GRACIAS! ¿consultas?