PostgreSQL

Anuncio
PostgreSQL
Capacitación Nivel 1
Día 1
Agenda
• Introducción al Modelo Objeto-Relacional
• Introducción a la Arquitectura Cliente/Servidor.
Breves comparaciones.
• Introducción a PostgreSQL .
• Arquitectura
• Procesamiento interno
• Esquema Lógico
• Herramientas
• ACID en Pgsql
• MVCC
Introducción al Model ObjetoRelacional
¿Porqué Bases de datos?
Los SGBD nacieron con el propósito de solventar los
siguientes problemas de los antiguos sistemas:
• Redundancia e inconsistencia de Datos.
• Dificultad en el acceso concurrente.
• Aislamiento de datos.
• Problemas de integridad.
• Problemas de atomicidad.
• Anomalías en el acceso concurrente.
• Problemas de Seguridad.
Visión de Datos
– Nivel físico.
– Es como se guardan los datos en disco. Solo es
importante conocerlos si es DBA o desarrollador del
motor.
– Nivel Lógico.
– Es el nivel en el cual trabaja el DBA y el Arquitecto de
datos.
– Nivel de vistas.
– Es el nivel en el cual trabaja el desarrollador de la
aplicación final y el cual verá el usuario de la misma.
Independecia Física
• Físico
– Disposición de elementos del motor sobre los
sistemas de almacenamiento.
– Ayuda a mejorar la performance.
• Lógico
– Disposición de los objetos dentro de la base.
– Ayuda a mejorar la comprensión.
– Característica que puede adicionar seguridad
a nivel de gestor.
Modelos Lógicos
•
•
•
•
Modelo Entidad Relación (DER)
Modelo Orientado a Objetos.
Modelo de datos semántico.
Modelo de datos funcional.
Indican el diseño lógico de datos,
No indican datos reales o
ya implementados
Modelos lógicos basados en registros
• Ojeto-Relacional.
• Postgresql, Oracle
• Modelo relacional
• Mysql, DB2, SQLServer
• El modelo de red
• El modelo jerárquico
• Sistemas de Archivos (pueden ser
considerados Bases de Datos).
• Orientado a Objetos
• DB4O
Arquitecturas
Backend
Proceso
Archivo/s
Backend
Cliente
Cliente
...
Servidor /
Cluster de servidores
Servidor
Datos
Derby –
BerkeleyDB
Mysql – Postgresql Firebird
Oracle – DB2 - Greenplum
El punto de vista de Stonebraker
Capacidades
De búsqueda
/soporte
multiusuario
r
o
y
Ma
SGBD
relacional
SGBD
O-R
Mysql
Sistemas
De
archivos
ad
d
i
Derby
oc
l
e
v
Postgresql
SGBD
OO
d
DB4O ocida
vel
r
no
e
M
Complejidad de los datos y ampliabilidad
Principios de la integridad de datos
•
•
•
•
Atomicidad
Consistencia
Aislamiento (Isolation)
Durabilidad
NOTA: PostgreSQL es ACID
Transacciones
Colección de operaciones (sucesión de acciones) que forman una
unidad lógica de trabajo, y que posiblemente actualice varios
elementos de datos.
Transacción 1
Transacción 2
Base de
Datos
Log de
transacciones
Commit
Commit
Estados transaccionales
•
•
•
•
•
•
Activa
Parcialmente comprometida
Fallida
Abortada
Comprometida (COMMIT)
Rollback (No se aborta, se vuelve a un
determinado punto o inicio de transacción)
Introducción a Postgresql
Historia
1977-1985 Michael Stonebraker Inicia postgreSQL como
Ingres en la Universidad de Berkeley, California.
1986, comprado por Computer Associates.
1989, Liberada la primera versión como Postgres.
1994-95 dos estudiantes graduados de Berkeley Jolly Chen y
Andrew Yu añaden SQL a Postgres y lo llaman Postgres95.
1996, (1000 colaboradores) Se decidió quitar el 95 al nombre
para liberarse de la cronología y nace PostgreSQL.
Ultima version al momento 8.4 y 8.5 en desarrollo.
http://archives.postgresql.org/pgsql-advocacy/200412/msg00033.php
Historia (2)
• OMFG!
Su hermandad con Informix
Stonebraker empezó Ingres (1977). Luego de varias
empresas, desembarcó en Illustra.
Después (1995) unos estudiantes tomaron POSTGRES y
lo siguieron desarrollando, le pusieron Postgres95 y
después se pasó a llamar PostgreSQL.
En 1996 la empresa que hacía Informix compró Illustra y
dejaron de lado la base de datos Illustra, y en cambio
usaron los ingenieros y la tecnología para avanzar un poco
más con Informix.
En el 2001 la empresa Informix se dividió en dos y la parte
que tenía que ver con la base de
datos fue a parar a IBM.
Informix desde ECPG
Postgresql, descripción
• Es el SGBD Open Source mas potente del mercado.
• Posee casi 30 años de desarrollo.
• Licencia BSD de Berkeley.
• Esta en la vanguardia de la investigacion en al tecnología
transaccional.
• Es ACID.
• Es segura.
• Tiene alternativas comerciales de muchísima calidad. Ej:
EnterpriseDB, CyberTech(Alemania), etc.
• Tiene otras alernativas (forks) FastDB, Bizgres, etc.
Postgresql, descripción (2)
•
•
•
•
Es un motor Objeto-Relacional [*].
Cliente/servidor
Extensible
Multiples conectores desde lenguajes de
programación.
• Lenguaje procedimental propio (PL/pgsql)
y extendido (PL/PERL, PL/PYTHONu,
PL/JAVA, PL/RUBY, PL/R, C, C++...)
Postgresql, descripción (3)
SQL:2003
• El estandar SQL:2003 define las siguientes
características que se peuden implementar en las
bases Objeto relacionales:
– Rowtype
– Tipos definidos y rutinas por usuario.
– Poliformismo
– Herencia
– Tipos de referencia e identidad de objetos (el OID es uno de ellos)
– Tipos de colección (ARRAY, MULTISET, SET, LIST)
– Ampliación del SQL para hacerlo computacionalmente completo.
– Soporte para objetos de gran tamaño (BLOB y CLOB)
– Recursión.
Carácterísticas
•
El modelo es de cliente/servidor (hoy en día el más común, pero no
el único).
•
Su lenguaje procedimental es muy similar al PL de Oracle, logrando
una migración mas amena.
•
Se adapta a los standares SQL:2003.
•
Posee MVCC (Multi-Version Concurrency Control). Fue una de las
pioneras (la primera fue InterBase)
•
Posee WAL (Write Ahead LOG).
•
Herencia de tablas.
•
Puntos de recuperacion avanzados (savepoints, replicacion
asincronica)
•
Optimizador de consultas.
•
Juegos de caracteres UNICODE e internacionalización.
Características (2)
• Tipos de datos accesorios:
– Números de presición arbitraria (creando numeros
más complejos)
– Text de largo ilimitado.
– Figuras geometricas, con funciones asociadas.
(Cube, contrib)
– IpV4 y 6.
– Mac Address.
– Arrays (Nuevas funciones en 8.4)
– Postgis (necesita un capítulo aparte).
– Citext (insensitive case text type - 8.4)
Características - Límites
•
•
•
•
•
•
•
Maximo de la BD: ilimitado.
De Tablas: 32 TB.
De tupla: 1.6 TB.
De campo: 1 GB
Tuplas x tabla: ilimitado.
Índices por tabla: ilimitado.
Bloque: 8k
Características - Índices
• Pueden ser definidos por el usuario:
– Btree (por defecto y el más común), Hash, GIN
(Generalized Inverted , ex RTree) y Gist (Generalized
Index Storage).
• Basados en expresiones.
• Parciales
• Bitmaps.
• Gin es más lento para inserciones pero más rápido para
búsqueda de texto (se usa para Full Text Search).
• Gist es bueno para datos complejos o raros (figuras
geométricas, tsvector, etc)
Características - Avanzadas
• Restricciones Referential Integrity Constraints. Evita
eliminaciones accidentales.
• Transacciones BEGIN – END- SAVEPOINTS.
• Anidación de consultas avanzadas.
• Conexiones encriptadas vía SSL.
• Dominios, clustering, tablespaces, schemas y otros
objetos de agrupación.
• TOAST (atributos comprimidos largos, transparente al
usuario).
• Soporte de funciones de ventana y recursivas.
Vista lógica del funcionamiento
Aplicacion
Postgres
postmaster
psql
Postgres
Vista más detallada
Vista ++ detallada
• Acceso
desde
diversos
conectores.
Bloque I/O
Block 8k
Le
íd
o
Cache
Hit
Tabla
Block 8k
Block 8k
LRU
(Last Recently
Used)
Dentro de un bloque
Tupla
Tupla
Cache Pg + Kernel
• Se utiliza
gran parte
del cache de
buffer del
kernel.
• http://momjia
n.us/main/wri
tings/pgsql/h
w_performan
ce/
Autenticación – Saludo de 3 vías
postmaster
backend
backend
Servidor
Inicio de Conexion
Auth
Query's
frontend
frontend
frontend
Cliente
T
i
e
m
p
o
Listado de Procesos
Postmaster
• Proceso principal.
• Se maneja como un servicio de sistema.
• Levanta la memoria compartida.
• Vigila solicitudes y esta al tanto de los movimientos.
• Realiza el enlazado a los archivos de datos.
• puede manejar varias bases de datos y usuarios.
• Uno x CLUSTER.
Datos técnicos
• La comunicación entre Back y front se
realiza mediante sockets a través del
puerto 5432 (por defecto).
• Generalmente el archivo es
/tmp/s.PGSQL.5432.
Procesamiento Interno
Esquema Interno
Parseo de comando
Analizamiento de consulta
Ejecutor de consulta
La ruta de una consulta
1. Una conexión desde una aplicación al servidor Pgsql debe ser establecida.
La aplicación transmite la consulta y espera a los resultados.
2. El 'parseador' chequea que la consulta transmitida por la aplicación tenga
una sintaxis correcta y crea el árbol de consulta (ADC).
3. El sistema de reescritura(SDR) toma el ADC y busca cualquier regla
(almacenada en los catalogos de sistema) para aplicar el ADC. Ejecuta
transformaciones dadas en los cuerpos de las reglas. Una aplicación del SDR
es la realización de vistas. Cuando sea una consulta sobre una vista, el SDR
reescribe la consulta para acceder a la tabla.
4. El planeador/optimizador toma la reescrita consulta y crea un plan, el cual
será la entrada del ejecutor. Com primera instancia creará todas las posibles
rutas que tengan el mismo resultado. Seguido, el
costo por cada ejecución es estimado para elegir
el menos costoso. Ese mismo es expandido para
que el ejecutor pueda usarlo.
5. El ejecutor rescursivamente pasa a través del
árbol del plan y devuelve las filas. Hace uso del
sistema de almacenamiento mientras realiza las
tareas del plan y finalmente retorna los resultados.
Como se establecen conexiones
• Un proceso por usuario.
– Pro
» Esto es importante debido a que provee de
mayor estabilidad en ambientes muy
concurrentes.
» En mayor concurrencia hace mejor
aprovechamiento de multinucleos y
recursos.
– Contras
» Como contra, en ambientes de menor
concurrencia, suele tener menos
performance que varios usuarios por
proceso manejados por hilos.
Como se establecen conexiones (2)
• El proceso maestro (postgres) escucha su
socket a través de TCP/IP (puerto por
defecto 5432)
• Estos procesos se comunican entre si
para mantener la integridad de los datos.
• Se puede conectar con cualquier
aplicación – driver que entienda el
protocolo de Postgresql.
» Mayor detalle en el manual, capítulo
“Frontend/Backend Protocol” (45 en versión 8.4)
Binarios escenciales
•
postgres
» Servidor
•
psql
» No olbligatorio, pero extremadamente útil.
•
pg_ctl
» Administra el arranque o la parada del servidor.
•
pg_config
» Provee información sobre la instalación de la base
•
pg_controldata
» Información del Cluster de datos
•
reindexdb – vacuumdb
» Herramientas de mantenimiento
•
Initdb
» Inicializa un cluster de bases de datos.
•
Ipcclean
» Limpia la memoría compartida de consultas canceladas.
Instalación
Elección del SO
• La elección del SO es crucial para la
instalación de nuestro motor. Influirá:
–
–
–
–
–
–
Escalamiento.
Mantenimiento.
Funcionalidad.
Estabilidad.
Herramientas.
Seguridad.
Caso: Windows
• En el caso de utilizarse Windows como
plataforma servidor, se recomienda la serie
'server' o superior.
• Preferentemente 2000 o superior.
• Imposibilidad de utilizar sistemas de ficheros
ajenos a su licencia (NTFS -FAT).
• Soporte no tan poblado como en otras
plataformas.
Caso: Derivado Linux
• Es el más soportado.
• Posibilidad de utlización de varios
sistemas de ficheros (xfs, jfs, reiserfs,
ext2-3, etc.)
• Económico.
• Escalable.
• Fácil de configurar.
Caso: BSD
• Bastante similar a Linux en cuanto a
posibles problemas y soporte.
• Soporta ZFS.
Caso: Solaris
• Estable.
• Soporta varios sistemas de archivo incluido ZFS.
• Soporta herramientas de administración avanzada.
• Soporta herramientas de debug avanzadas.
» Postgresql incluye 'probes' para ser traceado con
DTRACE.
• Exelente rendimiento en ambientes muy concurrentes y
de alta carga de datos.
Instalación
• Homo Paquetus
– Es la forma más común de instalación.
– Existen en forma de paquetes .deb, .rpm, .pkg, one-clickinstallers (varias plataformas, gracias al aporte de
EnterpriseDB y traducción de SistemasAgiles)
• Homo compilatis
– En linux es necesario el build-essential (se puede
descargar desde los repositorios de derivados de
Debian).
– En Solaris se puede compilar con gcc o con SunStudio.
No soporta readline. Se debe instalar gmake.
– En windows se puede compilar con Visual Studio (más
info en www.arpug.com.ar)
Homo paquetus
• Buscamos:
• Instalamos:
Homo compilatis
• Instalamos el build-essential (Debian*).
• Configuramos la instalación con
'configure'.
• Compilamos e instalamos con gmake.
• Copiar los scripts de arranque.
• Verificar si existe el usuario postgres o el
que será dueño del cluster.
• Inicializar el cluster.
• Arrancar el motor.
Script de arranque (derivados Linux)
Nivel de arranque
• Los directorios rc.d nos indican el orden de la
ejecución de los scripts de inicio.
• Aquí podemos configurar en que nivel arrancar el
gestor de datos.
• Para administrar esto, utilizar el script 'update-rc.d',
incorporado en las distros derivadas de Debian.
• Esta imagen nos indica que esta en todos los
niveles de init.
Estructura del cluster en el sistema de ficheros
• Aquí se encuentran:
–
–
–
–
–
Datos y bases.
WAL
Archivos de configuración
Logs
etc...
Dentro del data/
Oid2name es un contrib que permite
ver el nombre de acuerdo a los OID de
cada objeto.
Output pg_config
Script init
Habilitar conexiones remotas
• postgresql.conf
• listen_addresses (pueden estar separadas por coma o especificar
todas con '*')
• Port (recordar que debe estar habilitado desde el firewall)
• pg_hba.conf (mejora sustancial en 8.4)
– local
database user auth-method [auth-options]
– host
database user CIDR-address auth-method [auth-options]
– hostssl
database user CIDR-address auth-method [auth-options]
– hostnossl database user CIDR-address auth-method [auth-options]
– host
– hostssl
database user IP-address IP-mask auth-method [auth-options]
database user IP-address IP-mask auth-method [auth-options]
– hostnossl database user IP-address IP-mask auth-method [auth-options]
• pg_ident.conf
– Asigna alias para los usuarios.
Diferencias e/versiones
•
•
•
•
•
•
•
7.4
8.0
8.1.17
8.2.11
8.3.7
8.4.0
devel8.5
• Cada aprox. 6 meses
se completa el ciclo de
desarrollo.
• Los parches
constantemente se van
'comiteando'
• Las versiones de
segundo dígito
adhieren nuevas
prestaciones.
Herramientas
• Stack Builder: permite instalar
aditamentos para desarrollo, como
conectores desde lenguajes y drivers.
• PgAdmin: Administrador gráfico.
Localización
• Se puede crear el cluster con la opción
'initdb –locale=es_AR'
• LC_COLLATE, Orden de cadenas
• LC_CTYPE, Clasificación de caracteres.
• LC_MESSAGES, Lenguaje de mensajes
• LC_MONETARY, Formato de dinero
• LC_NUMERIC, Formato de numeros
• LC_TIME, Formato de fechas y timestamps
Notas sobre localización
• Afecta a:
– Ordenamiento en consultas que utilizan
ORDER BY o los operadores de consulta
tradicionales en textos.
– La utilización de usos de índices con la
cláusula LIKE.
– A las funciones upper, lower e initcap.
– A la familiar de funciones de to_char.
Set de caracteres
• Como se especifica?
– initdb -E UTF8
– createdb -E UTF8 -T template0 --lc-collate=es_AR.utf8
--lc-ctype=es_AR.UTF8 <nombrebase>
– CREATE DATABASE prueba WITH ENCODING 'UTF8'
LC_COLLATE='es_AR.utf8' LC_CTYPE='es_AR.utf8'
TEMPLATE=template0;
• Los más comunes que utilizaremos son:
– UTF8
– SQL-ASCII
– WIN1252
– LATIN1
Verificar las bases (1)
• Podemos verificar el encoding de nuestras
bases:
Verificar las bases (2)
• La salida del 8.4 es un poco más
completa:
Cambio de set
• \encoding de psql permite cambiar el
encoding client 'on the fly'.
• Existe un listado de conversión automática
de set de caracteres.
¿Como postgres promete ACID?
Soluciones para ACID
• [A]tomicidad (transacciones indivisibles)
• [C]onsistencia
• [I]solation ,aislamiento (no se pueden ver
entre transacciones)
• [D]urabilidad: éxito de una transaccion que
perdura.
Solución para [A]
• Sentencias de BEGIN, END, ROLLBACK,
COMMIT y SAVEPOINT.
Solución para [C]
• A partir de 7.*, gestor de integridad:
– not null
– check
– unique
– primary key
– fk -match full y partial
Solución para [I]
• MVCC
– Multi Versión Concurrency Control
• Impide el bloqueo de la tabla
Solución para [D]
• WAL (write Ahead Log) /var/pg_xlog
• Acelera los tiempos de commit y de insercion y
update.
• En caso de caída, las transacciónes cmprometidas
pero que no llegaron a la base, permanecen en la
WAL.
MVCC
EXPLAIN MVCC;
EXPLAIN ANALYZE MVCC;
Cada consulta ve unicamente las transacciones completadas antes
de comenzar.
Al comienzo de la consulta, Pgsql guarda:
• El contador de transacciones. (de ahi que es importante mantener
en estado con VACUUM FREEZE si tenemos un número muy alto
de transacciones, para resetearlo)
• Todos los identificadores que estan en proceso.
• En una transacción de multi-cláusulas, las previas transacciones
propias a la actual son visibles
• Se toma por defecto el nivel de read committed isolation level
EXPLAIN ANALYZE VERBOSE MVCC;
•
Las tuplas deben tener un
transaction id que:
– Es una transacción
comprometida.
– Es menor al contador de la
transacción almacenado al
comienzo de la consulta y...
– No estar en proceso al comienzo
de la consulta.
•
El transaction id de las tuplas visibles
expiran cuando:
– Esta en blanco o abortado
– Es mayor al contador y ..
– Estar en proceso al inicio de la
consulta
Búsqueda Secuencial
Contador de transacciones al
comienzo de la consulta: 100
Transacciones abiertas :
25,50,75
Por simplicidad, se asume
que el resto estan
comprometidas
Bibliografía
• wiki.postgresql.org
• Documentación 8.3.x y 8.4
• Presentación B. Momjian (Postgresql Internals throw
pictures)
• www.ibm.com
</Día 1>
Gracias!
Descargar