Como instalar PyReplica (wiki format):

== Instalacin Maestra ==

Instalar este sistema de replicacin en la base maestra es tan simple como ejecutar el script master-install.sql incluido.

Se recomienda:
 1. Cerrar todos los clientes
 2. Realizar un respaldo (para recrear la base esclava y prevenir prdidas de informacin en el proceso)
 3. Ejecutar el script de instalacin del disparador
 4. Realizar pruebas simples para probar el disparador y permisos (algunas consultas INSERT, UPDATE, DELETE)
 5. Reiniciar todos los clientes (en este punto, la replicacin estar funcionando!)


La funcin py_log_create_tg('nombre tabla') automagicamente detectar la clave primaria y crear el disparador de registro. Para cada tabla procesada, mostrar si el disparador fue instalado satisfactoriamente:
{{{
test=# SELECT py_log_create_tg(relname::text) FROM pg_class WHERE relname !~ '^(pg_|sql_)' AND relkind = 'r' AND relname != 'replica_log' ;
                    py_log_create_tg
--------------------------------------------------------
 table t has no pk constraint (couldn't be replicated)!
 created trigger on tt (id1,id2)
 created trigger on student (id)
(3 rows)
}}}

 * La Tabla t no puede ser replicada porque no tiene clave primaria, por lo que el disparador no fue instalado.
 * El disparador fue correctamente instalado en la tabla tt y student


Para instalar el disparador manualmente en una tabla, se puede ejecutar py_log_create_tg('tablename') o usar directamente la instruccin CREATE TRIGGER (ver el archivo sql).

IMPORTANTE: Leer master-install.sql antes de ejecutarlo, puede que deba descomentar algunas lineas para crear el lenguaje plpythonu o conceder privilegios.

=== Instalacin Maestra en Debian ===
 * Asegurarse que el paquete plpythonu este instalado
 * Abrir la base de datos y ejecutar master-install.sql

Ejemplo de linea de comando:
{{{
apt-get install postgresql-plpython-8.1
psql somedb -U someuser < master-install.sql
}}}

=== Instalacin Maestra en Windows ===
 * Verificar la opcin PlPython en el instalador de PostgreSQL de  Windows (python24.dll and plpython.dll deben existir en C:\Archivos de programa\PostgreSQL\8.1\lib\ or equivalent)
 * Double-click en master-install.sql y completar el servidor, base de datos y nombre de usario, o abrir PgAdmin III y copiar y pegar manualmente en una ventana de consulta.


== Instalacin Esclava ==

Aunque el script python podra ejecutarse en windows, actualmente solo se soporta linux (debian) para el demonio de replicacin esclavo.
Note: psycopg en windows no viene con el soporte para select por defecto, y despus de haberlo compilado, parece no funcionar correctamente (la conexin es cerrada inesperadamente cuando se usan transacciones y listen)
Hay un servicio muy bsico que puede ser usado en windows (service.py), pero como no se soporta signal/select, usa polling.


=== Instalacin Esclava en Debian ===
 * Restaurar el resguardo de la base de datos maestra
 * Instalar los paquetes requeridos (python2.4 y psycopg2)
 * Bajar los archivos de script a una ubicacin bien definida (ej. /usr/local/pyreplica):
 * Copiar y modificar la configuracin por cada base de datos esclava (ej. /etc/pyreplica/somedb.conf)
 * Hacer un enlace al script init.d
 * Agregar el usuario pyreplica (chequear uid/gid en su sistema y actualizar daemon.py)
 * Instalar el script init.d con update-rc.d (asi se inicia cuando la maquina se prende)
 * Iniciar pyreplica

Ejemplo de linea de comando:
{{{
apt-get install python2.4 python-psycopg2
svn co http://www.nsis.com.ar/svn/pyreplica /usr/local/pyreplica
cp /usr/local/pyreplica/sample.conf /etc/pyreplica/somedb.conf
vi /etc/pyreplica/somedb.conf
ln /usr/local/pyreplica/pyreplica.sh /etc/init.d/pyreplica -sf
useradd pyreplica -g 103 -u 103
update-rc.d pyreplica defaults
/etc/init.d/pyreplica start
}}}

En el archivo de registro (usualmente /var/log/pyreplica.log), se ver que esta sucediendo:
{{{
somedb Sun Jun  1 14:52:32 2008 Opening origin (master) connection
somedb Sun Jun  1 14:52:34 2008 Opening replica (slave) connection
somedb Sun Jun  1 14:52:34 2008 Encoding for this connections are UTF8 UTF8
somedb Sun  Jun  1 14:52:34 2008 Executing: UPDATE "test" SET "a"='123' WHERE "id2"='1' AND "id2"='2'
somedb Sun Jun  1 18:50:34 2008 Waiting for 'NOTIFY'
somedb Sun Jun  1 18:51:34 2008 Timeout(''keepalive'')!
somedb Sun Jun  1 18:51:34 2008 Waiting for 'NOTIFY'
somedb Sun Jun  1 18:52:34 2008 Timeout(''keepalive'')!
}}}

Si falla, se puede ejecutar pyreplica.py directamente para ver la salida directamente en la consola:
{{{
python pyreplica.py "dbname=master user=postgres host=remotehost" "dbname=slave user=postgres host=localhost"
}}}
(cambiar dbname, user, password y host)!

== Configuracin Multi-maestro ==

 * Se debe instalar el disparador y el demonio para las dos bases de datos.
 * En ambos archivos de configuracin, setear el parmetro SKIP_USER al nombre del usuario postgresql que se conecta y procesa los registros de replicacin (para prevenir re-ejecutar los registros propios replicados)
 * Debe tener cuidado con el manejo de secuencias (no se replican). Consejo: en cada base de datos, usar intervalos diferentes que no se solapen.
 * Debe evitar los conflictos o realizar un esquema de resolucin de conflictos propio

== Configuracin Multi-esclavo ==

Para configurar multiples esclavos, agregar un campo booleano por cada esclavo en la tabla replica_log, y configurar SLAVE_FIELD con el nombre de dicho campo.
Esta configuracin actualmente no esta probada (observar los mecanismos de seales y bloqueos).

== Configuracin de Filtros ==

Pyreplica ahora puede replicar solo los eventos (INSERT, UPDATE, DELETE) que ud. elige.
Puede filtrar los datos a ser replicados usando condiciones (expresiones python), evaluando los valores de los registros en new y old (diccionarios), etc.

 * Por ahora, ejecutar master-install-filter.sql
 * Agregar las condiciones de filtro:
{{{
INSERT INTO py_log_filter (relname, event, condition) VALUES ('mytable','INSERT','new["field1"].startswith("Something") or new["field2"]==123');
}}}
