PostgreSQL Cluster con pgpool-II
EQUIPO DE TRABAJO |
|
Henry Ernesto Renderos Zaldaña | David Alberto García Cardona |
rz07002@ues.edu.sv | gc07011@ues.edu.sv |
PostgreSQL Cluster con PGPOOL-II
Henry Renderos, David García
Objetivos:
- Aprender los conceptos básicos sobre el manejo de un clúster utilizando PostgreSQL 9.1 y PGPOOL-II en Linux.
- Comprender el funcionamiento de un clúster.
- Establecer los parámetros de inicialización para el clúster.
- Realizar un escenario demostrativo sobre el uso de un clúster empleando replicación de bases de datos y sentencias SQL.
- Visualizar el comportamiento de la replicación en la red.
Conceptos:
¿Qué es un clúster?
Un clúster es simplemente una colección de componentes que se unen y trabajan como un solo componente para proveer alta disponibilidad. Cuando hablamos de clúster de bases de datos, nos referimos a una arquitectura en la que tenemos varios equipos con parte de los datos del usuario trabajando al unísono como un solo sistema. La arquitectura de un clúster de base de datos viene definida por la manera en que se almacenan los datos en cada nodo.¿Qué es PostgreSQL?
PostgreSQL es un sistema de gestión de bases de datos objeto-relacional, distribuido bajo licencia BSD y con su código fuente disponible libremente. Es el sistema de gestión de bases de datos de código abierto más potente del mercado y en sus últimas versiones no tiene nada que envidiarle a otras bases de datos comerciales. PostgreSQL utiliza un modelo cliente/servidor y usa multiprocesos en vez de multihilos para garantizar la estabilidad del sistema. Un fallo en uno de los procesos no afectará el resto y el sistema continuará funcionando.¿Qué es PGPOOL-II?
pgpool-II es un middleware que se encuentra entre los servidores de PostgreSQL y un cliente de base de datos PostgreSQL. Ofrece las siguientes características: Agrupación de conexiones pgpool-II mantiene las conexiones establecidas a los servidores PostgreSQL, y los reutiliza cada vez que una nueva conexión con las mismas propiedades (es decir, nombre de usuario, bases de datos, la versión del protocolo) entra en juego reduce la sobrecarga de la conexión, y mejora el rendimiento global del sistema.Replicación
pgpool-II puede gestionar múltiples servidores PostgreSQL. La activación de la función de replicación hace que sea posible la creación de una copia de seguridad en tiempo real en 2 o más grupos PostgreSQL, de manera que el servicio pueda continuar sin interrupción si uno de esos grupos falla.Balanceo de carga
Si se replica una base de datos (ya que se ejecuta en el modo replicación o modo maestro / esclavo), la realización de una consulta SELECT en cualquier servidor devolverá el mismo resultado. pgpool-II se aprovecha de la función de replicación con el fin de reducir la carga en cada servidor PostgreSQL. Lo hace mediante la distribución de las consultas SELECT entre los servidores disponibles, mejorando el rendimiento global del sistema. En un escenario ideal, el rendimiento de lectura podría mejorar proporcionalmente al número de servidores PostgreSQL. El equilibrio de carga funciona mejor en un escenario donde hay una gran cantidad de usuarios que ejecutan muchas consultas de sólo lectura al mismo tiempo. Limitar el exceso de conexiones Hay un límite en el número máximo de conexiones simultáneas con PostgreSQL, y nuevas conexiones son rechazados cuando se alcanza este número. Al aumentar este número máximo de conexiones, sin embargo, aumenta el consumo de recursos y tiene un impacto negativo en el rendimiento general del sistema. pgpool-II también tiene un límite en el número máximo de conexiones, pero las conexiones adicionales se pondrán en cola en lugar de devolver un error de inmediato.Consultas en paralelo
Con la función de consultas en paralelo, los datos se pueden dividir entre varios servidores, por lo que una consulta se puede ejecutar en todos los servidores al mismo tiempo, reduciendo el tiempo de ejecución total. La consulta paralela es la que funciona mejor en la búsqueda de datos a gran escala. pgpool-II habla backend de PostgreSQL y el protocolo de interfaz, y transmite mensajes entre un backend y un frontend. Por lo tanto, una aplicación de base de datos (frontend) piensa que pgpool-II es el servidor PostgreSQL actual, y el servidor (backend) ve a pgpool-II como uno de sus clientes. Debido a que pgpool-II es transparente para el servidor y el cliente, una aplicación de base de datos existente se puede utilizar con pgpool-II casi sin un cambio en su código fuente.Desarrollo:
INSTALACIÓN
- Utilidades para la gestión y el mantenimiento del clúster.
- Configuraremos dos archivos del sistema de Debian, esto nos facilitará hacer referencias a nombres de host y no a direcciones IP.
- Comenzaremos a configurar PostgreSQL en ambos nodos pero pgpool-II solo en el nodo pgsql1. Los comandos deberán ejecutarse como root (#) o como el usuario postgres ($).
- Instalaremos las cabeceras de la librería de PostgreSQL, el paquete de desarrollo de PostgreSQL y las utilidades de compilación de GNU)
- Una vez instalado, instalaremos PostgreSQL en ambos nodos del clúster:
- Finalmente instalamos pgpool-II en el nodo identificado como pgsql1
# apt-get install ntp openssl file psmisc sysstat bzip2 unzip nmap dstat rsync wget ccze tcpdump pciutils dnsutils host
# nano /etc/hostname
Acá le colocaremos el nombre de pgsql1 en el nodo 1 y pgsql2 en el nodo 2.
# nano /etc/hosts
Acá agregaremos los nombres de host pertenecientes al clúster con sus respectivas direcciones IP.
En este momento tenemos configurados los nodos del clúster de la siguiente forma, luego de esto debemos reiniciar los nodos: Nodo 1 Hostname: pgsql1 Dirección IP: 192.168.1.7 Nodo 2 Hostname: pgsql2 Dirección IP: 192.168.1.4 Máscara de red de 24 bits. Dirección IP del enrutador: 192.168.1.1
# apt-get install libpq-dev postgresql-server-dev-9.1 bison build-essential
# apt-get install postgresql-9.1 postgresql-contrib-9.1 postgresl-doc-9.1 uuid libdbd-pg-perl
# apt-get install pgpool2 libpgpool0
- Comenzaremos, como usuario postgres, añadiendo el usuario de base de datos (role) pgpool2, sin contraseña:
- Editamos ahora el fichero /etc/postgresql/9.1/main/pg_hba.conf y añadimos el acceso para todos los usuarios desde cualquier dirección IP. (NOTA: esto se hace por motivos de enseñanza, el acceso sólo debe permitirse para el usuario pgpool2 desde la dirección IP en donde está instalado.)
- Por último indicaremos a PostgreSQL que escuche en todas las interfaces pues, por defecto, sólo lo hace en el localhost. Editamos el fichero /etc/postgresql/9.1/main/postgresql.conf y cambiamos la siguiente directiva.
- Reiniciamos PostgreSQL para activa los cambios.
CONFIGURACIÓN DE POSTGRESQL
Los siguientes pasos se aplican a las instancias de PosgreSQL en los nodos pgsql1 y pgsql2.
# su – postgres $ createuser –superuser pgpool2
# nano /etc/postgresql/9.1/main/pg_hba.conf
El fichero deberá quedarnos de la siguiente manera:
listen_addresses = ‘*’
También podemos restringirlo a que solo escuche peticiones provenientes de la dirección IP en donde se encuentra pgpool-II
# service postgresql restart
- Editaremos el archivo /etc/pgpool2/pgpool.conf
- Para arrancar pgpool-II lo haremos con el siguiente comando (start o restart):
- Si queremos arrancar pgpool-II en modo de depuración primero lo detendremos con el comando “service pgpool2 stop” y lo arrancaremos en modo debug con de la siguiente manera:
- En otra pestaña o ventana de la terminal probaremos conectarnos a través de pgpool-II con el siguiente comando:
CONFIGURACIÓN DE PGPOOL-II
La configuración de pgpool-II la realizaremos únicamente en el nodo pgsql1, pues sólo ese host lo posee.
Deberemos editar el archivo para configurarlo a nuestra medida. Se configurarán: Pool de conexiones Replicación Balanceo de carga Las únicas directivas que modificaremos se muestran a continuación, las demás las dejaremos intactas:
listen_addresses = ‘*’
port = 9999
backend_hostname0 = ‘pgsql1’
backend_port0 = ‘5432’
backend_weight0 = 1
backend_hostname1= ‘pgsql2’
backend_port1 = ‘5432’
backend_weight1 = 1
replication_mode = true
load_balance_mode = true
replicate_select = true
pgpool2_hostname = ‘pgsql1’
# service pgpool2 start
# pgpool –n –d –f /etc/pgpool2/pgpool.conf
# psql –h pgsql1 –p 9999 –U pgpool2 –d postgres
El significado del comando anterior se detalla a continuación: -h es el nombre del host al que nos vamos a conectar y en donde está instalado pgpool-II. -p es el puerto que definimos en el archivo /etc/pgpool2/pgpool.conf -U es el usuario que creamos en los dos nodos del clúster. -d es la base de datos a la que nos vamos a conectar Si todo va bien podremos ver que en la terminal se nos muestra algo como sigue:
postgres=#
Lo que nos indica que nos hemos podido conectar a través de pgpool-II
- Crearemos una base de datos que será replicada a través de pgpool-II de la siguiente forma:
- Si nos loggeamos como usuario postgres en los dos nodos del clúster (su – postgres) y ejecutamos el siguiente comando para visualizar las bases de datos, nos debería de aparecer en cada nodo la base de datos que creamos en el paso anterior:
PRUEBAS DE REPLICACIÓN
# createdb –h pgsql1 –p 9999 –U pgpool2 basesdedatosues
$ psql -l
- Instalaremos el sniffer wireshark y luego lo ejecutaremos:
-
# apt-get install wireshark
# wireshark & - Seleccionaremos la interfaz eth0 y capturaremos algunos paquetes, realizaremos una consulta insert a través de pgpool-II y observaremos que aparecerán los siguientes paquetes en nuestra escucha:
- Observaremos con más detenimiento el paquete 874 y veremos que al momento de la replicación lo que se transporta a través de la red son las sentencias SQL. La query que fue introducida en el nodo pgsql1 a través de pgpool-II fue “insert into usuario values (‘Base’,’Pass’); y efectivamente vemos en el paquete que esa sentencia es la replicada en el nodo pgsql2 con dirección IP 192.168.1.4.
POSTGRESQL Y PGPOOL-II EN LA RED
A continuación se muestran algunas capturas de lo que sucede en la red al momento de que se realiza una sentencia SQL a través de pgpool-II en los nodos pertenecientes al clúster.
Referencias:
- Jaume Sabater (2008). Replicación y alta disponibilidad de PostgreSQL con pgpool-II. (1 Nov – 2008) http://linuxsilo.net/articles/postgresql-pgpool.html
- pgpool Global Development Group (2003 – 2011). Pgpool-II user manual http://pgpool.projects.pgfoundry.org/pgpool-II/doc/pgpool-en.html
2 comentarios:
Tengo un problema he seguido al pie de la letra la guía solo que en Ubuntu Server 13.04
y me a funcionado todo hasta el test de conexión
psql –h UServer01 –p 9999 –U pgpool2 –d postgres
al momento de conectarme me marca lo siguiente:
"psql: ERROR: MD5 authentication is unsupported in replication, master-slave and parallel modes.
HINT: check pg_hba.conf"
Muchas gracias también por compartir espero lo lean y me ayuden con esta linea
Revise el archivo que le menciona (pg_hba.conf)
# nano /etc/postgresql/9.1/main/pg_hba.conf
según el error que menciona, traduciendo: Autenticación MD5 no es soportada en replicación, modos esclavo-maestro y paralelo. Por lo general (y en el caso del documento) se usó trust para evitarse este problema.
Publicar un comentario