>_Cluster de alta disponibilidade para Postgresql – Centos 6

Este Tutorial tem como objetivo descrever os passos para a configuração do Cluster de Alta Disponibilidade para o Banco de Dados PostgreSQL. Toda a configuração será realizada na plataforma Linux com o Sistema Operacional CentdOS 6 x64. Serão 3 Servidores, sendo 1(um) servindo como armazenamento(Storage), e outros 2(dois) como Nodes integrantes do Cluster.

Softwares que serão utilizados

Corosync → Faz parte da nova geração de ferramentas da alta disponibilidade para Linux. Podemos chamar isso tudo de heartbeat 3.

Pacemaker → Gerenciador de cluster CRM. Console para configurar o corosync e integra-lo aos outros serviços

Desenho 1.1

Storage

É um hardware que contém slots para vários discos, ligado aos servidores através de ISCSI ou fibra ótica. O storage é uma peça altamente redundante e cumpre com louvor a sua missão, que é armazenar os dados da sua empresa com segurança.

Ponto único de falha

Além de ser um ponto muito seguro por ter redundância dos discos e de outros periféricos, é importante lembrar que neste cenário o Storage e o Switch serão pontos únicos de falhas, por serem únicos neste Tutorial.
Existe configurações bem mais complexas chegando utilizar até multipath, porém não será abordada neste tutorial.

Desenho 1.2

Como o foco desse tutorial não irá abordar a segurança ente os nodes e o mundo externo, todo e qualquer tipo de segurança serão desabilitados.

Passo 1 → Desabilitando as configurações de segurança. Desabilite o Firewall

# system-config-firewall-tui

Desabilite o Selinux

# vim /etc/selinux/config
LINHA 7 - SELINUX=disabled

Desabilite o iptalbes da inicialização

# chkconfig iptables off
# chkconfig ip6tables off

Configuração do compartilhamento

A configuração dos discos não será abordadas neste tutorial. O disco que será agrupado ao cluster será o /dev/sdb com o tamanho de 1TB. Geralmente em servidores Storages os discos já se encontram configurados como RAID.

No servidor Storage deste exemplo foram adicionados dois discos Sata, sendo 1(um) para o sistema operacional (/dev/sda) e outro para o compartilhamento (/dev/sdb).

Configurando o Bonding Alta Disponibilidade das interfaces de rede física

Desenho 1.3

Passo 1 → Configurando o Bonding Neste passo, vamos carregar o módulo bonding.

# modprobe bonding

Passo 2 → Configurando o Arquivo /etc/modprobe.conf O Arquivo modprobe.conf é o responsável por carregar os módulos na inicialização do Sistema Operacional. Adicione as linhas abaixo dentro do arquivo.

# vim /etc/modprobe.d/bonding.conf
alias bond0 bonding
options bond0 miimon=100 updelay=200 downdelay=200

ou

# vim /etc/rc.local
alias bond0 bonding
options bond0 miimon=100 updelay=200 downdelay=200

mode=0 (padrão) Fará um RoundRobin dos pacotes transmitidos sequencialmente em todas as placas de rede que pertencem ao grupo, a partir do primeiro para o último dispositivo.

Passo 3 → Configurando as interfaces de rede.

# cd /etc/sysconfig/network-scripts/

Rede Local através do DHCP

# vim ifcfg-eth0
DEVICE=eth0
BOOTPROTO=dhcp
HWADDR=08:00:27:4E:0D:FD
ONBOOT=yes
DHCP_HOSTNAME=centos-node1

Rede Privada através do Bonding

# vim ifcfg-eth1
DEVICE=eth1
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
ONBOOT=yes

Rede Privada através do Bonding

# vim ifcfg-eth2
DEVICE=eth2
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
ONBOOT=yes

Rede Privada Bonding

# vim ifcfg-bond0
DEVICE="bond0"
BOOTPROTO="static"
IPADDR="172.168.1.3"
NETMASK="255.255.255.248"
ONBOOT="yes"

Passo 4 – Ative o ifenslave nas interfaces de rede que estão sobre controle do bonding.

# ifconfig bond0 192.168.1.166 netmask 255.255.255.0
# ifenslave -v bond0 eth1 eth2

Passo 5 → Reinicie o Servidor Storage.

# init 6

Passo 6 → Verfique se Bonding está funcionando corretamente.

# cat /proc/net/bonding/bond0

Instalando o pacote scsi-target-utils Pacote necessário para o compartilhamento do disco iscsi

Passo 7 → Instalação do pacote iscsi.

# yum install scsi-target-utils -y

Passo 7 → Configuração do arquivo /etc/tgt/targets.conf Neste arquivo vamos definir qual será o disco que iremos compartilhar e quais clientes poderão acessá-lo.

