sábado, 4 de junio de 2016

Clúster Postgresql con pgpool-II. Instancias ec2

Universidad de El Salvador Facultad Multidisciplinaria de Occidente.

Departamento Ingeniería y Arquitectura.

Catedra:
Bases de Datos.

Tema:
Guía para la Creación de un Clúster Postgresql con pgpool-II.

Docente:
Ing. Alexander Calderón.

Alumnos:
    López Cazún, Marvin Josué.         
          marvincitojlc@gmail.com
     
     Morales Flores, Rocío Elizabeth.    
          rociomorales_1a@hotmail.com
     
     Osorio Ramírez, Kevin Manuel.      
          kevinn_os@hotmail.com


Santa Ana, 18 de Junio de 2016.


Introducción.

Estudiaremos los conceptos básicos del clúster en las tecnologías de bases de datos, para ello veremos específicamente las bases de datos Postgresql y utilizaremos las tecnologías de pgpool2 para la creación del Clúster.
La Guía está hecha de forma que sea sencilla de comprender para que podamos crear y utilizar el Clúster en cuestión de minutos; comenzaremos definiendo ciertos conceptos, luego instalaremos algunos paquetes que serán necesarios, incluyendo Postgresql y pgpool2. Después de la instalación de los paquetes configuraremos unos archivos para poder crear el Clúster luego de lo cual haremos una pequeña prueba para ver la funcionalidad del Clúster.

Objetivos:
·         Estudiar los conceptos básicos de las tecnologías Postgresql y pgpool2.
·         Conocer el concepto de Clúster para Bases de Datos.
·         Aprender las configuraciones necesarias para hacer un Clúster con las tecnologías estudiadas.
·         Pequeña prueba del Clúster.




Conceptos Básicos.

Clúster:
       Este tipo de sistemas se basa en la unión de varios servidores que trabajan como si se trata de uno solo. En Bases de Datos de utiliza para dar un alto rendimiento a las Bases de Datos.
Para que el sistema clúster funcione no es necesario que todas las maquinas dispongan del mismo hardware y sistema operativos. Este tipo de sistemas debe disponer de una interfaz de manejo de clúster, la cual se encargue de interactuar con el usuario y los procesos, repartiendo la carga entre las diferentes maquinas del grupo.

Postgresql:
       Es un sistema de gestión de bases de datos relacional, orientada a objetos y libre, publicado bajo la licencia PostgresSQL. Cuenta con mas de 15 años de desarrollo activo y además puede ejecutarse en los principales sistemas operativos: Windows, Linux.

Pgpool2:
       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
·         Replicación
·         Balanceo de Carga
·         Limitar el exceso de conexiones
·         Consultas en paralelo

Desarrollo de la Guía:

Para el desarrollo de la guía lo haremos en dos computadoras con sistema operativos Linux/Debian 8.1, los siguientes pasos de instalación, configuración y pruebas son en una Terminal de dicho sistema operativo. 
Utilizaremos instancias de Amazon ec2.

Paso Uno: Ingresar a la Consola de la Instancia.
(Para cada Servidor)

Abrimos una terminal normal, una para cada servidor, luego ejecutamos la siguiente línea:
En la terminal que utilizaremos para el servidor pgsql1:
       $ ssh -i "Documentos/key.pem" admin@ec2-52-39-194-30.us-west-2.compute.amazonaws.com
En la terminal que utilizaremos para el servidor pgsql2:
     $ ssh -i "Documentos/key.pem" admin@ec2-52-10-33-58.us-west-2.compute.amazonaws.com

Nota: Utilizaremos para conectarnos ssh y necesitamos tener una “llave” en nuestra computadora, la llave se llama key.pem, en nuestro caso. Deben generar su propia llave con las instancias de amazon que están utilizando. Además, al darle click derecho a la instancia, en las opciones de menú que nos aparecen, seleccionamos la opción “Conectar” y nos aparecerá nuestra cadena de conexión ssh, similar a la que está arriba que ocúpanos nosotros para conectarnos.

En cada instancia deben tener los puertos abiertos que se utilizaran, estos son 9999 y 5432.

Durante la guía deben recordar que las direcciones IP son las que nosotros ocupamos con nuestros servidores, ustedes deben utilizar las direcciones IP públicas de sus servidores amazon.


A continuación, se muestran las imágenes para abrir los puertos.




Paso Dos: Instalación de Paquetes.
(Debemos instalar todos los paquetes en ambos servidores)

1.    Algunas utilidades
$ sudo apt-get install ntp openssl file psmisc sysstat bzip2 unzip nmap dstat rsync ccze tcpdump pciutils dnsutils host

2.   Librerias y paquetes de Postgresql
$ sudo apt-get install libpq-dev Postgresql-server-dev-9.4 bison build-essential
$ sudo apt-get install Postgresql-9.4 postgresql-contrib-9.4 postgresql-doc-9.4 uuid libdbd-pg-perl

