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/
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
#1Es demasiado fácil de
instalar
#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
#2La instalación ocupa
demasiado poco
#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.
#3Puedes conectarte
pulsando sólo 5 teclas
#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
#4Es seguro por defecto
#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
#5La licencia es muy
liberal
#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 :)
#6Está soportado en casi cualquier plataforma
#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
#7El código tiene
demasiados comentarios
#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
#7: El código tieneDemasiados comentarios
Puedes encontrar el código en git.postgresql.orgy github
#8Muchas grandes
empresas lo usan
#8: Muchas grandes empresas lo usan
#9PostgreSQL es muy
rápido
#9: PostgreSQL es muy rápido
En un dual-socket Intel Xeon X5650 with 24GB RAM:(http://www.dragonflybsd.org/performance/)
#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)
#10Soporta demasiados
tipos de datos
#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
#11Se pueden crear tus
propios tipos de datos
#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> )
#12Tiene tipos de datos
muy avanzados
#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 &&);
#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
#13Tiene demasiadas
funciones
#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, …
#14Tiene funcionalidades SQL muy avanzadas
#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
#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;
#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
#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));
#15Soporta DDL transaccional
#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;
#16Soporta muchos
lenguajes procedurales
#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
#17Tiene muchas extensiones
#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
#18PostGIS
#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
#19Es también NoSQL
#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
#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”? ;)
#20Tiene muchas soluciones de
replicación y HA
#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)
#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
#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
#21Esos impronunciables
FDWs
#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
#22Es “ácido” de verdad
#23Custom Background
Workers
#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 :)
Pero sólo hay UNArazón por la que ME
PONE