miércoles, 17 de febrero de 2016

replicacion en postgresql 9.1


La replicación es la copia y distribución de los datos, objetos (tablas,esquemas) de la base de datos de una base de datos a otra, para sincronizar ambas y mantener la integridad de los datos, esto nos permite tener los datos distribuido en diferentes servidores y mantener los sistemas con alto rendimiento, teniendo la disponibilidad de los datos, escalabilidad, entre otras ventajas.
 
Les voy a mostrar los pasos para realizar la configuración en servidores de bases de datos postgresql versión 9.1, también sirve para versión 9.2, 9.3 y 9.4 para la replicación de datos entre maestro-esclavo, esto nos sirve para tener alta disponibilidad por si el servidor maestro se llegará a perder el servicio o para tener un respaldo de los datos en el servidor esclavo.

Manos a la obra, se debe ubicar los archivos de configuración siguiente en los servidores o instancias de postgresql dependiendo de su instalación:


Configurar el servidor Maestro

Ubicar el archivo de configuración de postgresql, este archivo es muy importante porque aquí se encuentra todo lo referente a customizar o personalizar, entonar el gestor de bases de datos.

En postgresql.conf, es necesario
ubicar y establecer lo siguientes parámetros:

listen_address = '*'
wal_level = hot_standby
max_wal_senders = 3
 

Hay una advertencia de funcionamiento de un sistema de reserva en caliente: si se bloquea el modo de espera, el maestro seguirá esperando una respuesta en cada transacción. Esta es una mala cosa. Usted debe controlar adecuadamente este para que sepa cuando sucede!

Ahora, en pg_hba.conf, es necesario añadir lo siguiente:
 

host replication all 222.222.222.222/32 trust

donde 222.222.222.222/32 es la dirección ip del servidor esclavo

Esto da a sus permisos de servidor de espera para conectar con el maestro.

Configurar el servidor Esclavo


Ahora, en la máquina
esclava, editar postgresql.conf para que incluya:

hot_standby =
on

A continuación, agregue un archivo recovery.conf. 

Esto usualmente según la instalación van en el directorio de datos PostgreSQL, que por defecto en Ubuntu /var/lib/postgresql/9.1/main. Este archivo debe contener:

Standby_mode = "on"
primary_conninfo = 'host = 111.111.111.111 application_name = DB1'
 

Ahora vamos a la Transferencia de datos sólo para asegurarse de que los procesos apropiados están en funcionamiento, compruebe que hay un proceso emisor que se ejecutará en el proceso de un receptor que se ejecutará en el modo de espera y principal. Puede comprobar para aquellos con el comando en la consola de linux 
 ps -ef | grep sender 
y  
ps -ef | grep receiver

respectivamente.

En este punto, tenemos que asegurarse de que el modo de esclavo contiene una copia exacta de los datos del maestro.  
Se debe parar el servicio de PostgreSQL en el maestro y en el esclavo (por ejemplo, con un comando como invoke-rc.d stop PostgreSQL o /etc/init.d/postgresql stop). 
A continuación, copie los archivos de datos desde el maestro al esclavo. Debe excluirse cualquier archivo de configuración si usted ha puesto alguno allí (no lo hemos hecho en este tutorial), así como el directorio pg_xlog .:

rsync -av --exclude pg_xlog  /var/lib/postgresql/9.1/main  222.222.222.222:/var/lib/postgresql/9.1/main


colocamos el password de el usuario root y comienza la sincronizacion de los datos del maestro y esclavo, esto solo se hace la primera vez y se debe tener instalado el comando rsync en ambos servidores.

A continuación, inicie el modo
esclavo y el maestro (invoke-rc.d start de PostgreSQL en ambos sistemas).
Verificar

Ahora es el momento de probar esta configuración. Iniciar sesión en el maestro (ssh root@111.111.111.111) y crear una base de datos de ejemplo:

