-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathINSTALAR.txt
117 lines (90 loc) · 6.07 KB
/
INSTALAR.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
Como instalar PyReplica (wiki format):
== Instalación Maestra ==
Instalar este sistema de replicación 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 pérdidas de información en el proceso)
3. Ejecutar el script de instalación 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 replicación estará funcionando!)
La función 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 instrucción 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.
=== Instalación 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
}}}
=== Instalación Maestra en Windows ===
* Verificar la opción 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.
== Instalación Esclava ==
Aunque el script python podría ejecutarse en windows, actualmente solo se soporta linux (debian) para el demonio de replicación esclavo.
Note: psycopg en windows no viene con el soporte para select por defecto, y después de haberlo compilado, parece no funcionar correctamente (la conexión es cerrada inesperadamente cuando se usan transacciones y listen)
Hay un servicio muy básico que puede ser usado en windows (service.py), pero como no se soporta signal/select, usa polling.
=== Instalación 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 ubicación bien definida (ej. /usr/local/pyreplica):
* Copiar y modificar la configuración 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)!
== Configuración Multi-maestro ==
* Se debe instalar el disparador y el demonio para las dos bases de datos.
* En ambos archivos de configuración, setear el parámetro SKIP_USER al nombre del usuario postgresql que se conecta y procesa los registros de replicación (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 resolución de conflictos propio
== Configuración 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 configuración actualmente no esta probada (observar los mecanismos de señales y bloqueos).
== Configuración 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');
}}}