3.   Instalación de pgpool2
$ sudo apt-get install pgpool2 libpgpool0

Paso Tres: Configuración de Archivos del Sistema
(En ambos servidores)

Algunas especificaciones:
       Servidor 1:
·         Hostname: pgsql1
·         Dirección IP Publica: 52.39.194.30

Servidor 2:
·         Hostname: pgsql2
·         Dirección IP Publica: 52.10.33.58

1.    Primero modificaremos el archivo hostname, para ello ejecutamos el siguiente comando:

$ sudo nano /etc/hostname

       Y modificamos el nombre.
                 Figura 1. Modificación del archivo hostname.
2.   
   Ahora modificaremos el archivo hosts,

$ sudo nano /etc/hosts

       Lo haremos de la siguiente forma:

Figura 2. Modificación del archivo hosts.

Paso Cuatro: Configuración de los Archivos Postgresql
(En ambos servidores)

Modificaremos dos archivos, estos son pg_hba.conf y postgresql.conf.

1.    Para modificar el primer archivo ejecutamos el siguiente comando:
$ sudo nano /etc/postgresql/9.4/main/pg_hba.conf

Y solamente agregamos la línea sombreada en la imagen.

                 Figura 3. Modificación del archivo pg_hba.conf.

2.   Para el segundo archivo ejecutamos

$ sudo nano /etc/postgresql/9.4/main/postgresql.conf

Y lo modificamos como muestra la imagen.

               Figura 4. Modificación del archivo Postgresql.conf

Paso Cinco: Creación de un usuario común.
(En ambos servidores)

Para continuar crearemos un usuario en ambos servidores, llamaremos al usuario pgpool2 y lo crearemos siguiendo los pasos que están a continuación:

1.    Debemos logearnos como usuario postgres, este es un usuario creado por defecto al instalar Postgresql.

$ sudo su – postgres

2.   Ya logeados crearemos el nuevo usuario y también le daremos permisos de súper usuario.

$ createuser --superuser pgpool2 password 'contraseña'

Luego de crear el usuario pgpool2 nos salimos del usuario porstgres, para regresar al usuario normal de nuestra terminal:


$ exit

Paso Seis: Configuración de los Archivos de Pgpool2
(En Ambos Servidores)

Para poder editarlo ejecutaremos el siguiente comando:

       $ sudo nano /etc/pgpool2/pgpool.conf

Mostramos la siguiente lista de directivas, estas serán las que modificaremos, debemos buscarlas en el archivo que acabamos de abrir, descomentarlas y cambiarles el valor, de ser necesario.

      listen_addresses = ‘*’
port = 9999
backend_hostname0 = ‘pgsql1’
backend_port0 = 5432
backend_weight0 = 1
backend_hostname1= ‘pgsql2’
backend_port1 = 5432
backend_weight1 = 1
replication_mode = on
replicate_select = on
load_balance_mode = on
pgpool2_hostname = ‘pgsql1’ ##### Aquí va el nombre del nodo donde estamos configurando el archivo.

Paso Siete: Reiniciamos Servicios.

Ya con los archivos de Postgresql y pgpool2 configurados reiniciaremos los servicios.

$ sudo service postgresql restart

$ sudo service pgpool2 restart

Ahora ya estamos listos para hacer la prueba.

Paso Ocho: Prueba del Clúster.

Para realizar la prueba del clúster realizamos los siguientes pasos (Recordar utilizar las direcciones IP de sus servidores):

1.    Debemos restaurar la Base de Datos. Para ello creamos una base de datos en cualquier Servidor (en el ejemplo es en el servidor pgsql1) de esta forma:

$ sudo createdb -h pgsql1 -p 9999 -U pgpool2 BaseVentas

2.   Necesitamos tener en nuestro servidor amazon el script que vamos a restaurar, para ello lo enviamos por medio de ssh con el siguiente comando:

$ sudo scp -i Documentos/key.pem Documentos/DB_Ventas.backup admin@ec2-52-39-194-30.us-west-2.compute.amazonaws.com:/home/admin

3.   Ahora Restauramos nuestra Base “Mini Tienda” en la base creada en anteriormente.

$ sudo pg_restore -i -h pgsql1 -p 9999 -U pgpool2 -d BaseVentas -v "home/admin/DB_Ventas.backup"

4. Ya con la Base Restaurada entramos para hacer las consultas:

$ sudo psql –U pgpool2 –W –h 52.39.194.30 BasesVentas

5.   Ahora ya podemos ejecutar unas consultas:

$ INSERT INTO producto(codigoproducto,nombre,precio) VALUES(‘1’,’Memoria USB’,5.33);

$ SELECT * FROM producto;

$UPDATE producto SET nombre = ‘Memoria USB 4GB’ WHERE codigoproducto = ‘1’;


$ SELECT * FROM producto;

