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?
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
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. –