miércoles, 5 de junio de 2013

PostgreSQL Cluster con pgpool-II

Ve el documento en slideshare




Ve la demostracion en Youtube, no olvides ponerlo en HD




EQUIPO DE TRABAJO

Henry Ernesto Renderos ZaldañaDavid Alberto García Cardona
rz07002@ues.edu.svgc07011@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
  1. Utilidades para la gestión y el mantenimiento del clúster.
  2. # apt-get install ntp openssl file psmisc sysstat bzip2 unzip nmap dstat rsync wget ccze tcpdump pciutils dnsutils host

  3. Configuraremos dos archivos del sistema de Debian, esto nos facilitará hacer referencias a nombres de host y no a direcciones IP.
  4. # 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

  5. 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 ($).
  6. Instalaremos las cabeceras de la librería de PostgreSQL, el paquete de desarrollo de PostgreSQL y las utilidades de compilación de GNU)
  7. # apt-get install libpq-dev postgresql-server-dev-9.1 bison build-essential

  8. Una vez instalado, instalaremos PostgreSQL en ambos nodos del clúster:
  9. # apt-get install postgresql-9.1 postgresql-contrib-9.1 postgresl-doc-9.1 uuid libdbd-pg-perl

  10. Finalmente instalamos pgpool-II en el nodo identificado como pgsql1
  11. # apt-get install pgpool2 libpgpool0

    CONFIGURACIÓN DE POSTGRESQL

    Los siguientes pasos se aplican a las instancias de PosgreSQL en los nodos pgsql1 y pgsql2.

  1. Comenzaremos, como usuario postgres, añadiendo el usuario de base de datos (role) pgpool2, sin contraseña:
  2. # su – postgres $ createuser –superuser pgpool2

  3. 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.)
  4. # nano /etc/postgresql/9.1/main/pg_hba.conf

    El fichero deberá quedarnos de la siguiente manera:

  5. 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.
  6. listen_addresses = ‘*’

    También podemos restringirlo a que solo escuche peticiones provenientes de la dirección IP en donde se encuentra pgpool-II

  7. Reiniciamos PostgreSQL para activa los cambios.
  8. # service postgresql restart

    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.

  1. Editaremos el archivo /etc/pgpool2/pgpool.conf
  2. 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’

  3. Para arrancar pgpool-II lo haremos con el siguiente comando (start o restart):
  4. # service pgpool2 start

  5. 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:
  6. # pgpool –n –d –f /etc/pgpool2/pgpool.conf

  7. En otra pestaña o ventana de la terminal probaremos conectarnos a través de pgpool-II con el siguiente comando:
  8. # 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

    PRUEBAS DE REPLICACIÓN
  1. Crearemos una base de datos que será replicada a través de pgpool-II de la siguiente forma:
  2. # createdb –h pgsql1 –p 9999 –U pgpool2 basesdedatosues

  3. 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:
  4. $ psql -l

    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.

  1. Instalaremos el sniffer wireshark y luego lo ejecutaremos:
  2. # apt-get install wireshark
    # wireshark &

  3. 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:
  4. 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.

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:

Balrog dijo...

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

Henry RenZa dijo...

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.