13

Antecedentes:PostgreSQL para Data-Almacén: mejor enfoque para-casi en tiempo real ETL/extracción de datos

Tengo una base de datos PostgreSQL (v8.3) que está muy optimizado para OLTP.

Necesito extraer datos de él en una base de tiempo semi-real (alguien está obligado a preguntar qué significa semi-tiempo real y la respuesta es tan frecuente como puedo pero seré pragmático, como un benchmark digamos que esperamos cada 15 minutos) y alimentarlo en un almacén de datos.

¿Cuántos datos? En las horas punta estamos hablando aproximadamente de 80-100k filas por minuto golpeando el lado OLTP, fuera de las horas punta esto disminuirá significativamente a 15-20k. Las filas actualizadas con mayor frecuencia son ~ 64 bytes cada una, pero hay varias tablas, etc. por lo que los datos son bastante diversos y pueden tener un alcance de hasta 4000 bytes por fila. El OLTP está activo 24x5.5.

¿La mejor solución?

De lo que puedo reconstruir la solución más práctica es la siguiente:

  • crear un disparador para escribir toda la actividad LMD a un archivo de rotación de registro CSV
  • realizar cualquier transformaciones son necesarias
  • Utilice la herramienta de bombeo de datos DW nativa para bombear eficientemente el CSV transformado al DW

¿Por qué este permiso? ach?

  • TRIGGERS permiten tablas selectivas para ser dirigidos en lugar de ser de todo el sistema de salida + es configurable (es decir, en un CSV) y son relativamente fáciles de escribir y desplegar. Slony utiliza enfoque similar y los gastos generales es aceptable
  • CSV fácil y rápido para transformar
  • fácil de bombear CSV en el DW

alternativas consideradas ....

  • Utilización del registro cronológico nativa (http://www.postgresql.org/docs/8.3/static/runtime-config-logging.html). El problema con esto es que se veía muy prolijo en relación con lo que necesitaba y era un poco más complicado de analizar y transformar. Sin embargo, podría ser más rápido ya que supongo que hay menos sobrecarga en comparación con un GATILLO. Ciertamente, haría el administrador más fácil ya que es todo el sistema, pero de nuevo, no necesito algunas de las tablas (algunas se usan para el almacenamiento persistente de mensajes JMS que no quiero registrar)
  • Consultar los datos directamente a través de una herramienta de ETL como Talend y bombearla al problema de DW ... es que el esquema de OLTP necesitaría modificarse para soportar esto y eso tiene muchos efectos secundarios negativos
  • Usando un SLONY SLONY ajustado/hackeado hace un buen trabajo de la tala y la migración de los cambios a un esclavo por lo que el marco conceptual está ahí, pero la solución propuesta sólo parece más fácil y más limpio
  • Utilizando el WAL

¿Alguien ha hecho esto antes? Quieres compartir tus pensamientos?

Respuesta

10

Suponiendo que las tablas de interés tienen (o pueden ser aumentadas con) una clave única, indexado, secuencial, por lo que recibirá mucho mejor valor de la simple emisión de SELECT ... FROM table ... WHERE key > :last_max_key con salida a un archivo, donde last_max_key es el último valor clave de la última extracción (0 si es la primera extracción) Este enfoque incremental desacoplado evita introduciendo latencia de activación en la ruta de datos de inserción (ya sea activadores personalizados o Slony modificado), y dependiendo de su configuración podría escalarse mejor con el número de CPUs, etc. (Sin embargo, si también tiene que rastrear UPDATE s, y la clave secuencial fue agregada por usted, entonces sus declaraciones UPDATE sh ould SET la columna de clave a NULL por lo que obtiene un nuevo valor y se selecciona en la siguiente extracción. Usted no podrá rastrear DELETE s sin un disparador). ¿Esto es lo que tenía en mente cuando mencionó Talend?

No utilizaría la función de registro a menos que no pueda implementar la solución anterior; ; lo más probable es que el registro implique bloqueando la sobrecarga para garantizar que las líneas de registro se escriban secuencialmente y no se superpongan/sobrescriban entre sí cuando múltiples backends escriben en el registro (compruebe la fuente de Postgres). La sobrecarga de bloqueo puede no ser catastrófica, pero puede prescindir si puede usar la alternativa incremental SELECT. Además, el registro de sentencias podría ahogar cualquier mensaje de ADVERTENCIA o ERROR útil, y el propio análisis no será instantáneo.

A menos que esté dispuesto a analizar los WAL (incluido el seguimiento del estado de la transacción y esté listo para reescribir el código cada vez que actualice Postgres) tampoco usaría los WAL, es decir, a menos que tenga con el hardware adicional disponible., en cuyo caso se podría Wals nave a otra máquina para la extracción de (en la segunda máquina que puede uso desencadena descaradamente - o incluso la tala declaración - ya que lo que ocurre allí no afecta INSERT/UPDATE/rendimiento en DELETE la máquina primaria.) Tenga en cuenta que en lo que respecta al rendimiento (en la máquina primaria), a menos que pueda escribir los registros en una SAN, obtendrá un rendimiento comparable. ce golpeó (en términos de cacheo del caché del sistema de archivos, en su mayoría) desde el envío de WAL a una máquina diferente como si se ejecutara el SELECT incremental.

+1

La opción Talend iba a adoptar el enfoque sugerido ... tal vez debería volver a visitarlo.Pero destacó el problema clave, haciendo un seguimiento de INSERT y UPDATE y DELETE. Entonces, no importa lo que haga, hay un trabajo por hacer para que funcione de manera limpia y eficiente ... sorprendido, este no es un problema muy común con muchos ejemplos en la web. Gracias por su respuesta bien pensada. – belvoir

+2

Un posible problema con la idea de clave primaria-umbral es que las secuencias de postgres no son transaccionales. Es decir, una transacción que se inserta con una PK inferior puede * comprometerse después de * una transacción que se insertó con una PK más alta. Por lo tanto, su estrategia de ETL podría "perder" inserciones (suponiendo un nivel de aislamiento de "lectura confirmada"). Esto rara vez sería un problema (a menos que tenga un gran volumen de inserción o transacciones largas), pero es algo a considerar si no puede tolerar la pérdida de datos durante ETL. –

1

si puede pensar en una 'tabla de suma de comprobación' que solo contiene los id y la 'suma de comprobación', no solo puede hacer una selección rápida de los nuevos registros, sino también los registros modificados y eliminados.

la suma de comprobación podría ser una función de suma de comprobación crc32 que desee.

+0

No sé por qué no se habla más sobre esta solución, esta es una solución muy común para muchas plataformas. – JHixson

0

La nueva cláusula ON CONFLICT en PostgreSQL ha cambiado la forma en que hago muchas actualizaciones. Tomo los datos nuevos (basados ​​en row_update_timestamp) en una tabla temporal y luego en una instrucción SQL INSERT en la tabla de destino con ON CONFLICT UPDATE. Si su tabla de destino está particionada, debe pasar por un par de aros (es decir, golpear directamente la tabla de particiones). El ETL puede suceder al cargar la tabla Temp (lo más probable) o en el SQL EN CONFLICTO (si es trivial). En comparación con otros sistemas "UPSERT" (actualización, insertar si no hay filas, etc.), esto muestra una gran mejora de velocidad. En nuestro entorno particular de DW no necesitamos/queremos acomodar DELETE. Eche un vistazo a los documentos ON CONFLICT: ¡le da una oportunidad a la MERGE de Oracle por su dinero!

Cuestiones relacionadas