sábado, 23 de abril de 2011

PostgreSQL - Migrando bases de ISO8859-1 para UTF8

Este post é dedicado aos que precisam migrar uma base de um encode para outro, vamos usar o exemplo aqui de UTF8 para ISO-8859-1.

Então vamos lá, imagine que você tenha um dump da database que precisa migrar.

Vou considerar que você já tenha feito os pontos abaixo:

1 - Backup de tudo
2 - O dump já feito e a database que deve ser migrada já foi "dropada".

O grande segredo é o comando 'iconv' do Linux, então vamos usá-lo para converter seu dump:

iconv -f utf-8 -f iso-8859-1 teu_dump_uft8.sql > teu_dump_iso88591.sql

Neste passo já pode utilizar o pipe e psql para já importar o dump sem gerá-lo se não tiver espaço em disco.

MAS, não esqueça de trocar o encode do client, com o seguinte comando:

sed "s/SET client_encoding = 'UTF8';/SET client_encoding = 'LATIN1';/g" teu_dump_iso88591.sql  > teu_dump_iso88591-new.sql

Feito isso vamos importar o tal do dump convertido: psql -U postgres teu_banco < teu_dump_iso88591-new.sql

Pronto, agora só não funcionará se tiver nesta database o uso da function  'TO_ASCII', se você precisar utilizar essa função siga as instruções deste blog:

>  http://arezi.wordpress.com/2008/04/09/postgresql-funcao-to_ascii-em-banco-utf-8/

quarta-feira, 13 de abril de 2011

PostgreSQL - Configurando um HotStandby no 9

   Semelhante ao Warm-Stanby, post elaborado anteriormente para o PostgreSQL 8.4, o HotStandby também tem a finalidade de redundância entre instâncias, a diferença do Warn para o Hot é que o escravo do Hot aceita conexões, e pode ser utilizado para leitura.

   Descrição do que foi utilizado no teste:

Sistema Operacional: RedHat Enterprise Linux 5 update 6 x86-64
Banco de dados: PostgreSQL 9.0.3

Repositórios utilizados:

pgdg-90-centos.repo
nativo RHEL 5

Pacotes instalados:

postgresql90-test postgresql90-server postgresql90-libs postgresql90-docs postgresql90-devel postgresql90-contrib postgresql90

Ambiente: Ambas as instâncias serão executadas na mesma máquina em portas e diretórios 'data' distintos.

Ajuste de 'service':

1 - Copiar o /etc/init.d/postgresql-9.0 para 'postgresql-9.0-II' e adicionar o no boot:

# cp /etc/init.d/postgresql-9.0 /etc/init.d/postgresql-9.0-II
# chkconfig --add postgresql-9.0-II
# chkconfig --level 345 postgresql-9.0-II on

2 - Ajustar os parâmetros do service 'postgresql-9.0-II':

PGPORT=5433
PGDATA=/var/lib/pgsql/${PGMAJORVERSION}/data2
PGLOG=/var/lib/pgsql/${PGMAJORVERSION}/pgstartup2.log

3 - Configurar parâmetros do 'postgresql.conf' do 'postgresql-9.0':

listen_addresses = '*'
port = 5432
max_connections = 100
shared_buffers = 32MB
wal_level = hot_standby
archive_mode = on
archive_command = 'rsync -a %p /data/archive_log/%f'
archive_timeout = 60
max_wal_senders = 5
log_destination = 'stderr'
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%a.log'
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 0
datestyle = 'iso, mdy'
lc_messages = 'en_US.UTF-8'
lc_monetary = 'en_US.UTF-8'
lc_numeric = 'en_US.UTF-8'
lc_time = 'en_US.UTF-8'
default_text_search_config = 'pg_catalog.english'

4 - Criar a instância e subir a master(postgresql-9.0):

# service postgresql-9.0 initdb
# service postgresql-9.0 start

5 - Ajuste o pg_hba do master e adicione as seguintes linhas:


host    replication     all              ::1/128                trust
host    replication     all              127.0.0.1/32           trust

IMPORTANTE: Adicione ainda que a conexão via loopback seja 'trust'.


6 - Com o usuário 'postgres' acesse a database 'postgres' e execute o SQL abaixo:

