Download Plantilla 2007

Document related concepts
no text concepts found
Transcript
Consorcio SIU
Implementación de Tablespaces en Memoria (Sistemas
GNU/Linux - PostgreSQL).
Tablespaces en RAM (Linux)
mkdir /mnt/ram0
mount /dev/ram0 /mnt/ram0
Últimamente se manejó mucho el termino
mkdir /mnt/ram0/pgspace
de '''Bases de Datos en Memoria'''. Si bien
chown
postgres:postgres
existen versiones de Postgres que tienen esta /mnt/ram0/pgspace
forma de trabajo (FastDb es una de ellas),
puede resultar interesante ''jugar'' con un
Con esto anterior formateamos un espacio
pequeño servidor que tengamos para pruebas.
en RAM y lo montamos en un directorio de la
tabla de particiones. Cabe destacar que la
En este pequeño artículo mostraremos herramienta que utilizamos aca es para
como hacerlo de manera básica y práctica, junto formatear con el ext2. Podría, depende la
con algunos resultados. Cabe destacar que las situación, utilizar otra partición.
pruebas fueron realizadas sobre una maquina
virtual, por lo que pueden variar mucho en otros
Ahora nos queda por trabajar con la base
ambientes más dedicados.
de datos:
En general, este tipo de establecimientos
ubuntu=#
CREATE
TABLESPACE
(generalmente) se han dado en servidores ram_space LOCATION '/mnt/ram0/pgspace';
OLAP ya que requieren una buena capacidad
CREATE TABLESPACE
de procesamiento. Además, por lo general, son
ubuntu=# create table test_ram (i integer,
servidores separados del cluster de datos, por lo name text) tablespace ram_space;
que se los utiliza como servidores esclavos de
CREATE TABLE
una replicación y cuyos datos son sencillamente
ubuntu=# create temp table test_ram_temp
recuperables en caso de un abrupto apagado.
(i integer, name text) tablespace ram_space;
CREATE TABLE
Esta técnica permitiría de alguna manera,
ubuntu=# create temp table test_disk_temp
ocupar ese espacio con objetos como tablas (i integer, name text);
temporales, vistas materializadas, etc.
CREATE TABLE
ubuntu=# create table test_disk (i integer,
Primero, para facilitarnos las cosas, name text);
debemos enviar una parámetro al kernel, del
CREATE TABLE
tamaño de los discos en memoria. En este caso
los estamos estableciendo en 4 GB, pero
quizás, para hacer más ameno el manejo, nos
Hicimos un Tablespace en ese directorio y
gustaría armarlos de menos (2 o 1 GB):
luego creamos 2 tipos de tablas en 2
ubicaciones combinables: Temporales-Estándar
kernel
/vmlinuz-2.6.28-13-server y En Ram-En disco.
root=UUID=5ac65858-cdf5-4c26-8557220563f52901
ro
quiet
splash
ramdisk_size=4194304
Veamos los resultados parciales:
Si queremos esto permanente, podríamos
ubuntu=# explain analyze insert into
tocar el sysctl.conf:
test_ram
values
(generate_series(1,1000000),random()::text);
kernel.ramdisk_size=4194304
QUERY PLAN
--------------------------------------------------------Desde el shell, al inicio del sistema -----------------------------------operativo:
Result (cost=0.00..0.02 rows=1 width=0)
(actual time=0.019..9354.014 rows=1000000
mke2fs /dev/ram0
loops=1)
SIU
PÁGINA 1 DE 4
Consorcio SIU
Total runtime: 22836.532 ms
(2 rows)
Tabla temporal en disco: 13716.049
Puede resultar que en tu máquina, los
resultados sean distintos. En este caso lo hice
ubuntu=# explain analyze insert into con una máquina virtual (VBox) con un PGLive
test_ram_temp
values (Pgsql 8.3.5).
(generate_series(1,1000000),random()::text);
QUERY PLAN
---------------------------------------------------------Ideas
----------------------------------Result (cost=0.00..0.02 rows=1 width=0)
A prima facie, vemos que varia en el
(actual time=0.025..7507.349 rows=1000000 manejo de tipo de tabla (más allá de donde esté
loops=1)
alojada). Esto puede ser algo determinante a la
Total runtime: 12773.371 ms
hora de elegir.
(2 rows)
Quizás se puede combinar con una ''Vista
Materializada'' en memoria y de tipo temporal.
ubuntu=# explain analyze insert into
test_disk
values
Otra cosa a tener en cuenta es que
(generate_series(1,1000000),random()::text);
recuerden que cuando inicie el sistema
QUERY PLAN
operativo, borrará el contenido del tablespace,
---------------------------------------------------------- por lo que esta técnica solo serviría si usáramos
----------------------------------tablas ''temporales''.Inclusive si tuviésemos una
Result (cost=0.00..0.02 rows=1 width=0) actualización desde estas a las del disco, este
(actual time=0.025..7948.205 rows=1000000 sistema de trabajo es inconsistente, por lo que
loops=1)
siempre es conveniente grabar en disco y luego
Total runtime: 16902.042 ms
actualizar en memoria.
(2 rows)
Ideas 2
ubuntu=# explain analyze insert into
test_disk_temp
values
Pero, existe algo que proponen en
(generate_series(1,1000000),random()::text);
http://www.linux.com/feature/142658.
Y
es
QUERY PLAN
utilizar un SSD para almacenar los índices.
-------------------------------------------------------------------------------------------Esto es mucho más coherente y no es
Result (cost=0.00..0.02 rows=1 width=0) nada nuevo, ya que siempre se acostumbra a
(actual time=0.018..8135.287 rows=1000000 utilizar los medios más rápidos para almacenar
loops=1)
los índices. Además, en el caso de este artículo,
Total runtime: 13716.049 ms
si hay un corte abrupto del suministro o caída
(2 rows)
del servidor, lo único que deberíamos hacer es
reindizar.
Lo que hicimos fue, un insert con serie
sumado a la generación de un numero aleatorio
‘casteándolo’ a texto. En estas pequeñas
pruebas insertamos 1.000.000 de registros (lo
cual no es poco!).
Veamos el resumen:
Tabla estándar en ram: 22836.532
Tabla estándar en disco: 16902.042
En el caso del artículo referenciado, este
propone utilizar XFS para almacenar los
índices. En mi opinión se debería usar el
sistema de ficheros más liviano que nuestro
sistema operativo soporte, ya que buscamos
velocidad y no ''seguridad''.
Podemos crear índices en memoria (on en
un Pen o un SSD) así:
create index indice_ on tabla_ ( i )
tablespace ram_space;
Tabla temporal en ram: 12773.371
SIU
PÁGINA 2 DE 4
Consorcio SIU
Implementación de Tablespaces en Memoria (Sistemas
GNU/Linux - PostgreSQL).
Ideas 3
Otras de las ideas es, utilizar un Pen Drive
para almacenar la WAL. Esto se puede hacer
relativamente sencillo, creando un link simbólico
llamado pg_xlog que apunte al dispositivo en
cuestión (dentro del PGDATA encontraremos
este directorio). Copien el contenido del pg_xlog
original en el Pen Drive (o muevan), crean el link
y listo.
La idea es muy similar a los tablespaces en
memoria pero con la gran diferencia de que
hacerlo con la WAL es peligroso. Una
corrupción en la WAL podría generar varios
dolores de cabeza, por lo que una caída del
servidor nos dejaría sin WAL!! (a menos que
tengamos un backup sincronizado).
Para solventar la inestabilidad que puede
ocasionarse en un Pen Drive (ya sea porque
son más frágiles o por cualquier cosa que pueda
cooperar a perder la WAL), es sincronizar el
contenido del Pendrive en otro disco. De esa
manera el servidor Postgres escribirá sobre el
Pendrive pero el sistema operativo realizará un
Backup del contenido.
Para la WAL necesitamos como mínimo un
sistema de ficheros con log (ext3) por ejemplo.
Ideas 4
SIU
PÁGINA 3 DE 4