replicacion

From: Fernando Reyes <mundognu(at)gmail(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: replicacion
Date: 2013-02-12 19:52:44
Message-ID: CANJO55cED+P09XWyh2ebDvxa8utxo6NP4BOEpevjsr8_R0dZHg@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Buenas tardes a todos y gracias de antemano.
Al grano... hace un tiempo estoy tratando de implementar replicación
multimaestro en postgresql usando una porción de pyreplica y un
demonio propio.
El procedimiento inicia con el registro en una cola (tabla) de las
transacciones en forma de sentencia sql a nivel de fila (trigger for
each row) de las tablas a replicar. Luego un demonio (asíncrono,
autónomo e independiente) ejecuta en forma secuencial y transaccional
estas sentencias en cada nodo, hasta aqui nada nuevo.
Para mantener la integridad debo tomar de la cola lo que esté
"commiteado" o esperar aquello que esté pendiente sobre ella
consultando pg_locks, sin embargo existe un lapso de tiempo entre la
visibilidad de los bloqueos en pg_locks y su visibilidad efectiva en
la cola (visible con select * from...) lo que provoca una
desincronización en el orden de estas transacciones.
La consulta que uso para obtener las transacciones pendientes sobre la
cola es la siguiente:

select b.transactionid::text::bigint
from pg_locks a
join pg_locks b
on b.pid = a.pid
where b.locktype = 'transactionid'
and a."mode" = 'RowExclusiveLock'
and b.transactionid::text::bigint < $1
and a.relation = 'tabla_con_registros_a_replicar'::regclass::oid

Donde $1 es el id de la primera transacción a replicar obtenida
mediante un "select" en la cola, con lo que debería obtener las
transacciones pendientes sobre la cola anteriores a él, pero no
siempre es así.
Actualmente el efecto de esto es que el demonio principal se encuentra
en la cola con una transacción "vieja" no replicada por lo que se
detiene, hasta que efectúo la replicación de ella en forma manual,
evento que sucede una vez a la semana como media. Ello con una tasa de
replicación que asciende a 25 registros por segundo como media para
cada nodo.
Intenté quitarle la restricción para "locktype" y para "mode" (para
que considere incluso los "select") pero tampoco funcionó.
Entonces, sabe alguien si existe alguna vista o función o cualquier
mecanismo para obtener un conjunto de datos de una tabla garantizando
que si no se detecta ninguna transacción pendiente sobre esa tabla
entonces ese conjunto de datos está realmente actualizado ?
Porque pyreplica ? hace unos 5 años invertí mucho tiempo buscando y
evaluando soluciones para replicación multimaestro pero al año terminé
usando pyreplica y creando mi propio demonio, todo ello por la
simplicidad y flexibilidad al implementarlo en una base de datos cuyo
diseño casi no puedo "retocar".
Porque multimaestro ? tengo 12 almacenes distribuidos en largas
distancias que requieren compartir información lo antes posible (...)
pero en caso de "caída" de nodos o de enlaces, cada uno debe seguir
operando en forma autónoma y sincronizar automáticamente al momento de
estar disposible nuevamente.
En este momento tengo en producción la versión 8.3.6 de postgresql y
por la gran masa de datos y procedimientos almacenados veo difícil la
migración a corto plazo, pero si la solución pasa por migrar entonces
tendré que hacerlo.

Gracias

Fernando Reyes

-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda(at)postgresql(dot)org)
Para cambiar tu suscripción:
http://www.postgresql.org/mailpref/pgsql-es-ayuda

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Gilberto Castillo 2013-02-12 20:12:27 Re: replicacion
Previous Message René Romero Benavides 2013-02-12 19:37:56 Re: Re: [pgsql-es-ayuda] Re: Uso de resultado de función en la misma proyección o en el filtro