Este artigo explica como configurar (e monitorar) um Cluster PostgreSQL Ativo/Passivo, usando Pacemaker, Corosync e DRBD. Escrito por Rafael Marangoni, do time de Servidor Linux da
BRLink.
Precisaremos iniciar o serviço do DRBD em ambos os nós, para criar a configuração inicial do Postgres:
# /etc/init.d/drbd start
Como foi feito anteriormente, o node1 será o primário. Para checar, no node1 execute:
# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by mockbuild@builder10.centos.org, 2010-06-04 08:04:09
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----
ns:8388316 nr:0 dw:0 dr:8388316 al:0 bm:512 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
A informação "Primary/Secondary" indica que o servidor local (onde executamos o comando) é o primário e o outro servidor é o secundário.
A informação "UpToDate/UpToDate", indica que o recursos está sincronizado entre os nós.
Vamos formatar o dispositivo DRBD, somente no node1:
# mkfs.ext3 /dev/drbd0
Agora conseguiremos montar o dispositivo. O ponto de montagem que utilizaremos será a pasta padrão do PostgreSQL (nos sistemas baseados em RedHat). Somente no node1:
# mount -t ext3 /dev/drbd0 /var/lib/pgsql
Somente no node1, mudar o proprietário do diretório montado (/var/lib/pgsql):
# chown postgres.postgres /var/lib/pgsql
Somente no node1, vamos iniciar a base do postgresql:
# su - postgres
$ initdb /var/lib/pgsql/data
$ exit
Eu prefiro habilitar trusted authentication em ambos os IPs dos nós e do Cluster.
Somente no node1:
# echo "host all all 10.0.0.191/32 trust" >> /var/lib/pgsql/data/pg_hba.conf
# echo "host all all 10.0.0.192/32 trust" >> /var/lib/pgsql/data/pg_hba.conf
# echo "host all all 10.0.0.190/32 trust" >> /var/lib/pgsql/data/pg_hba.conf
Outra configuração importante é configurar o PostgreSQL para ouvir em todas as interfaces.
Somente no node1:
# vi /var/lib/pgsql/data/postgresql.conf
Descomentar e mudar somente a seguinte linha:
listen_addresses = '0.0.0.0'
Agora podemos iniciar o postgres, somente no node1:
# /etc/init.d/postgresql start
Vamos criar um usuário para administrar o postgres, com senha. Somente no node1:
# su - postgres
$ createuser --superuser admpgsql --pwprompt
Setar uma senha para o usuário admpgsql.
Vamos criar uma base de testes e populá-la com o pgbench, somente no node1:
# su - postgres
$ createdb pgbench
$ pgbench -i pgbench
O PGBench popula a base com algumas informações, apenas para testar o PostgreSQL:
pgbench -i pgbench
NOTA: tabela "pgbench_branches" não existe, ignorando
NOTA: tabela "pgbench_tellers" não existe, ignorando
NOTA: tabela "pgbench_accounts" não existe, ignorando
NOTA: tabela "pgbench_history" não existe, ignorando
creating tables...
10000 tuples done.
20000 tuples done.
30000 tuples done.
40000 tuples done.
50000 tuples done.
60000 tuples done.
70000 tuples done.
80000 tuples done.
90000 tuples done.
100000 tuples done.
set primary key...
NOTA: ALTER TABLE / ADD PRIMARY KEY criará Ãndice implÃcito "pgbench_branches_pkey" na tabela "pgbench_branches"
NOTA: ALTER TABLE / ADD PRIMARY KEY criará Ãndice implÃcito "pgbench_tellers_pkey" na tabela "pgbench_tellers"
NOTA: ALTER TABLE / ADD PRIMARY KEY criará Ãndice implÃcito "pgbench_accounts_pkey" na tabela "pgbench_accounts"
vacuum...done.
Agora poderemos acessar a base e checar se está tudo certo, somente no node1:
# psql -U admpgsql -d pgbench
pgbench=#
select * from pgbench_tellers;
tid | bid | tbalance | filler
-----+-----+----------+--------
1 | 1 | 0 |
2 | 1 | 0 |
3 | 1 | 0 |
4 | 1 | 0 |
5 | 1 | 0 |
6 | 1 | 0 |
7 | 1 | 0 |
8 | 1 | 0 |
9 | 1 | 0 |
10 | 1 | 0 |
(10 registros)
Depois disso, a configuração do postgres estará concluída.
Antes de iniciar a configuração do Pacemaker, vamos checar se o postgres rodará no node2, para evitarmos problemas futuros.
node1:
Em primeiro lugar, no node1 vamos parar o postgresql:
# /etc/init.d/postgresql stop
Desmontando o dispositivo DRBD:
# umount /dev/drbd0
Colocando o DRBD como secundário:
# drbdadm secondary postgres
node2:
Agora, no node2, vamos colocá-lo como primário para acesso ao recurso DRBD:
# drbdadm primary postgres
Montando o dispositivo:
# mount -t ext3 /dev/drbd0 /var/lib/pgsql/
E agora iniciando o postgres:
# /etc/init.d/postgresql start
Checando se nós conseguimos, através do node2, acessar o banco pgbench que foi populado pelo node1:
# psql -U admpgsql -d pgbench
pgbench=#
select * from pgbench_tellers;
tid | bid | tbalance | filler
-----+-----+----------+--------
1 | 1 | 0 |
2 | 1 | 0 |
3 | 1 | 0 |
4 | 1 | 0 |
5 | 1 | 0 |
6 | 1 | 0 |
7 | 1 | 0 |
8 | 1 | 0 |
9 | 1 | 0 |
10 | 1 | 0 |
(10 registros)
O retorno do select é a garantia do sucesso. Podemos então iniciar as configurações do Cluster.
Antes disso, precisamos parar os serviços postgresql e DRBD, e desativá-los da inicialização.
node2:
# /etc/init.d/postgresql stop
# umount /dev/drbd0
# drbdadm secondary postgres
# /etc/init.d/drbd stop
node1:
# drbdadm primary postgres
# /etc/init.d/drbd stop
Em ambos os nós, executar:
# chkconfig --level 35 drbd off
# chkconfig --level 35 postgresql off