El Script que utilizamos es el siguiente:

--
-- PostgreSQL database dump
--

-- Dumped from database version 9.4.6
-- Dumped by pg_dump version 9.4.6
-- Started on 2016-05-03 17:04:23 CST

SET statement_timeout = 0;
SET lock_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;

--
-- TOC entry 1 (class 3079 OID 11861)
-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner:
--

CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;


--
-- TOC entry 2018 (class 0 OID 0)
-- Dependencies: 1
-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner:
--

COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';


SET search_path = public, pg_catalog;

SET default_tablespace = '';

SET default_with_oids = false;

--
-- TOC entry 173 (class 1259 OID 16416)
-- Name: DetalleVenta; Type: TABLE; Schema: public; Owner: bases; Tablespace:
--

CREATE TABLE "detalleventa" (
    "codigoproducto" character varying(20) NOT NULL,
    "codigoventa" integer NOT NULL,
    "cantidad" integer
);


ALTER TABLE "detalleventa" OWNER TO bases;

--
-- TOC entry 174 (class 1259 OID 16419)
-- Name: Producto; Type: TABLE; Schema: public; Owner: bases; Tablespace:
--

CREATE TABLE "producto" (
    "codigoproducto" character varying(20) NOT NULL,
    "nombre" character varying(100) NOT NULL,
    "precio" money
);


ALTER TABLE "producto" OWNER TO bases;

--
-- TOC entry 175 (class 1259 OID 16422)
-- Name: Venta; Type: TABLE; Schema: public; Owner: bases; Tablespace:
--

CREATE TABLE "venta" (
    "codigoventa" integer NOT NULL,
    "fecha" timestamp without time zone,
    "total" money
);


ALTER TABLE "venta" OWNER TO bases;

--
-- TOC entry 2008 (class 0 OID 16416)
-- Dependencies: 173
-- Data for Name: DetalleVenta; Type: TABLE DATA; Schema: public; Owner: bases
--

COPY "detalleVenta" ("codigoproducto", "codigoventa", "cantidad") FROM stdin;
\.


--
-- TOC entry 2009 (class 0 OID 16419)
-- Dependencies: 174
-- Data for Name: producto; Type: TABLE DATA; Schema: public; Owner: bases
--

COPY "producto" ("codigoproducto", "nombre", "precio") FROM stdin;
\.


--
-- TOC entry 2010 (class 0 OID 16422)
-- Dependencies: 175
-- Data for Name: venta; Type: TABLE DATA; Schema: public; Owner: bases
--

COPY "venta" ("codigoventa", "fecha", "total") FROM stdin;
\.


--
-- TOC entry 1894 (class 2606 OID 16426)
-- Name: PK_codigoproducto; Type: CONSTRAINT; Schema: public; Owner: bases; Tablespace:
--

ALTER TABLE ONLY "producto"
    ADD CONSTRAINT "PK_codigoproducto" PRIMARY KEY ("codigoproducto");


--
-- TOC entry 1896 (class 2606 OID 16428)
-- Name: PK_codigoventa; Type: CONSTRAINT; Schema: public; Owner: bases; Tablespace:
--

ALTER TABLE ONLY "venta"
    ADD CONSTRAINT "PK_codigoventa" PRIMARY KEY ("codigoventa");


--
-- TOC entry 1892 (class 2606 OID 16430)
-- Name: Pk_codigoproducto_codigoventa; Type: CONSTRAINT; Schema: public; Owner: bases; Tablespace:
--

ALTER TABLE ONLY "detalleventa"
    ADD CONSTRAINT "Pk_codigoproducto_codigoventa" PRIMARY KEY ("codigoproducto", "codigoventa");


--
-- TOC entry 1897 (class 2606 OID 16431)
-- Name: FK_codigoproducto; Type: FK CONSTRAINT; Schema: public; Owner: bases
--

ALTER TABLE ONLY "detalleventa"
    ADD CONSTRAINT "FK_codigoproducto" FOREIGN KEY ("codigoproducto") REFERENCES "producto"("codigoproducto");


--
-- TOC entry 1898 (class 2606 OID 16436)
-- Name: FK_codigoventa; Type: FK CONSTRAINT; Schema: public; Owner: bases
--

ALTER TABLE ONLY "detalleventa"
    ADD CONSTRAINT "FK_codigoventa" FOREIGN KEY ("codigoventa") REFERENCES "Venta"("codigoventa");


--
-- TOC entry 2017 (class 0 OID 0)
-- Dependencies: 7
-- Name: public; Type: ACL; Schema: -; Owner: postgres
--

REVOKE ALL ON SCHEMA public FROM PUBLIC;
REVOKE ALL ON SCHEMA public FROM postgres;
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO PUBLIC;


-- Completed on 2016-05-03 17:04:23 CST

--
-- PostgreSQL database dump complete
--

No hay comentarios: