Servidor Postgresql em ramdrive
Publicado em 17 de abril de 2004
Arnaldo Luiz Estevão (porducel@bol.com.br) nos enviou:
Tive uma idéia que deu certo e esta dando um excelente resultado por isso resolvi compartilhar com a comunidade trata-se de um esquema para instalar um servidor postgresql em ramdrive.
Servidor Postgresql em ramdrive
por Arnaldo Luiz Estevão - porducel@bol.com.br
Tive uma idéia que deu certo e esta dando um excelente resultado por isso resolvi compartilhar com a comunidade trata-se de um esquema para instalar um servidor postgresql em ramdrive.
1 - O objetivo
Aumentar significativamente a performance do sistema sem comprometer a segurança.
2 - Os pacotes
Posgresql
3 - As delimitações
Este projeto foi feito pensando em unico banco de dados para mais de um banco de dados será necessário fazer adaptações.
4 - Garantias
NAO HA GARANTIAS !
5 - Risco
ALTO RISCO DE PERDA DE DADOS !
INDISPENSAVEL USO DE NO BREAK !
6 - Visão geral
Para o meu projeto utilizei a versão 7.4 do postgres
com Slackware 9.0 com kernel recompilado
O computador utilizado é um Atlon 1.8 com 1.5 GB de Ram com hd de 40G
Um no break de 1.2 KVA com sistema UPS
6.1 algoritimo básico
Ligar computador
Criar o ramdrive
Instalar o postgres no ramdrive
Restaurar o banco de dados do HD para o ramdrive
Iniciar um sistema altomatico de commit a cada x segundos + tempo da copia ( o meu sistema preve uma perda de 1 minuto de processamento em caso de falha) interceptar desligamento gravar copia no hd desligar
6.2 kernel
Pode ser necessario recompilar o kernel para habilitar o gerenciamento de grandes quantidades de memoria
6.3 Scripts
#--------------rc.M
/etc/rc.M # Arquivo executado quando slackware entra no runlevel 3
#!/bin/sh
echo "iniciando log do servidor"
syslogd
echo "configurando teclado"
loadkeys br-abnt2
echo "Definindo nome do servidor"
hostname postgres.servidor
echo "Configurando rede"
/sbin/ifconfig lo 127.0.0.1 >> /dev/null 2>&1
/sbin/ifconfig eth1 192.168.1.2 netmask 255.255.255.0 >> /dev/null 2>&1
#inicio da configuração do postmaster
echo "Ativando Postmaster"
echo "Inicializando Ram drive"
mount -t tmpfs ramdrive /mnt/ramdrive -o size=1000M # cria um ramdrive de 1GB na memoria ( o dobro do tamanho do meu banco de dados)
mkdir /mnt/ramdrive/pgdata # cria o diretorio de dados do postgres
chown -R postgres.root /mnt/ramdrive/pgdata # ajusta os direitos
chmod -R 7777 /mnt/ramdrive/pgdata
echo "inicializando Postgres"
rm -f /tmp/.*PGSQL* # não deixa o postmaster parar em caso de reinicio por falha
su postgres -c "/bin/initdb -D /mnt/ramdrive/pgdata -U root >> /var/log/postmaster.log 2>&1" # inicia o banco de dados padrao
su postgres -c "/bin/postmaster -D /mnt/ramdrive/pgdata >> /var/log/postmaster.log 2>&1 &" # ativa o postgres
sync
echo "Restaurando banco de dados" ;
sleep 10
/bin/createdb rotas
/bin/psql rotas -f /commit/copia.sql >> /var/log/postmaster.log 2>&1
echo "Ativando sistema de copia continuada"
/bin/commit >> /var/log/commit.log 2>&1 &
echo "Ativando httpd"
httpd
echo "Ativando sshd"
sshd
echo "Ativando inetd"
inetd
#/bin/rc.0 executado quando o computador é desligado ou reiniciado
#! /bin/sh
PATH=/sbin:/etc:/bin:/usr/bin
echo "desligando sistema de copia"
killall commit
echo "Copiando banco de dados"
/bin/pg_dump rotas > /commit/copia.sql
echo "Desligando postmaster"
killall postmaster
echo "Removendo ramdrive"
umount /mnt/ramdrive
echo "paralisando processos"
killall5 -15
sleep 5
killall5 -9
umount -a
if [ "$command" = "reboot" ]; then
echo "Rebooting."
reboot
else
poweroff
fi
#commit - Gravaçaõ continuada
#!/usr/bin/perl
print "Gravacao continuada\n";
while ( 1) {
sleep 60;
# espera 60 segundo para iniciar a proxima copia ( voce pode ajustar este tempo para até 6 neste caso o tempo
#total de processamento perdido em caso de falha equivale ao tempo que o computador levar para copiar o banco de dados da memoria
#para o hd + 10 segundos
#tempos menores não fazem sentido num sistema raiserfs porque o intervalo padrão do commit do raiser é de 5 segundos
# a menos que voce altere este parametro ou utilize um de um flush no disco, como nunca tive problemas com o reiser preferi não mexer nos
#valores padrão
# o sistema vai criar arquivos sequenciais num periodo de 24 horas iniciando em
# c0000.tmp.gz até c2359.tmp.gz
#dependendo de como o tempo for configurado podera haver buracos entre um e outro
#
($horario=`date +%d%m%y%H%M%S`) =~ s/\n//g;
$hora=substr($horario,6,2);
$minuto=substr($horario,8,2);
$segundo=substr($horario,10,2);
print "Hora: $hora Minuto:$minuto Segundo:$segundo\n";
$nomefile="c". substr($horario,6,4);
print "Copiando banco de dados\n";
$cmd="pg_dump rotas > /commit/$nomefile.tmp 2>&1";
$resultado = system($cmd);
if ( $resultado eq 0 ) {
print "renomeando arquivos \n";
# o arquivo copia.sql equivale a ultima copia valida por isso ele é movido de de $nomefile para
# copia.sql para evitar problemas de falhas durante a copia
#mesmo assim se houver um crash bem na hora do mov o
#copia.sql pode ficar inconsistente necessitando uma intervenção técnica
#que restaure o ultimo chhmm.tmp.gz valido para o copia.sql
#e depois
#dropdb rotas
#createdb rotas
#psql rotas -f copia.sql
`cp /commit/$nomefile.tmp /commit/copia.presql`;
`mv /commit/copia.presql /commit/copia.sql`;
print "compactando $nomefile.tmp\n";
`/usr/bin/gzip -f /commit/$nomefile.tmp`;
}
else { print "Erro $resultado no servidor PostgreSQL \n "; print `cat /commit/$nomefile.tmp`;}
print " Aguardando\n"; }
7 - Dicas e cuidados
É indispensável o uso de no-break para saber se o espaço em hd é suficiente multiplique o tamanho do seu ultimo chhmm.tmp.gz x 1440 por exemplo se o seu c1200.tmp.gz for igual a 1M voce precisara de pelo menos 1440M 1.G giga de espaco para o diretorio commit neste caso seria aconselhavel ter pelo menoz 3GB de espaço no disco eu tambem tenho no meu script original uma forma de copiar para um cdrw de hora em hora seria aconselhavel tambem instalar um no-break com ups para desligar automaticamente o servidor em caso de queda de energia eletrica
Com este sistema consegui abaixar tempos de query de mais 2 minutos para 12 segundos.
Se algum outro louco se aventurar e tiver sucesso ou alguma evolução da idéia por favor: mailto:porducel@bol.com.br
Autor: Arnaldo Luiz Estevão
Email: porducel@bol.com.br
Postado por fuji em abril 17, 2004 12:00 AM