# vim /etc/tgt/targets.conf

    # Qual o dispositivo local está sendo compartilhado
	backing-store /dev/sdb
    # Controle de acesso - somente este ip pode mapear os volumes exportados
    	initiator-address 172.168.1.1
    	initiator-address 172.168.1.2

Passo 8 – Inicie o serviço tgtd e configure-o para inicialização automática:

# service tgtd start

Passo 9 – Deixei ativo no reboot do Sistema Operacional.

# chkconfig tgtd on

Passo 10 – Verifique no servidor de o compartilhamento iscsi está ativo e disponível.

# tgtadm --lld iscsi --op show --mode target

Pronto. O servidor iscsi (mais conhecido como iscsi target) está no ar e compartilhando o primeiro volume de 1TB.

Desenho 1.4

 

 

 

Configurando os Servidores(nodes 1 e 2)

A configuração dos nodes requer um pouco mais de conhecimento, ela abrange desde uma configuração simples a uma configuração avançada. Este tutorial não entrará em méritos de uma implementação avançada. Nesta etapa o Storage já está configurado e esperando que os nodes façam o mapeamento do disco /dev/sdb.

Desenho 2.1

 

Configurando a resolução de nomes

Passo 1 → Configure o arquivos /etc/hosts em ambos Servidores(Nodes) para a resolução de nomes.

# vim /etc/hosts
172.168.1.1     node1.tgl.com
172.168.1.2     node2.tgl.com
172.168.1.3     storage.tgl.com

Desabilitando alguns serviços

Passo 2 → Desabilite o Firewall em ambos Servidores(nodes).

# system-config-firewall-tui

Passo 3 → Desabilite o Selinux em ambos Servidores(nodes).

# vim /etc/selinux/config
LINHA 7 - SELINUX=disabled

Passo 4 → Desabilite o iptables da inicialização em ambos Servidores(nodes).

# chkconfig iptables off
# chkconfig ip6tables off

Instalação dos softwares de gerenciamento do cluster

Passo 5 → Instale os pacotes abaixo em ambos Servidores(nodes).

# yum update -y ; yum install python-devel gcc iscsi-initiator-utils  vim screen pacemaker -y

Mapeando o compartilhamento (iscsi)

Passo 6 → Verifique em ambos Servidores(nodes), se o compartilhamento do iscsi esta ativo OBS: Este comando solicita uma lista de volumes exportados pelo servidor via protocolo iscsi.

# iscsiadm -m discovery -t sendtargets -p 172.168.1.3
Iniciando o iscsid:                                        [  OK  ]
172.168.1.3:3260,1 iqn.2012-09.com.tgl.storage:armazenamento.disco1.1TB

Passo 7 → Em ambos Servidores(nodes) faça o login Storage via iscsi OBS: O Login significa estabelecer uma conexão com o storage e mapear os dispositivos exportados, como se fossem discos locais.

#  iscsiadm -m node -T iqn.2012-09.com.tgl.storage:armazenamento.disco1.1TB -p 172.168.1.3 -l
Logging in to [iface: default, target: iqn.2012-09.com.tgl.storage:armazenamento.disco1.1TB, portal: 172.168.1.3,3260] (multiple)
Login to [iface: default, target: iqn.2012-09.com.tgl.storage:armazenamento.disco1.1TB, portal: 172.168.1.3,3260] successful.

 

Desenho 2.2

Passo 8 → Em ambos Servidores(nodes), verifique se foi mapeado o um novo disco, provavelmente /dev/sdb/.

# fdisk -l

Passo 9 → Configure em ambos Servidores(nodes) o arquivo /etc/iscsi/initiatorname.iscsi. Este arquivo tem como objetivo levantar o mapeamento no momento da inicialização do Sistema Operacional.

# vim /etc/iscsi/initiatorname.iscsi
iqn.2012-09.com.tgl.storage:armazenamento.disco1.1TB

Configurando o Compartilhamento

Passo 10 → Verifique o mapeamento do disco em ambos Servidores(nodes).

[root@node1 ~]# fdisk -l /dev/sdb1

Disk /dev/sdb1: 1000.2 GB, 1000204853760 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cilindros of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
[root@node2 ~]# fdisk -l /dev/sdb1

Disk /dev/sdb1: 1000.2 GB, 1000204853760 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cilindros of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Definindo o sistema de arquivos para o Volume Lógico (ARMAZENAMENTO)

Passo 11 → Node1, execute o comando “mkfs.ext4” para definir o sistema de arquivos.

[root@node1 ~]# mkfs.ext4 /dev/sdb1

Passo 12 → Em ambos Servidores(nodes), será preciso criar os diretórios /var/lib/pgsql.

[root@node1 ~]# mkdir -p /var/lib/pgsql
[root@node2 ~]# mkdir -p /var/lib/pgsql

Passo 13 → Em ambos Servidores(nodes), será necessário alterar o arquivo /etc/fstab adicionando a linha abaixo.

