domingo, 27 de junho de 2010

PostgreSQL na Memória RAM (In-Memory Database)

Recentemente (dia 24/06/2010) em seu blog, replicado no planet-postgresql, o Sr. Robert Haas postou o artigo denominado "PostgreSQL as an In-Memory Only Database".

Baseado em seu relato e no abordado na lista pgsql-performance montei este pequeno tutorial para exemplificar na prática o que foi discutido, ou seja, uma forma fácil e rápida de criar o seu próprio "PostgreSQL as an In-Memory Database".

Estou utilizando o Ubuntu 9.04 e PostgreSQL 8.3 para executar as atividades:

1) Montando partição em memória com tmpfs:

$ sudo -s

$ mkdir /mnt/in_memory


$ mount -t tmpfs -o size=2G,nr_inodes=8k,mode=0700 tmpfs /mnt/in_memory/



2) Criando cluster na partição criada:

$ chown -R postgres. /mnt/in_memory/


$ su - postgres -c "/usr/lib/postgresql/8.3/bin/initdb -D /mnt/in_memory"



3) Ajustando configurações do cluster (conforme recomendações do artigo citado):

$ vim /mnt/in_memory/postgresql.conf


fsync=off

synchronous_commit=off

full_page_writes=off

bgwriter_lru_maxpages=0


Obs: caso vc já tenha algum processo do PostgreSQL executando na mesma máquina desse teste então vc deve verificar se não será necessário modificar também a variável "port" do postgresql.conf, pois o padrão é 5432.


4) Iniciando processo servidor:

$ su - postgres -c "/usr/lib/postgresql/8.3/bin/pg_ctl -D /mnt/in_memory -l /mnt/in_memory/postgres.log start"



5) Verificando se o cluster está funcionando:

$ ps ax | grep post

19614 pts/3 S 0:00 /usr/lib/postgresql/8.3/bin/postgres -D /mnt/in_memory

19653 ? Ss 0:00 postgres: writer process

19654 ? Ss 0:00 postgres: wal writer process
19655 ? Ss 0:00 postgres: autovacuum launcher process
19656 ? Ss 0:00 postgres: stats collector process

$ /usr/lib/postgresql/8.3/bin/psql -U postgres -p 5437 -l
Lista dos bancos de dados

Nome | Dono | Codificação

-----------+----------+-------------

postgres | postgres | UTF8

template0 | postgres | UTF8

template1 | postgres | UTF8

(3 registros)


Acredito que neste ponto você já esteja com o seu PostgreSQL na memória pronto e funcional.

Lembre-se que o mesmo está "literalmente" na memória RAM, portanto ao desligar o micro o seu cluster inteiro será perdido, por isso o seu uso fica limitado como um Cache ao invés do uso do memcached ou alternativas NoSQL, porém com todos recursos disponíveis no PostgreSQL.


Por favor reportem problemas com esse mini-tutorial e/ou críticas e sugestões.


Cordialmente,

Fabrízio de Royes Mello
fabriziomello [at] gmail.com