# psql -U postgres -p 5432 -c "SELECT pg_start_backup('backup');" postgres

7 - Copie o diretório 'data' do master para 'data2' que será o slave:

# rsync -arvtog /var/lib/pgsql/9.0/data /var/lib/pgsql/9.0/data2

8 - Apague os logs de transação, pid da pasta migrada:

# rm /var/lib/pgsql/9.0/data2/postmaster.pid
# rm -f /var/lib/pgsql/9.0/data2/pg_xlog/*

9 - Ajuste de configuração do arquivo 'postgresql.conf' no slave:


listen_addresses = '*'
port = 5433
max_connections = 100
shared_buffers = 32MB
wal_level = minimal
archive_mode = off
max_wal_senders = 0
hot_standby = on
log_destination = 'stderr'
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%a.log'
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 0
datestyle = 'iso, mdy'
lc_messages = 'en_US.UTF-8'
lc_monetary = 'en_US.UTF-8'
lc_numeric = 'en_US.UTF-8'
lc_time = 'en_US.UTF-8'
default_text_search_config = 'pg_catalog.english'


10 - Criar o arquivo '/var/lib/pgsql/9.0/data2/recovery.conf'


restore_command = 'rsync -a /data/archive_log/%f %p'
standby_mode = 'on'
primary_conninfo = 'host=localhost port=5432'
trigger_file = '/tmp/trigger.pgsql.5432'


11 - Com o usuário 'postgres' acesse a database 'postgres' e execute o SQL abaixo:

# psql -U postgres -p 5432 -c "SELECT pg_stop_backup();" postgres

12 - Inicie a instância slave:

# service postgresql-9.0-II start

13 - Verifique se através dos logs do postmaster da instância slave se a replicação está ocorrendo.  

Importante: Não esqueça que desta forma o master está replicando os logs de transações para o slave, mas em caso de queda do master o slave não assume, isso deve ser gerenciado por script no crontab ou por um heartbeat.





segunda-feira, 4 de abril de 2011

JBoss - Usando o 'twiddle' para monitorar o JBossAS

O 'twiddle' é um agente que faz uma checagem via RMI nas instâncias. Sua localização é '$JBOSS_HOME/bin/twiddle.sh' para ambientes Unix/Linux.

Testando o 'twiddle': 

$JBOSS_HOME/bin/twiddle.sh -s jnp://seu_IP:jnp_port -u user -p password get "jboss.system:type=ServerInfo"

O retorno deve ser algo como:

ActiveThreadCount=157
AvailableProcessors=2
OSArch=amd64
MaxMemory=259522560
HostAddress=127.0.0.1
JavaVersion=1.6.0_24
OSVersion=2.6.18-194.el5
JavaVendor=Sun Microsystems Inc.
TotalMemory=259522560
ActiveThreadGroupCount=15
OSName=Linux
FreeMemory=34479320
HostName=jboss.test.com.br
JavaVMVersion=19.1-b02
JavaVMVendor=Sun Microsystems Inc.
JavaVMName=Java HotSpot(TM) 64-Bit Server VM

Caso seu JMX não seja autenticado não são necessários os parâmetros '-u' e '-p'. Lembre-se de ajustar o IP para o que você faz bind e a porta para a JNP da sua instância, por padrão a porta é 1099. 

Agora podes utilizar o Nagios, Zabbix, entre outros para monitorar utilizando o 'twiddle', ainda que via JMX seja mais elegante. Vamos a três itens de exemplo:


Memória livre: 
$JBOSS_HOME/bin/twiddle.sh -s jnp://seu_IP:jnp_port -u user -p password get "jboss.system:type=ServerInfo"  FreeMemory 

Threads ativas:
$JBOSS_HOME/bin/twiddle.sh -s jnp://seu_IP:jnp_port -u user -p password get "jboss.system:type=ServerInfo"  ActiveThreadCount

Conexões disponíveis no pool do defaultDS:
$JBOSS_HOME/bin/twiddle.sh -s jnp://seu_IP:jnp_port -u user -p password get "jboss.jca:name=DefaultDS,service=ManagedConnectionPool" AvailableConnectionCount