/dev/sdb1               /var/lib/pgsql/                         ext4    defaults        0 0
[root@node1 ~]# vim /etc/fstab
/dev/sdb1               /var/lib/pgsql/                         ext4    defaults        0 0
[root@node2 ~]# vim /etc/fstab
/dev/sdb1               /var/lib/pgsql/                         ext4    defaults        0 0

Passo 14 → Reinicie os Servidores(nodes)

# init 6

Configurando o PostgreSQL

Passo 15 → Em ambos Servidores(nodes) instale o PostgreSQL.

# yum groupinstall "PostgreSQL Database Server" -y
# chown -R postgres.postgres /var/lib/pgsql

Passo 16 → Node1, faça as primeiras configurações do PostgreSQL.

[root@node1 ~]# su – postgres
-bash-4.1$ initdb -D /var/lib/pgsql/data/ &
-bash-4.1$ exit
[root@node1 ~]# /etc/init.d/postgresql restart

Configurando o Corosync

Passo 17 → No Servidor(Node) node1.tgl.com, faça a configuração do arquivo corosync.conf. Este arquivo deverá ser configurado em ambos Servidores(Nodes).

Lembrando que a classe da rede que estou utilizando para checar através do Heartbeat é de 172.168.1.0/29.

[root@node1 ~]# vim /etc/corosync/corosync.conf
# Please read the corosync.conf.5 manual page
compatibility: whitetank

totem {
        version: 2
        secauth: off
        threads: 0
        interface {
                ringnumber: 0
                bindnetaddr: 172.168.1.0
                mcastaddr: 226.94.1.1
                mcastport: 5405
                ttl: 1
        }
}

logging {
        fileline: off
        to_stderr: yes
        to_logfile: yes
        to_syslog: yes
        logfile: /var/log/cluster/corosync.log
        debug: off
        timestamp: on
        logger_subsys {
                subsys: AMF
                debug: off
        }
}

amf {
        mode: disabled
}

aisexec {
        user: root
        group: root
}
service {
# Load the Pacemaker Cluster Resource Manager
        name: pacemaker
        ver: 0
}

Passo 18 → Transferindo o arquivo corosync.conf do servidor node1.tgl.com para o servidor node2.tgl.com.

# scp /etc/corosync/* node2:/etc/corosync/

Passo 19 → Em ambos Servidores(Nodes), será necessário criar o diretório de log /var/log/cluster/.

# mkdir /var/log/cluster/

Passo 20 → Inicie o serviço em ambos Servidores(Nodes)

# /etc/init.d/corosync start

Passo 21 → Em ambos os Servidores(Nodes), executar o comando abaixo para para checar status do Cluster

# crm_mon -1

Ativando serviço na inicialização Em ambos Servidores(Nodes)

# chkconfig --level 35 corosync on

Obs.: No Cluster, os serviços publicados como recursos, não devem ser iniciados automaticamente no SO. Portanto, neste caso somente ativamos o corosync na inicialização. Configurando o Pacemaker

Passo 22 → No Servidor(Node) node1.tgl.com, siga os passos para configuração do Pacemaker Executando o comando deverá surgir um erro de que o Stonith não está configurado.

# crm_verify -L

Passo 23 → Desativando o Stonith

# crm configure property stonith-enabled=false

Passo 24 → Novamente faça uma rechecagem para verificar se não existe outros erros.

# crm_verify -L

Configurações gerais do Cluster A partir dos passos seguintes, será configurado o quorum para entre os Servidores(Nodes) Os passo a seguir devem ser executados no Servidor(Node) node1.tgl.com

Passo 25 → Definindo o quorum

# crm configure property no-quorum-policy=ignore

Passo 26 → Configurando o IP Virtual

# crm configure primitive DBIP ocf:heartbeat:IPaddr2 params ip=172.168.1.6 cidr_netmask=29 op monitor interval=30s

Passo 27 → Configurando o Postgresql para iniciar após definição do Servidor(Node) que ficará com os recursos.

# crm configure primitive postgresql ocf:heartbeat:pgsql op monitor depth=0 timeout="20" interval="20"

Passo 28 → Agora, para facilitar a gerência, agrupe os recursos DBIP(IP Virtual) e postgresql(PostgreSQL) com o nome de postgres.

# crm configure group postgres DBIP postgresql

Se tudo ocorreu bem até aqui, basta reiniciar o Servidores(Nodes) e verificar se tudo foi inicializado com sucesso após o Boot do Sistema Operacional.

Este foi um procedimento simples de como montar um Cluster de HA para PostgreSQL, existem outras formas mais complexas, que talvez um dia eu venha abordar a sua configuração aqui no tutoriaisgnulinux.com.

Espero que este tutorial possa ser útil.

Até!

>_Cluster de alta disponibilidade para Postgresql – Centos 6
Tagged on:

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

%d blogueiros gostam disto: