Download - Por qué PostgreSQL me pone

Transcript
Page 1: Por qué PostgreSQL me pone

Por qué PostgreSQL me pone

Álvaro Hernández Tortosa <[email protected]>

Page 2: Por qué PostgreSQL me pone

La transparencia egocentrista

● Álvaro Hernández Tortosa <[email protected]>● Fundador y Director Técnico en NOSYS● ¿Qué hacemos en NOSYS?

✔ Formación, consultoría y desarrollo de software con PostgreSQL (y Java)✔ Partners de EnterpriseDB✔ Formación avanzada en Java con Javaspecialists.eu: Java Master Course y Java Concurrency Course✔ Partners de Amazon AWS. Formación y consultoría en AWS

● Twitter: @ahachete● LinkedIn: http://es.linkedin.com/in/alvarohernandeztortosa/

Page 3: Por qué PostgreSQL me pone

23 razones por las que...

NO me ponePostgreSQL

Y 1 razónpor la que...

ME PONE PostgreSQL

https://blog.engineyard.com/2012/data-engine-yard

Page 4: Por qué PostgreSQL me pone

#1Es demasiado fácil de

instalar

Page 5: Por qué PostgreSQL me pone

#1: Es demasiado fácil de instalar

● Un sólo comando si es de paquete:

apt-get install postgresql-9.3

yum install postgresql93-server

● O un par si es compilando el código fuente

./configure && make installpg_ctl -D /var/lib/postgresql -E UTF-8

Page 6: Por qué PostgreSQL me pone

#2La instalación ocupa

demasiado poco

Page 7: Por qué PostgreSQL me pone

#2: La instalación ocupa demasiado poco

ubuntu@test:~$ sudo apt-get install postgresql-9.3Reading package lists... Done

Building dependency tree

Reading state information... Done

The following extra packages will be installed:

libpq5 pgdg-keyring postgresql-client-9.3 postgresql-client-common postgresql-common ssl-cert

Suggested packages:

oidentd ident-server locales-all postgresql-doc-9.3 openssl-blacklist

The following NEW packages will be installed:

libpq5 pgdg-keyring postgresql-9.3 postgresql-client-9.3 postgresql-client-common postgresql-common ssl-cert

0 upgraded, 7 newly installed, 0 to remove and 14 not upgraded.

Need to get 4840 kB of archives.

After this operation, 23.2 MB of additional disk space will be used.

Page 8: Por qué PostgreSQL me pone

#3Puedes conectarte

pulsando sólo 5 teclas

Page 9: Por qué PostgreSQL me pone

#3: Puedes conectarte pulsando sólo 5 teclas

psql

Para ello es necesario, y práctico, crear un usuario de la base de datos con el mismo nombre que el usuario del S.O., y crear una base de datos también con ese mismo nombre:

postgres$ createuser --createdb --no-create-role \ aht

aht$ createdb aht

O para conectar a una base de datos arbitraria:psql -h host -p puerto base_de_datos usuario

Page 10: Por qué PostgreSQL me pone

#4Es seguro por defecto

Page 11: Por qué PostgreSQL me pone

#4: Es seguro por defecto

● Es muy aburrido, ¡tiene usuarios!

● Por defecto, sólo puedes conectarte desde localhost:➔ A través de sockets UNIX, como el mismo usuario del S.O.➔ A través de TCP/IP, típicamente con password

● Si quieres conectarte desde otras Ips:➔ Añade la(s) IP(s) en postgresql.conf, parámetro listen_addresses (formato CSV)➔ Edita pg_hba.conf para añadir la red (CIDR)desde donde se permita conectarse

Page 12: Por qué PostgreSQL me pone

#5La licencia es muy

liberal

Page 13: Por qué PostgreSQL me pone

#5: La licencia es muy liberal

Permission to use, copy, modify, and distribute this software and its documentation for any purpose, without fee, and without a written agreement is hereby granted,

provided that the above copyright notice and this paragraph and the following two paragraphs appear in all copies.

● PostgreSQL está bajo la licencia PostgreSQL License, que es muy similar a las licencias MIT o BSD.

● En resumen: haz lo que te dé la gana con el código :)

Page 14: Por qué PostgreSQL me pone

#6Está soportado en casi cualquier plataforma

Page 15: Por qué PostgreSQL me pone

#6: Está soportado en casi cualquier plataforma

● Sistemas Operativos:

Linux, Windows (Win2000 SP4 y posterior), FreeBSD, OpenBSD, NetBSD, Mac OS X, AIX, HP/UX, IRIX, Solaris, Tru64 Unix, y UnixWare

● Arquitecturas de CPU:

x86, x86_64, IA64, PowerPC, PowerPC 64, S/390, S/390x, Sparc, Sparc 64, Alpha, ARM, MIPS, MIPSEL, M68K, y PA-RISC

Page 16: Por qué PostgreSQL me pone

#7El código tiene

demasiados comentarios

Page 17: Por qué PostgreSQL me pone

#7: El código tiene demasiados comentarios

● Un 11% de las líneas de código C son comentarios:

aht@ushuaia:~/github/postgresql/src$for i in `find . -name '*.c'`;do orig=`wc -l $i|awk '{print $1}'`;without=`gcc -fpreprocessed -dD -E $i |wc -l |awk '{print $1}'`;echo $orig $without;done 2>/dev/null| awk '{t+= $1; c+= ($1-$2)} END { print c, t, c * 100 / t}'110319 1006481 10.9609

Page 18: Por qué PostgreSQL me pone

#7: El código tieneDemasiados comentarios

Puedes encontrar el código en git.postgresql.orgy github

Page 19: Por qué PostgreSQL me pone

#8Muchas grandes

empresas lo usan

Page 20: Por qué PostgreSQL me pone

#8: Muchas grandes empresas lo usan

Page 21: Por qué PostgreSQL me pone

#9PostgreSQL es muy

rápido

Page 22: Por qué PostgreSQL me pone

#9: PostgreSQL es muy rápido

