Re: Replicacion?

From: cbeltran <cbeltran(at)roldan(dot)net>
To: Pablo Marrero <pablo(dot)marrero(at)bancaqm(dot)com(dot)uy>, AyudaPostgres <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Replicacion?
Date: 2004-09-01 13:33:27
Message-ID: 004c01c49028$439757e0$272615ac@tania
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Pablo

Nos agrada encontrar a alguien que tenga una necesidad similar a la nuestra.
Despues de haber hecho pruebas con Rserv y Erserv concluimos, al igual que
usted, que este tipo de herramientas esta hecho para replicar un master
versus multiples esclavos.

Actualmente, tenemos una base de datos de diseño identico en cada uno de los
10 servers en diferentes ciudades de Colombia que deben replicar a un server
Central y la solución en prueba consiste en:

1- Definir las tablas que deben replicar (no son todas).
2- Definir una tabla de control que almacena apuntadores a cada una de las
lineas que hayan sido insertadas o actualizadas o borradas en las tablas a
replicar.

CREATE SEQUENCE tablas_replica_id_seq start XX0000001 increment 1 maxvalue
999999999 minvalue 1 cache 1 ;
CREATE TABLE tablas_replica (
tablas_replica_id integer DEFAULT
nextval('tablas_replica_id_seq'::text) NOT NULL,
tabla_nombre_replica char(90) NOT NULL,
Constraint PK_tablas_replica Primary Key (tablas_replica_id)
);

CREATE SEQUENCE control_replica_id_seq start XX0000000000000001 increment 1
maxvalue 999999999999999999 minvalue 1 cache 1 ;
CREATE TABLE control_replica (
control_replica_id bigint DEFAULT
nextval('control_replica_id_seq'::text) NOT NULL,
tablas_replica_id integer NOT NULL,
linea_tabla_replica_id bigint NOT NULL,
operacion char(1), -- (Update, Insert, Delete)
Constraint PK_control_replica Primary Key (control_replica_id),
CONSTRAINT FK_tablas_replica_id1 FOREIGN KEY (tablas_replica_id)
REFERENCES tablas_replica(tablas_replica_id) ON DELETE CASCADE ON UPDATE
CASCADE
);

Nota: los IDs con prefijo XX corresponden a las tablas de cada una de las
oficinas de las diferentes ciudades ejemplo XX = 02 Barranquilla, 03
Buenaventura, .., 18 Bogota-El Dorado. Este diseño permite que la base union
de las bases operativas identifique la base de la oficina donde se insertó
una linea de la tabla replicada y que no se choquen los primaries keys en la
base de datos del servidor central.

En tablas_replica se deben agregar el nombre de las tablas a replicar de las
bases de datos de las oficinas operativas (masters).

3- Definir tres triggers con sus respectivas tres funciones en PL/pgsql para
cada una de las tablas definidas en tablas_replica en cada una de las bases
de datos de las oficinas operativas (a replicar). Por ejemplo para una tabla
llamada terceros (en replica en la oficina 18) se debe definir:

CREATE FUNCTION "rpi_terceros"() RETURNS TRIGGER AS '
BEGIN
INSERT INTO control_replica (tablas_replica_id, linea_tabla_replica_id,
operacion) VALUES (180000001, NEW.terceros_id, ''I'');
RETURN NEW;
END;
' LANGUAGE 'plpgsql';
CREATE TRIGGER tgi_terceros AFTER INSERT ON terceros FOR EACH ROW EXECUTE
PROCEDURE rpi_terceros();

CREATE FUNCTION "rpu_terceros"() RETURNS TRIGGER AS '
BEGIN
INSERT INTO control_replica (tablas_replica_id, linea_tabla_replica_id,
operacion) VALUES (180000001, NEW.terceros_id, ''U'');
RETURN NEW;
END;
' LANGUAGE 'plpgsql';
CREATE TRIGGER tgu_terceros AFTER UPDATE ON terceros FOR EACH ROW EXECUTE
PROCEDURE rpu_terceros();

CREATE FUNCTION "rpd_terceros"() RETURNS TRIGGER AS '
BEGIN
INSERT INTO control_replica (tablas_replica_id, linea_tabla_replica_id,
operacion) VALUES (180000001, OLD.terceros_id, ''D'');
RETURN OLD;
END;
' LANGUAGE 'plpgsql';
CREATE TRIGGER tgd_terceros AFTER DELETE ON terceros FOR EACH ROW EXECUTE
PROCEDURE rpd_terceros();

Nota: Es decir la tablas de control_replica tiene el movimiento de
Inserciones, actualizaciones y borrados de las tablas de la operación en
replica. Por supuesto los scripts de operacion deben tener transaction
tracking para los tres tipos de operaciones antes mencionados.

4- Dado que en los 3 puntos anteriores se definió la estructura de control
en la base de datos de cada oficina operativa, se debe definir un script (en
nuestro caso está en PHP con DB de PEAR) en el server Central, que recorra
los diferentes servidores via IP y previa conexión a la base local, conecte
a cada una de las oficinas obteniendo la primera linea de la tabla
control_replica para luego direccionar el contenido de la linea de la tabla
en replica (para I y U) o simplemente el ID (para D) y luego efectuar dicha
operacion en la respectiva tabla de la base Central. Una vez efectuada la
operacion en la base central se debe borrar la linea respectiva de
control_replica. Es recomendable generar transaction tracking tanto en la
operacion en base central, asi como en la operacion de borrado de
control_replica en la base de la ciudad operativa. Este anidado debe hacerse
para todas las lineas de la tabla control_replica. Este script debe ser
activado via crond con la frecuencia deseada, implicando esto la demora
entre la union de todas las bases operativas y la operacion real en cada una
de las oficinas operativas.

Espero que le sirvan estos comentarios de un desarrollo real que ha hecho
muchos intentos y esta parece la solución mejor hasta el momento.

----- Original Message -----
From: "Pablo Marrero" <pablo(dot)marrero(at)bancaqm(dot)com(dot)uy>
To: "AyudaPostgres" <pgsql-es-ayuda(at)postgresql(dot)org>
Sent: Tuesday, August 31, 2004 2:41 PM
Subject: [pgsql-es-ayuda] Replicacion?

Hola, los molesto a ver si me pueden ayudar.....
Tengo dos bases de datos, operativas las dos, pero con datos distintos,
es decir, son dos agencias de la misma empresa. Ahora, necesito tener
además de esas dos una con los datos de las dos juntas para hacer
consultas........

estuve provando con slony-1 pero por lo que vi es para replicar una base
en 1 o mas "esclavas"....

tienen alguna idea de como lo puedo solucionar......??

muchas gracias de antemano....

saludos pablo

---------------------------(end of broadcast)---------------------------
TIP 4: No hagas 'kill -9' a postmaster

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Patricio Muñoz 2004-09-01 14:01:17 Re: Postgres responde lento a tomcat
Previous Message Edwin Quijada 2004-09-01 13:31:10 Re: Postgres responde lento a tomcat