$ su postgres
$ Createdb sampledb

Ahora, acceder a la línea de comandos PostgreSQL:

$ Psql -d sampledb

Crear una tabla simple y rellenarla con algunos datos:

CREAR
table muestras (
    I
d entero CLAVE PRIMARIA,
    varchar nombre (25),
    text cosas
);

Insertar
into muestras (1, 'footer', 'un montón de foo');
Insertar
into muestras (2, 'valores', 'un montón de valor');
Insertar
into muestras (3, 'bazzzz', 'un montón de baz');
Insertar
into muestras (4, 'bine', 'un montón de bin');

Ahora, en otra línea de comandos, acceda a su modo de espera (
ssh root@222.222.222.222), en la línea de psql:

$ su postgres
$ Psql -d sampledb

Mira una lista de las tablas:

sampledb = # \ d
          Lista de las relaciones
 esquema | Nombre | Tipo | Propietario
-------- + --------- + ------- + ----------
 pública | muestras | mesa | postgres
(1 fila)

A continuación, consultar la tabla de muestras:

sampledb = # select * a partir de muestras;
 Identificación | nombre | cosas
---- + ------ + -------------
  1 | foo
ter | un montón de foo
  2 | valor
es | un montón de barra
  3 | baz
zz | un montón de Baz
  4 | bin
e | un montón de bin
(4 filas)

Ahora, trata de insertar algunos datos más:

sampledb = # insertar en los valores de muestreo (5, 'asdf', 'más asdf');
ERROR: No se puede ejecutar INSERT en una transacción de sólo lectura

¡Lo sentimos! El servidor
esclavo le da acceso de sólo lectura a los datos.
Comprobación del estado de WAL

En el maestro, puede ejecutar el siguiente comando para ver la situación actual de escritura WAL:

SELECT pg_current_xlog_location ();

Luego, en el modo de espera, puede ejecutar:

SELECT pg_last_xlog_receive_location ();
Si se obtienen los mismos valores, la replicación esta al día de lo contrario hubo un fallo. No hemos de configurar la replicación sincrónica, sin embargo, por lo que en un entorno de producción (con una gran cantidad de datos Cómo escribir en la base de datos) es posible que la espera sería inferior al maestro. Si necesita ambos sistemas para estar siempre caracteres idénticos, se puede dar la vuelta en la replicación síncrona.
La replicación síncrona permitiendo replicación síncrono sólo toma un par de pasos adicionales. Tenga en cuenta, sin embargo, que esto sólo debe hacerse cuando hay poca latencia entre el maestro y el esclavo! Eso es debido a que cada consulta en el servidor esperará a una respuesta desde el esclavo, que tiene que ir a través de la red. Configurar la replicación síncrona si tanto el maestro y el esclavo están conectados en una red local (preferiblemente privada).

Ok, para
realizar esto, añada lo siguiente a postgresql.conf en el Maestro:

synchronous_standby_names = 'db1'

Cuando el valor que aquí hay una lista separada por comas de sus servidores de
esclavos. Puede tener más de una, pero se utilizará sólo el primero. Si por alguna razón el primero de ellos muere, el segundo se convertirá en el esclavo.Reinciar el servico de PostgreSQL, entonces echa un vistazo el estado de la sincronización de datos (aún en el maestro):

$ Su PosgreSQL
$ psql

Entonces corre:

usename SELECT, application_name, client_addr, client_hostname, sync_state DE pg_stat_replication;

Debería ver algo como esto:

usename | application_name | client_addr | client_hostname | sync_state
---------- + ------------------ + ----------------- + - --------------- + ------------
 postgres | DB1 | 222.222.222.222 | | sincronizar

Ahora, sólo por diversión, volver atrás y añadir un montón de datos en su maestro, entonces se le pregunta sobre su máquina
esclava. Debería ver los mismos resultados en ambas máquinas!


No hay comentarios.:

Publicar un comentario