En un dual-socket Intel Xeon X5650 with 24GB RAM:(http://www.dragonflybsd.org/performance/)

Page 23: Por qué PostgreSQL me pone

#9: PostgreSQL es muy rápido (II)

Escalabilidad hasta 64 cores, 8x8core AMD 6272:(http://rhaas.blogspot.com.es/2012/04/did-i-say-32-cores-how-about-64.html)

Page 24: Por qué PostgreSQL me pone

#10Soporta demasiados

tipos de datos

Page 25: Por qué PostgreSQL me pone

#10: Soporta demasiados tipos de datos

Tipos “habituales”

● int, bigint● serial, bigserial● varchar, text● real, double● boolean● date, time, timestamp● bytea● money● numeric● Arrays multidimensionales

Tipos “cool”

● json● xml● uuid● varbit● timestamptz● cidr● inet● macaddr● point, polygon, path,circle, box, line, lseg

Page 26: Por qué PostgreSQL me pone

#11Se pueden crear tus

propios tipos de datos

Page 27: Por qué PostgreSQL me pone

#11: Se pueden crear tus propios tipos de datos

● Crear una estructura (o tupla) como tipo de datos:CREATE TYPE name AS (att_name data_type [, ... ])

● Tipos enumerados:CREATE TYPE name AS ENUM ( [ 'label' [, ... ] ] )

● Tipos a partir de funciones de entrada/salida:CREATE TYPE name (INPUT = input_function, OUTPUT = output_function, … opciones … )

● DOMAINs:CREATE DOMAIN name AS <tipo_base> CHECK ( <restricciones_check> )

Page 28: Por qué PostgreSQL me pone

#12Tiene tipos de datos

muy avanzados

Page 29: Por qué PostgreSQL me pone

#12: Tiene tipos de datos muy avanzados:rangos (range types)

CREATE TABLE reservation (room int, during tsrange);INSERT INTO reservation VALUES (1108, '[2010-01-01 14:30, 2010-01-01 15:30)');-- ContainmentSELECT int4range(10, 20) @> 3;-- OverlapsSELECT numrange(11.1, 22.2) && numrange(20.0, 30.0);-- Compute the intersectionSELECT int4range(10, 20) * int4range(15, 25);-- Crear una tabla para prevenir inserciones solapadasALTER TABLE reserva_salas ADD EXCLUDE USING gist (reservado WITH =, periodo WITH &&);

Page 30: Por qué PostgreSQL me pone

#12: Tiene tipos de datos muy avanzados:interval y timestamptz

aht=> \tShowing only tuples.aht=> SELECT now() + interval '1 day'; 2014-03-21 15:13:32.938706+01aht=> SELECT now() + interval '1 day 3 minutes 2 hours 23 seconds'; 2014-03-21 17:17:05.626756+01aht=> SELECT now() + interval '1 day 3 minutes' * 30; 2014-04-19 16:44:03.530657+02aht=> SET TimeZone TO 'Asia/Tokyo'; SELECT now(); SET TimeZone TO 'Europe/Madrid'; SELECT now(); 2014-03-20 23:15:42.858534+09 2014-03-20 15:15:42.858901+01

Page 31: Por qué PostgreSQL me pone

#13Tiene demasiadas

funciones

Page 32: Por qué PostgreSQL me pone

#13: Tiene demasiadas funciones

● Funciones matemáticas: abs, ceil, exp, log, pi, power, radians, round, random, sqrt, trunc, …

● Funciones de texto: ascii, btrim, convert, encode, decode, initcap, length, md5, replace, …

● Búsqueda de patrones: LIKE, SIMILAR TO, ~

● Formateado: to_char, to_<tipodatos>

● Funciones para tipos geométricos, json, xml, arrays, expresiones condicionales, búsqueda de texto completo, gestión secuencias, …

Page 33: Por qué PostgreSQL me pone

#14Tiene funcionalidades SQL muy avanzadas

Page 34: Por qué PostgreSQL me pone

#14: Tiene funcionalidades SQL muy avanzadas:queries recursivas

WITH RECURSIVE t(n) AS (VALUES(1) UNION ALL SELECT n+1 FROM t WHERE n < 100) SELECT sum(n) FROM t;

WITH RECURSIVE subdepartment AS ( SELECT * FROM department WHERE name = 'A' UNION ALL SELECT d.* FROM department AS d JOIN subdepartment AS sd ON (d.parent_department = sd.id)) SELECT * FROM subdepartment ORDER BY name;

http://www.slideshare.net/nosys/ct-es-queriesrecursivas

Page 35: Por qué PostgreSQL me pone

#14: Tiene funcionalidades SQL muy avanzadas:window functions

SELECT when - lag(when, 1) OVER ( PARTITION BY agent_uuid ORDER BY when ) AS durationFROM metrics;

SELECT date, x, count(x) OVER (partition by date, x), array_agg(x) over(partition by date), array_agg(x) over(partition by date, x)FROM p;

Page 36: Por qué PostgreSQL me pone

#14: Tiene funcionalidades SQL muy avanzadas: (9.4) filtros en agregados y agregados hipotéticosSELECT pais, count(*) AS usuarios,count(*) FILTER (WHERE activo) usuarios_activosFROM usuarios GROUP BY pais;

INSERT INTO i VALUES (1), (100);SELECT percentile_cont(.2) WITHIN GROUP (ORDER BY i) FROM i; percentile_cont ----------------- 20.8SELECT rank(5) WITHIN GROUP (ORDER BY i) FROM i; rank ------ 2

Page 37: Por qué PostgreSQL me pone

#14: Tiene funcionalidades SQL muy avanzadas: Índices parciales

● Índices parciales: se trata de índices sobre un subconjunto de valores de una tabla. Permiten reducir el tamaño del índice, eliminando valores que no importan:

CREATE INDEX tabla_indice ON tabla (cols) WHERE NOT borrado;

● Índices sobre expresiones: se pueden crear índices no sólo sobre columnas existentes, sino también sobre expresiones arbitrarias sobre las columnas:

CREATE INDEX tabla_indiceON tabla (lower(nombre));

Page 38: Por qué PostgreSQL me pone

#15Soporta DDL transaccional

Page 39: Por qué PostgreSQL me pone

#15: Soporta DDL transaccional

BEGIN;CREATE TABLE borrar (i integer);INSERT INTO borrar VALUES (8);SELECT * FROM borrar; i --- 8ROLLBACK;SELECT * FROM borrar;ERROR: relation "borrar" does not existLINE 1: SELECT * FROM borrar;

Page 40: Por qué PostgreSQL me pone

#16Soporta muchos

lenguajes procedurales

Page 41: Por qué PostgreSQL me pone

#16: Soporta muchos lenguajes procedurales

● Para triggers, procedimientos almacenados o checks

● Se pueden programar en:➔ PL/pgsql➔ PL/Python➔ PL/v8➔ PL/Perl➔ PL/Java➔ PL/bash➔ PL/R➔ PL/lolcat!!!!!!!!!

http://www.slideshare.net/linuxpoet/developing-a-procedural-language-for-postgre-sql

Page 42: Por qué PostgreSQL me pone

#17Tiene muchas extensiones

Page 43: Por qué PostgreSQL me pone

#17: Tiene muchas extensiones

● pg_buffercache – inspecciona la memoria● pg_tgrm – búsqueda por palabras similares● pgcrypto – funciones de cifrado● unaccent – quita tildes, eñes, etc● pl/proxy !!!! – ejecutar funciones en otras dbs● pg_jobmon –logging y monitorización● Intarray – operaciones sobre arrays de enteros no nulos● Ip4r – funciones avanzadas de IPv4 y IPv6

… y algunas más que vemos más adelante

Page 44: Por qué PostgreSQL me pone

#18PostGIS

Page 45: Por qué PostgreSQL me pone

#18: PostGIS

● Es el software de GIS más avanzado del mundo. Es una extensión de PostgreSQL, que crea tipos de datos, funciones y tablas de referencia.

● Permite hacer consultas georreferenciadas como obtener una región de 50km alrededor de los ríos de EEUU de los estados del oeste:SELECT ST_Union(ST_Intersection(ST_Buffer(r.the_geom,50000),s.the_geom)) FROM usa_rivers as r, usa_states as s WHERE ST_Intersects(r.the_geom, s.the_geom) AND s.region = 'West' GROUP BY state

Page 46: Por qué PostgreSQL me pone

#19Es también NoSQL

Page 47: Por qué PostgreSQL me pone

#19: Es también NoSQL: hstore

● Es una extensión, que permite almacenar pares clave-valor en una columna. ¡Y recursivos desde 9.4!

CREATE EXTENSION hstore;INSERT INTO hstore_test (data) VALUES ('"key1"=>"value1", "key2"=>"value2", "key3"=>"value3"');

SELECT * FROM hstore_test WHERE data ? 'key4';SELECT data -> 'key4' FROM hstore_test;SELECT item_id, (each(data)).* FROM hstore_test

Page 48: Por qué PostgreSQL me pone

#19: Es también NoSQL: json

● Es un tipo de datos nativo.

● Se almacena como texto, pero valida sintaxis json.

● Dispone de múltiples funciones y operadores, similares a hstore.

● Desde 9.4 existirá jsonb, que almacena en binario (pero no es BSON).

● ¿Se puede almacenar json sin “hacer el mongo”? ;)

Page 49: Por qué PostgreSQL me pone

#20Tiene muchas soluciones de

replicación y HA

Page 50: Por qué PostgreSQL me pone

#20: Tiene muchas soluciones de replicación y HA

● Replicación binaria en el core:➔ Maestro / varios (muchos) esclavos➔ R/W maestro, R/O esclavos➔ Soporta cascadas➔ Síncrono o asíncrono (¡incluso por tx!)➔ Muy rápido (normalmente, sub-segundo)➔ Requiere la misma arquitectura➔ Replica el cluster (todas las bases de datos) entero

● En 9.5 ó 10: replicación lógica en el core, bi-direccional (maestro-maestro)

Page 51: Por qué PostgreSQL me pone

#20: Tiene muchas soluciones de replicación y HA

● Replicación lógica con Slony:➔ Compatible entre diferentes arquitecturas y versiones de Postgres➔ Permite seleccionar subonconjuntos de tablas a replicar➔ Replicación asíncrona, permite replicación MAN➔ Soporta cascadas. Los esclavos son r/o también

● Replicación con Bucardo:➔ Dos maestros o maestro-esclavo(s)➔ Asíncrona➔ Handler de conflictos estándar o a medida

Page 52: Por qué PostgreSQL me pone

#20: Tiene muchas soluciones de replicación y HA

● Alta disponibilidad con pgpool:➔ Hace de pooling de conexiones (como pgbouncer)➔ Si un servidor cae, la conexión con pgpool no, y sirve carga a los demás➔ Entiende la replicación (core o Slony) y divide r/w entre los servidores esclavo(s)/maestro➔ Permite ejecutar scripts ante eventos de HA➔ Tiene un modo de HA para no ser SPOF

Page 53: Por qué PostgreSQL me pone

#21Esos impronunciables

FDWs

Page 54: Por qué PostgreSQL me pone

#21: Esos impronunciables FDWs

● Los Foreign Data Wrappers permiten acceder a otras fuentes de datos desde dentro de PostgreSQL, como:

➔ postgres_fdw – habilita tx autónomas➔ {oracle,mysql,odbc,jdbc,firebird,sqlite}_fdw➔ {couchdb,mongo,redis,neo4j}_fdw➔ file_fdw, json_fdw➔ twitter_fdw➔ s3_fdw➔ www_fdw➔ Multicorn: programa FDWs en Python

Page 55: Por qué PostgreSQL me pone

#22Es “ácido” de verdad

Page 56: Por qué PostgreSQL me pone

#23Custom Background

Workers

Page 57: Por qué PostgreSQL me pone

#23: Custom Background Workers

● Funcionalidad en PostgreSQL para poder lanzar tus propios procesos, cuyo ciclo de vida gestiona postgres.

● Tienen acceso parcial o total a la memoria de postgres, y pueden realizar tareas como:

➔ kill_idle: cierra conexiones inactivas más de un tiempo➔ config_log: monitoriza cambios en postgresql.conf y los guarda en una tabla➔ ¿pg_cron?➔ Mongres➔ you name it :)

Page 58: Por qué PostgreSQL me pone

Pero sólo hay UNArazón por la que ME

PONE

Page 59: Por qué PostgreSQL me pone