Procedimento para configurar Multiplas instâncias do PostgreSQL 9.1 em um único Servidor (Debian 7)

Hoje eu acabei pegando uma demanda diferente e não achei alguma documentação decente para utilizar desta forma vou comprartilhar com vocês a minha solução para a demanda.

A ideia deste procedimento é efetuar a configuração de um servidor Central de PostgreSQL com multiplas instâncias para não ser necessário utilizar somente uma instancia e efetuar a criação de bancos de dados com nomes diferentes para o NCall. Cada instancia precisa estar trabalhando em uma porta desta forma vamos ter as portas 5432, 5433, 5434 e 5435.

  1. Rede Utilizada: 10.3.0.0/24
  2. Ip do servidor Master: 10.3.0.108
  3. IP do servidor Slave: 10.3.0.109
  4. Usuário de replicação: sa_rep
  5. Senha de replicação: senha_rep
  6. Porta Cluster Vebita: 5432
  7. Porta Cluster Kiniqe: 5433
  8. Porta Cluster Intelliro: 5434
  9. Porta Cluster Voltek: 5435

A ideia deste procedimento é efetuar a configuração de um servidor Central de PostgreSQL com multiplas instâncias para não ser necessário utilizar somente uma instancia e efetuar a criação de bancos de dados com nomes diferentes para o NCall. Cada instancia precisa estar trabalhando em uma porta desta forma vamos ter as portas 5432, 5433, 5434 e 5435.

Ajustando os repositorios

vi /etc/apt/sources.list
# Official repository
deb http://archive.debian.org/debian wheezy main contrib non-free
deb-src http://archive.debian.org/debian wheezy main contrib non-free

Atualizando os repositorios

apt-get update 

Removendo pacotes problematicos

apt-get remove vim-common -y

Instalando os pacotes necessarios

apt-get install postgresql-9.1 postgresql-common postgresql-client-9.1 postgresql-9.1-plsh vim htop tcpdump nmap sudo -y

Parando o PostgreSQL

/etc/init.d/postgresql stop

Removendo o cluster padrão

rm -rf /var/lib/postgresql/9.1/main

Criando os diretorios para armazenar os clusters

mkdir -p /var/lib/postgresql/9.1/vebita
mkdir -p /var/lib/postgresql/9.1/kiniqe
mkdir -p /var/lib/postgresql/9.1/intelliro
mkdir -p /var/lib/postgresql/9.1/voltek

Ajustanso as permissões dos diretórios

chown -R postgres:postgres /var/lib/postgresql/9.1/*
chmod -R 700 /var/lib/postgresql/9.1/*

Agora vamos acessar o diretório de configurações do PostgreSQL

cd /etc/postgresql/9.1

Vamos renomear a pasta base

mv main vebita 

Agora vamos ajustar o postgresql.conf para a

vim vebita/postgresql.conf
[...]
# Diretorio que vai armazenar os dados
data_directory = '/var/lib/postgresql/9.1/vebita'     # use data in another directory
# Arquivo de controle de autenticação
hba_file = '/etc/postgresql/9.1/vebita/pg_hba.conf'   # host-based authentication file
# Arquivo de configuração do mapeamento de nome de usuário 
ident_file = '/etc/postgresql/9.1/vebita/pg_ident.conf'       # ident configuration file
# Cria um novo arquivo de controle e pid
external_pid_file = '/var/run/postgresql/9.1-vebita.pid'              # write an extra PID file
# Habilita o servidor escutar em qual ip (libere somente para ips necessários) ips separados por ','
listen_addresses = '*'          # what IP address(es) to listen on;
# Porta que o serviço vai estar escutando
port = 5432                             # (change requires restart)
# Definição do arquivo de log para este cluster
log_filename = 'postgresql-9.1-vebita.log'    # log file name pattern,
# Determina quanta informação é escrita para Write Ahead Log (WAL). o padrão é minimal
# hot_standby a informação é logada como archive, mais informações necessárias para reconstrução do status de transações rodando do WAL
wal_level = hot_standby
# Determina o numero maximo de conexões concorrentes dos servidores standby ou streaming. (O numero maximo de servidores rodando o processo de WAL sender) Este número nao pode ser maior que o numero máximo de conexões.
max_wal_senders = 3
# Número máximo de arquivos de log de segmento entre checkpoint automático do WAL. (Cada segmento tem 16MB)
checkpoint_segments = 8    
# Determina o número minimo de arquivos de log de segmentos antigos que devem ser mantidos no diretório pg_xlog
# No caso de um servidor standby precisa obter eles para a replicaçãoem streaming
wal_keep_segments = 8 
# Determina se pode ou não ser conectado e rodar queries no servidor durante o recovery.
hot_standby = on
# quando o archive_mode está habilitado, os segmentos WAL complesto vao ser enviados para o storage por archive_command
archive_mode = on
# Comand shell que vai ser executado para armazenar os arquivos de segmento WAL
archive_command = 'cd .'

Agora vamos ajustar o pg_hba.conf para liberar o acesso da nossa rede ao PostgreSQL

vim vebita/pg_hba.conf
[...]
# Libera o acesso ao postgres da rede 10.3.0.0/24
host all             all             10.3.0.0/24            md5
# Liberando o acesso a replica somente do servidor de replica.
host replication     sa_rep          10.3.0.109/32          md5

Agora vamos iniciar o cluster para a vebita

su postgres -c "/usr/lib/postgresql/9.1/bin/pg_ctl -D /var/lib/postgresql/9.1/vebita initdb"

Agora vamos ajustar os certificados

ln -s /etc/ssl/certs/ssl-cert-snakeoil.pem /var/lib/postgresql/9.1/vebita/server.crt
ln -s /etc/ssl/private/ssl-cert-snakeoil.key /var/lib/postgresql/9.1/vebita/server.key

Agora vamos ajustar as permissões dos arquivos

chown postgres:postgres /var/lib/postgresql/9.1/vebita/server*

Agora vamos subir o cluster da vebita

su postgres -c "/usr/lib/postgresql/9.1/bin/pg_ctl -D /var/lib/postgresql/9.1/vebita -o '-c config_file=/etc/postgresql/9.1/vebita/postgresql.conf' -l /var/log/postgresql/postgresql-9.1-vebita.log start"

Agora vamos consultar o nosso cluster

pg_lsclusters  | grep -i vebita
9.1     vebita  5432 online postgres /var/lib/postgresql/9.1/vebita   custo

Vamos deixar criado o usuário para realizar a replicação do cluster.

sudo -u postgres psql -p 5432 -c "CREATE USER sa_rep REPLICATION LOGIN ENCRYPTED PASSWORD 'senha_rep';" 2> /dev/null > /dev/null

Agora vamos acessar o diretório de configurações do PostgreSQL

cd /etc/postgresql/9.1

Agora vamos efetuar a copia dos arquivos para a kiniqe

cp -Rfa vebita kiniqe

Agora vamos ajustar as configurações para a kiniqe

sed -i 's/vebita/kiniqe/g' kiniqe/postgresql.conf
sed -i 's/port = 5432/port = 5433/g' kiniqe/postgresql.conf

Agora vamos iniciar o cluster para a kiniqe

su postgres -c "/usr/lib/postgresql/9.1/bin/pg_ctl -D /var/lib/postgresql/9.1/kiniqe initdb"

Agora vamos ajustar os certificados

ln -s /etc/ssl/certs/ssl-cert-snakeoil.pem /var/lib/postgresql/9.1/kiniqe/server.crt
ln -s /etc/ssl/private/ssl-cert-snakeoil.key /var/lib/postgresql/9.1/kiniqe/server.key

Agora vamos ajustar as permissões dos arquivos

chown postgres:postgres /var/lib/postgresql/9.1/kiniqe/server*

Agora vamos subir o cluster da kiniqe

su postgres -c "/usr/lib/postgresql/9.1/bin/pg_ctl -D /var/lib/postgresql/9.1/kiniqe -o '-c config_file=/etc/postgresql/9.1/kiniqe/postgresql.conf' -l /var/log/postgresql/postgresql-9.1-kiniqe.log start"

Agora vamos consultar o nosso cluster

pg_lsclusters  | grep -i kiniqe
9.1     kiniqe  5433 online postgres /var/lib/postgresql/9.1/kiniqe   custo

Vamos deixar criado o usuário para realizar a replicação do cluster.

sudo -u postgres psql -p 5433 -c "CREATE USER sa_rep REPLICATION LOGIN ENCRYPTED PASSWORD 'senha_rep';" 2> /dev/null > /dev/null

Agora vamos acessar o diretório de configurações do PostgreSQL

cd /etc/postgresql/9.1

Agora vamos efetuar a copia dos arquivos para o intelliro

cp -Rfa vebita intelliro

Agora vamos ajustar as configurações para o intelliro

sed -i 's/vebita/intelliro/g' intelliro/postgresql.conf
sed -i 's/port = 5432/port = 5434/g' intelliro/postgresql.conf

Agora vamos iniciar o cluster para o intelliro

su postgres -c "/usr/lib/postgresql/9.1/bin/pg_ctl -D /var/lib/postgresql/9.1/intelliro initdb"

Agora vamos ajustar os certificados

ln -s /etc/ssl/certs/ssl-cert-snakeoil.pem /var/lib/postgresql/9.1/intelliro/server.crt
ln -s /etc/ssl/private/ssl-cert-snakeoil.key /var/lib/postgresql/9.1/intelliro/server.key

Agora vamos ajustar as permissões dos arquivos

chown postgres:postgres /var/lib/postgresql/9.1/intelliro/server*

Agora vamos subir o cluster da intelliro

su postgres -c "/usr/lib/postgresql/9.1/bin/pg_ctl -D /var/lib/postgresql/9.1/intelliro -o '-c config_file=/etc/postgresql/9.1/intelliro/postgresql.conf' -l /var/log/postgresql/postgresql-9.1-intelliro.log start"

Agora vamos consultar o nosso cluster

pg_lsclusters  | grep -i intelliro
9.1     intelliro  5434 online postgres /var/lib/postgresql/9.1/intelliro   custo

Vamos deixar criado o usuário para realizar a replicação do cluster.

sudo -u postgres psql -p 5434 -c "CREATE USER sa_rep REPLICATION LOGIN ENCRYPTED PASSWORD 'senha_rep';" 2> /dev/null > /dev/null

Agora vamos acessar o diretório de configurações do PostgreSQL

cd /etc/postgresql/9.1

Agora vamos efetuar a copia dos arquivos para o voltek

cp -Rfa vebita voltek

Agora vamos ajustar as configurações para o voltek

sed -i 's/vebita/voltek/g' voltek/postgresql.conf
sed -i 's/port = 5432/port = 5435/g' voltek/postgresql.conf

Agora vamos iniciar o cluster para a voltek

su postgres -c "/usr/lib/postgresql/9.1/bin/pg_ctl -D /var/lib/postgresql/9.1/voltek initdb"

Agora vamos ajustar os certificados

ln -s /etc/ssl/certs/ssl-cert-snakeoil.pem /var/lib/postgresql/9.1/voltek/server.crt
ln -s /etc/ssl/private/ssl-cert-snakeoil.key /var/lib/postgresql/9.1/voltek/server.key

Agora vamos ajustar as permissões dos arquivos

chown postgres:postgres /var/lib/postgresql/9.1/voltek/server*

Agora vamos subir o cluster da voltek

su postgres -c "/usr/lib/postgresql/9.1/bin/pg_ctl -D /var/lib/postgresql/9.1/voltek -o '-c config_file=/etc/postgresql/9.1/voltek/postgresql.conf' -l /var/log/postgresql/postgresql-9.1-voltek.log start"

Agora vamos consultar o nosso cluster

pg_lsclusters  | grep -i voltek
9.1     voltek  5435 online postgres /var/lib/postgresql/9.1/voltek   custo

Vamos deixar criado o usuário para realizar a replicação do cluster.

sudo -u postgres psql -p 5435 -c "CREATE USER sa_rep REPLICATION LOGIN ENCRYPTED PASSWORD 'senha_rep';" 2> /dev/null > /dev/null

Vamos remover o postgresql da inicialização para evitar problemas de reinicio do serviço indevidamente

insserv -r -f -v postgresql

Agora vamos mover o arquivo de controle do postgres

mkdir /srv/scripts 
mv /etc/init.d/postgresql /srv/scripts/

Agora vamos adicionar o Postgres na inicialização do sistema

vim /etc/rc.local
[...]
# By default this script does nothing.
/srv/scripts/postgresql start
exit 0

Agora vamos criar os links para o serviço ser parado corretamente.

ln -s /srv/scripts/postgresql /etc/rc0.d/K05postgresql
ln -s /srv/scripts/postgresql /etc/rc6.d/K05postgresql

Vamos reiniciar o servidor para testar

reboot

Agora após o reinicio do servidor vamos validar se os clusters subiram

pg_lsclusters 
Version Cluster   Port Status Owner    Data directory                     Log file
9.1     intelliro 5434 online postgres /var/lib/postgresql/9.1/intelliro  custom
9.1     kiniqe  5433 online postgres /var/lib/postgresql/9.1/kiniqe   custom
9.1     voltek       5435 online postgres /var/lib/postgresql/9.1/voltek        custom
9.1     vebita  5432 online postgres /var/lib/postgresql/9.1/vebita   custom

Agora vamos testar a conexão em cada um dos cluster.

Vamos acessar o cluster da vebita

su postgres -c 'psql -p 5432'
could not change directory to "/root"
psql (9.1.21)
Type "help" for help.

postgres=# \q

Vamos acessar o cluster da kiniqe

su postgres -c 'psql -p 5433'
could not change directory to "/root"
psql (9.1.21)
Type "help" for help.

postgres=# \q

Vamos acessar o cluster da intelliro

su postgres -c 'psql -p 5434'
could not change directory to "/root"
psql (9.1.21)
Type "help" for help.

postgres=# \q

Vamos acessar o cluster da voltek

su postgres -c 'psql -p 5435'
could not change directory to "/root"
psql (9.1.21)
Type "help" for help.

postgres=# \q

Agora vamos criar um script para manipular os clusters

vim /etc/init.d/postgresql
#!/bin/bash

### CORES
RED="\033[01;31m"
GREEN="\033[01;32m"
YELLOW="\033[01;33m"
WHITE="\033[01;37m"
CLOSE="\033[m"

### Variaveis utilizadas no script
PG_CTL="/usr/lib/postgresql/9.1/bin/pg_ctl"
PG_CONF="/etc/postgresql/9.1"
PG_DATA="/var/lib/postgresql/9.1"
PG_LOG="/var/log/postgresql/postgresql-9.1"
MSG_EMP="[vebita, kiniqe, intelliro, voltek]"
MSG_OPT="[start/stop/restart/reload/status]"
ER_EMP="^(vebita|kiniqe|intelliro|voltek)$"

### Funcao para validar se foi informada uma empresa e se ela eh valida.
__tem_empresa(){
if [ -z "$1" ]; then 
  echo -e "${RED} Nao foi informada uma empresa... ${MSG_EMP}${CLOSE}" && exit 1
else
  ## Empresas disponiveis
  EMPRESA=$(echo "$1" | egrep "${ER_EMP}")
  [ -z "${EMPRESA}" ] && echo -e "${RED}ERRO > Nao foi informada uma empresa valida... ${MSG_EMP}${CLOSE}" && exit 1
fi

}

### Case de controle de opcoes
case "$1" in
  start)
    ## Inicia o cluster solicitado
    __tem_empresa ${2}
    echo -e "${GREEN}START > ${WHITE}$2${CLOSE}"
    su postgres -c "${PG_CTL} -D ${PG_DATA}/${2} -o \"-c config_file=${PG_CONF}/${2}/postgresql.conf\" -l ${PG_LOG}-${2}.log start" 2> /dev/null > /dev/null
  ;;
  stop)
    ## Para o cluster solicitado
    __tem_empresa ${2}
    echo -e "${RED}STOP > ${WHITE}$2${CLOSE}"
    su postgres -c "${PG_CTL} stop -w -D ${PG_DATA}/${2} -l ${PG_LOG}-${2}.log" 2> /dev/null > /dev/null
  ;;
  reload)
    ## Reload the configuration
    __tem_empresa ${2}
    echo -e "${GREEN}RELOAD > ${WHITE}$2${CLOSE}"
    su postgres -c "${PG_CTL} reload -D ${PG_DATA}/${2}" 2> /dev/null > /dev/null
  ;;
  restart)
    ## Reinicia o cluster solicitado
    __tem_empresa ${2}
    bash $0 stop ${2}
    bash $0 start ${2}
  ;;
  status)
    ## Mostra o status do cluster solicitado
    __tem_empresa $2
    echo -e "${GREEN}STATUS > ${WHITE}$2${CLOSE}"

    ## Valida se o cluster solicitado esta online
    ONLINE=$(pg_lsclusters | grep ${2} | grep -i 'online')

    ## Valida a cor da mensagem
    [ -z "${ONLINE}" ] && COR="${RED}" || COR="${GREEN}"

    ## Mostra a mensagem sobre o cluster solicitado.
    echo -ne "${COR}"
    pg_lsclusters | grep ${2}
    echo -ne "${CLOSE}"
  ;;
  *)
    ## Aviso de opcao nao encontrada
    echo -e "${RED}ERRO > Usar ${0} ${MSG_OPT} ${MSG_EMP}${CLOSE}"
    exit 1
  ;;
esac

Agora vamos dar a permissão de execução para o script

chmod +x /etc/init.d/postgresql

Agora vamos executar o script sem passar parâmetros

/etc/init.d/postgresql 
ERRO > Usar /etc/init.d/postgresql [start/stop/restart/reload/status] [vebita, kiniqe, intelliro, voltek]

Agora vamos consultar o status do cluster da vebita

/etc/init.d/postgresql status vebita
STATUS > vebita
9.1     vebita  5432 online postgres /var/lib/postgresql/9.1/vebita   custo

Agora vamos parar o cluster da vebita

/etc/init.d/postgresql stop vebita
STOP > vebita

Agora vamos consultar o status do cluster da vebita

/etc/init.d/postgresql status vebita
STATUS > vebita
9.1     vebita  5432 down   postgres /var/lib/postgresql/9.1/vebita   custom

Vamos consultar os cluster para validar se somente a vebita esta down

pg_lsclusters 
Version Cluster   Port Status Owner    Data directory                     Log file
9.1     intelliro 5434 online postgres /var/lib/postgresql/9.1/intelliro  custom
9.1     kiniqe  5433 online postgres /var/lib/postgresql/9.1/kiniqe   custom
9.1     voltek       5435 online postgres /var/lib/postgresql/9.1/voltek        custom
9.1     vebita  5432 down   postgres /var/lib/postgresql/9.1/vebita   custom

Agora vamos subir o cluster da vebita novamente

/etc/init.d/postgresql start vebita
START > vebita

Agora vamos consultar o cluster da vebita novamente

/etc/init.d/postgresql status vebita
STATUS > vebita
9.1     vebita  5432 online postgres /var/lib/postgresql/9.1/vebita   custom

Vamos consultar os cluster para validar se todos estão online

pg_lsclusters
Version Cluster   Port Status Owner    Data directory                     Log file
9.1     intelliro 5434 online postgres /var/lib/postgresql/9.1/intelliro  custom
9.1     kiniqe  5433 online postgres /var/lib/postgresql/9.1/kiniqe   custom
9.1     voltek       5435 online postgres /var/lib/postgresql/9.1/voltek        custom
9.1     vebita  5432 online postgres /var/lib/postgresql/9.1/vebita   custom

Preparando o ambiente no servidor Slave

Agora vamos preparar o servidor Slave para receber os dados do servidor Master, na mesma estrutura de cluster e portas.

Ajustando os repositorios

vi /etc/apt/sources.list
# Official repository
deb http://archive.debian.org/debian wheezy main contrib non-free
deb-src http://archive.debian.org/debian wheezy main contrib non-free

Atualizando os repositorios

apt-get update 

Removendo pacotes problematicos

apt-get remove vim-common -y

Instalando os pacotes necessarios

apt-get install postgresql-9.1 postgresql-common postgresql-client-9.1 postgresql-9.1-plsh vim htop tcpdump nmap sudo -y

Parando o PostgreSQL

/etc/init.d/postgresql stop

Removendo o cluster padrão

rm -rf /var/lib/postgresql/9.1/main

Configurando a replica do Cluster para a Vebita

Agora vamos acessar o diretório de configurações do PostgreSQL

cd /etc/postgresql/9.1

Vamos renomear a pasta base

mv main vebita 

Agora vamos ajustar o postgresql.conf para a

vim vebita/postgresql.conf
[...]
# Diretorio que vai armazenar os dados
data_directory = '/var/lib/postgresql/9.1/vebita'     # use data in another directory
# Arquivo de controle de autenticação
hba_file = '/etc/postgresql/9.1/vebita/pg_hba.conf'   # host-based authentication file
# Arquivo de configuração do mapeamento de nome de usuário 
ident_file = '/etc/postgresql/9.1/vebita/pg_ident.conf'       # ident configuration file
# Cria um novo arquivo de controle e pid
external_pid_file = '/var/run/postgresql/9.1-vebita.pid'              # write an extra PID file
# Habilita o servidor escutar em qual ip (libere somente para ips necessários) ips separados por ','
listen_addresses = '*'          # what IP address(es) to listen on;
# Porta que o serviço vai estar escutando
port = 5432                             # (change requires restart)
# Definição do arquivo de log para este cluster
log_filename = 'postgresql-9.1-vebita.log'    # log file name pattern,
# Determina quanta informação é escrita para Write Ahead Log (WAL). o padrão é minimal
# hot_standby a informação é logada como archive, mais informações necessárias para reconstrução do status de transações rodando do WAL
wal_level = hot_standby
# Determina o numero maximo de conexões concorrentes dos servidores standby ou streaming. (O numero maximo de servidores rodando o processo de WAL sender) Este número nao pode ser maior que o numero máximo de conexões.
max_wal_senders = 8
# Número máximo de arquivos de log de segmento entre checkpoint automático do WAL. (Cada segmento tem 16MB)
checkpoint_segments = 8    
# Determina o número minimo de arquivos de log de segmentos antigos que devem ser mantidos no diretório pg_xlog
# No caso de um servidor standby precisa obter eles para a replicaçãoem streaming
wal_keep_segments = 8 
# Determina se pode ou não ser conectado e rodar queries no servidor durante o recovery.
hot_standby = on
# quando o archive_mode está habilitado, os segmentos WAL complesto vao ser enviados para o storage por archive_command
archive_mode = on
# Comand shell que vai ser executado para armazenar os arquivos de segmento WAL
archive_command = 'cd .'

Agora vamos ajustar o pg_hba.conf para liberar o acesso da nossa rede ao PostgreSQL

vim vebita/pg_hba.conf
[...]
# Libera o acesso ao postgres da rede 10.3.0.0/24
host all             all             10.3.0.0/24            md5
# Liberando o acesso a replica somente do servidor de replica.
host replication     sa_rep          10.3.0.109/32          md5

Configurando a replica do Cluster para a Kiniqe

Agora vamos acessar o diretório de configurações do PostgreSQL

cd /etc/postgresql/9.1

Agora vamos efetuar a copia dos arquivos para a Kiniqe

cp -Rfa vebita kiniqe

Agora vamos ajustar as configurações para a Kiniqe

sed -i 's/vebita/kiniqe/g' kiniqe/postgresql.conf
sed -i 's/port = 5432/port = 5433/g' kiniqe/postgresql.conf

Configurando a replica do Cluster para a Intelliro

Agora vamos acessar o diretório de configurações do PostgreSQL

cd /etc/postgresql/9.1

Agora vamos efetuar a copia dos arquivos para o Intelliro

cp -Rfa vebita intelliro

Agora vamos ajustar as configurações para o Intelliro

sed -i 's/vebita/intelliro/g' intelliro/postgresql.conf
sed -i 's/port = 5432/port = 5434/g' intelliro/postgresql.conf

Configurando a replica do Cluster para a Voltek

Agora vamos acessar o diretório de configurações do PostgreSQL

cd /etc/postgresql/9.1

Agora vamos efetuar a copia dos arquivos para o Voltek

cp -Rfa vebita voltek

Agora vamos ajustar as configurações para o Voltek

sed -i 's/vebita/voltek/g' voltek/postgresql.conf
sed -i 's/port = 5432/port = 5435/g' voltek/postgresql.conf

Ajustando os scripts de incialização do PostgreSQL no Slave

Vamos remover o postgresql da inicialização para evitar problemas de reinicio do serviço indevidamente

insserv -r -f -v postgresql

Agora vamos mover o arquivo de controle do postgres

mkdir /srv/scripts 
mv /etc/init.d/postgresql /srv/scripts/

Agora vamos adicionar o Postgres na inicialização do sistema

vim /etc/rc.local
[...]
# By default this script does nothing.
/srv/scripts/postgresql start
exit 0

Agora vamos criar os links para o serviço ser parado corretamente.

ln -s /srv/scripts/postgresql /etc/rc0.d/K05postgresql
ln -s /srv/scripts/postgresql /etc/rc6.d/K05postgresql

Agora vamos criar um script para manipular os clusters

vim /etc/init.d/postgresql
#!/bin/bash

### CORES
RED="\033[01;31m"
GREEN="\033[01;32m"
YELLOW="\033[01;33m"
WHITE="\033[01;37m"
CLOSE="\033[m"

### Variaveis utilizadas no script
PG_CTL="/usr/lib/postgresql/9.1/bin/pg_ctl"
PG_CONF="/etc/postgresql/9.1"
PG_DATA="/var/lib/postgresql/9.1"
PG_LOG="/var/log/postgresql/postgresql-9.1"
MSG_EMP="[vebita, kiniqe, intelliro, voltek]"
MSG_OPT="[start/stop/restart/reload/status]"
ER_EMP="^(vebita|kiniqe|intelliro|voltek)$"

### Funcao para validar se foi informada uma empresa e se ela eh valida.
__tem_empresa(){
if [ -z "$1" ]; then 
  echo -e "${RED} Nao foi informada uma empresa... ${MSG_EMP}${CLOSE}" && exit 1
else
  ## Empresas disponiveis
  EMPRESA=$(echo "$1" | egrep "${ER_EMP}")
  [ -z "${EMPRESA}" ] && echo -e "${RED}ERRO > Nao foi informada uma empresa valida... ${MSG_EMP}${CLOSE}" && exit 1
fi

}

### Case de controle de opcoes
case "$1" in
  start)
    ## Inicia o cluster solicitado
    __tem_empresa ${2}
    echo -e "${GREEN}START > ${WHITE}$2${CLOSE}"
    su postgres -c "${PG_CTL} -D ${PG_DATA}/${2} -o \"-c config_file=${PG_CONF}/${2}/postgresql.conf\" -l ${PG_LOG}-${2}.log start" 2> /dev/null > /dev/null
  ;;
  stop)
    ## Para o cluster solicitado
    __tem_empresa ${2}
    echo -e "${RED}STOP > ${WHITE}$2${CLOSE}"
    su postgres -c "${PG_CTL} stop -w -D ${PG_DATA}/${2} -l ${PG_LOG}-${2}.log" 2> /dev/null > /dev/null
  ;;
  reload)
    ## Reload the configuration
    __tem_empresa ${2}
    echo -e "${GREEN}RELOAD > ${WHITE}$2${CLOSE}"
    su postgres -c "${PG_CTL} reload -D ${PG_DATA}/${2}" 2> /dev/null > /dev/null
  ;;
  restart)
    ## Reinicia o cluster solicitado
    __tem_empresa ${2}
    bash $0 stop ${2}
    bash $0 start ${2}
  ;;
  status)
    ## Mostra o status do cluster solicitado
    __tem_empresa $2
    echo -e "${GREEN}STATUS > ${WHITE}$2${CLOSE}"

    ## Valida se o cluster solicitado esta online
    ONLINE=$(pg_lsclusters | grep ${2} | grep -i 'online')

    ## Valida a cor da mensagem
    [ -z "${ONLINE}" ] && COR="${RED}" || COR="${GREEN}"

    ## Mostra a mensagem sobre o cluster solicitado.
    echo -ne "${COR}"
    pg_lsclusters | grep ${2}
    echo -ne "${CLOSE}"
  ;;
  *)
    ## Aviso de opcao nao encontrada
    echo -e "${RED}ERRO > Usar ${0} ${MSG_OPT} ${MSG_EMP}${CLOSE}"
    exit 1
  ;;
esac

Agora vamos dar a permissão de execução para o script

chmod +x /etc/init.d/postgresql

Criando o script para a replicação dos Clusters

Vamos criar o script que controla a replicação dos cluster

vim /srv/scripts/sync-pg.sh 
#!/bin/bash

# Comandos
CAT=$(which cat)
CUT=$(which cut)
SED=$(which sed)

# Empresas
MSG_EMP="[vebita, kiniqe, intelliro, voltek]"

# Expressao regular para validar o cliente
case "$1" in
  vebita)
    DB_DATA="vebita"
    DB_PORT="5432"
    BD_MASTER="10.3.0.108"
    PG_USER="sa_rep"
    PG_PASS="senha_rep"
  ;;
  kiniqe)
    DB_DATA="kiniqe"
    DB_PORT="5433"
    BD_MASTER="10.3.0.108"
    PG_USER="sa_rep"
    PG_PASS="senha_rep"
  ;;
  intelliro)
    DB_DATA="intelliro"
    DB_PORT="5434"
    BD_MASTER="10.3.0.108"
    PG_USER="sa_rep"
    PG_PASS="senha_rep"
  ;;
  voltek)
    DB_DATA="voltek"
    DB_PORT="5435"
    BD_MASTER="10.3.0.108"
    PG_USER="sa_rep"
    PG_PASS="senha_rep"
  ;;
  *)
    echo "ERRO > Empresas Validas: ${MSG_EMP}" && exit 1
  ;;
esac

# Obtendo a versao do debian
if [ -f "/etc/debian_version" ]; then 
	DEBIAN_VER=$(${CAT} /etc/debian_version | ${CUT} -d "." -f 1)
else 
  echo "Abortando. Suporte somente para Debian..."
  exit 1
fi

if [ "${DEBIAN_VER}" ===== "7" ]; then
  PG_VER="9.1"
elif [ "${DEBIAN_VER}" ===== "8" ]; then
  PG_VER="9.4"
fi

echo "PG_SYNC > Parando o PostgreSQL"
/etc/init.d/postgresql stop ${DB_DATA}

echo "Criando backup do diretorio de cluster antigo"
if [ -d "/var/lib/postgresql/${PG_VER}/${DB_DATA}" ]; then
  echo "PG_SYNC > EFETUANDO BACKUP DA BASE ANTIGA VIA DIRETORIO (${DB_DATA})"
  su -c "mv -f /var/lib/postgresql/${PG_VER}/${DB_DATA} /var/lib/postgresql/${PG_VER}/${DB_DATA}-$(date +%F-as-%H-%M-%S)" postgres
fi

# Ajustando o arquivo de controle de acesso
if [ -f "/var/lib/postgresql/.pgpass" ]; then
  echo "PG_SYNC > AJUSTANDO ACESSO AO POSTGRESQL"
  cp -Rfa /var/lib/postgresql/.pgpass /var/lib/postgresql/.pgpass-$(date +%F-as-%H-%M-%S)
fi
  
  echo "${BD_MASTER}:${DB_PORT}:*:${PG_USER}:${PG_PASS}" >> /var/lib/postgresql/.pgpass
  chmod 600 /var/lib/postgresql/.pgpass
  chown postgres:postgres /var/lib/postgresql/.pgpass

echo "PG_SYNC > Iniciando a replicacao da base de backup como ${PG_USER}"
su -c "pg_basebackup -h ${BD_MASTER} -p ${DB_PORT} -D /var/lib/postgresql/${PG_VER}/${DB_DATA} -U ${PG_USER} -v" postgres

if [ "${?}" != "0"  ]; then
  echo "PG_SYNC > Erro durante a replicação. Favor validar..."
  exit 1
fi


if [ "${PG_VER}" ===== "9.1" ]; then
  echo "PG_SYNC > Ajustando os certificados"
  if [ -e "/etc/ssl/certs/ssl-cert-snakeoil.pem" ] && [ ! -e "/var/lib/postgresql/${PG_VER}/${DB_DATA}/server.crt" ]; then
    ln -s /etc/ssl/certs/ssl-cert-snakeoil.pem /var/lib/postgresql/${PG_VER}/${DB_DATA}/server.crt 2> /dev/null
  fi

  if [ -e "/etc/ssl/private/ssl-cert-snakeoil.key" ] && [ ! -e "/var/lib/postgresql/${PG_VER}/${DB_DATA}/server.key" ]; then
    ln -s /etc/ssl/private/ssl-cert-snakeoil.key /var/lib/postgresql/${PG_VER}/${DB_DATA}/server.key 2> /dev/null
  fi
fi

echo "PG_SYNC > Criando o arquivo de recovery.conf"
su -c "${CAT} > /var/lib/postgresql/${PG_VER}/${DB_DATA}/recovery.conf <<- _EOF1_
  standby_mode = 'on'
  primary_conninfo = 'host=${BD_MASTER} port=${DB_PORT} user=${PG_USER} password=${PG_PASS}'
  trigger_file = '/var/lib/postgresql/${PG_VER}/${DB_DATA}/_trigger'
_EOF1_
" postgres

echo "PG_SYNC > Iniciando o PostgreSQL"
/etc/init.d/postgresql start ${DB_DATA}

Executando a replição do Cluster da Vebita

Agora vamos executar o script de replicação

bash /srv/scripts/sync-pg.sh vebita
PG_SYNC > Parando o PostgreSQL
STOP > vebita
Criando backup do diretorio de cluster antigo
PG_SYNC > AJUSTANDO ACESSO AO POSTGRESQL
PG_SYNC > Iniciando a replicacao da base de backup como sa_rep
AVISO:  ignorando arquivo especial "./server.crt"
AVISO:  ignorando arquivo especial "./server.key"
NOTA:  pg_stop_backup conclu?do, todos os segmentos do WAL foram arquivados
pg_basebackup: base backup completed
PG_SYNC > Ajustando os certificados
PG_SYNC > Criando o arquivo de recovery.conf
PG_SYNC > Iniciando o PostgreSQL
START > vebita

Agora vamos consultar o cluster da vebita

pg_lsclusters | grep -i vebita
9.1     vebita  5432 online,recovery postgres /var/lib/postgresql/9.1/vebita   custom

Agora vamos consultar se temos um processo de streaming

ps aux | grep -i wal
postgres  3329  0.3  1.0 117096  5192 ?        Ss   16:33   0:00 postgres: wal receiver process   streaming 0/13000000

Executando a replição do Cluster da Kiniqe

Agora vamos executar o script de replicação

bash /srv/scripts/sync-pg.sh kiniqe
PG_SYNC > Parando o PostgreSQL
STOP > kiniqe
Criando backup do diretorio de cluster antigo
PG_SYNC > AJUSTANDO ACESSO AO POSTGRESQL
PG_SYNC > Iniciando a replicacao da base de backup como sa_rep
AVISO:  ignorando arquivo especial "./server.crt"
AVISO:  ignorando arquivo especial "./server.key"
NOTA:  pg_stop_backup conclu?do, todos os segmentos do WAL foram arquivados
pg_basebackup: base backup completed
PG_SYNC > Ajustando os certificados
PG_SYNC > Criando o arquivo de recovery.conf
PG_SYNC > Iniciando o PostgreSQL
START > kiniqe

Agora vamos consultar o cluster da Kiniqe

pg_lsclusters | grep -i kiniqe
9.1     kiniqe  5433 online,recovery postgres /var/lib/postgresql/9.1/kiniqe   custom

Agora vamos consultar se temos um processo de streaming

ps aux | grep -i wal
postgres  3329  0.3  1.0 117096  5192 ?        Ss   16:33   0:00 postgres: wal receiver process   streaming 0/13000000 postgres  3368  0.8  1.0 117096  5200 ?        Ss   16:33   0:00 postgres: wal receiver process   streaming 0/11000000 

Executando a replição do Cluster da Intelliro

Agora vamos executar o script de replicação

bash /srv/scripts/sync-pg.sh intelliro
PG_SYNC > Parando o PostgreSQL
STOP > intelliro
Criando backup do diretorio de cluster antigo
PG_SYNC > AJUSTANDO ACESSO AO POSTGRESQL
PG_SYNC > Iniciando a replicacao da base de backup como sa_rep
AVISO:  ignorando arquivo especial "./server.crt"
AVISO:  ignorando arquivo especial "./server.key"
NOTA:  pg_stop_backup conclu?do, todos os segmentos do WAL foram arquivados
pg_basebackup: base backup completed
PG_SYNC > Ajustando os certificados
PG_SYNC > Criando o arquivo de recovery.conf
PG_SYNC > Iniciando o PostgreSQL
START > intelliro

Agora vamos consultar o cluster da Intelliro

pg_lsclusters | grep -i intelliro
9.1     intelliro 5434 online,recovery postgres /var/lib/postgresql/9.1/intelliro  custom

Agora vamos consultar se temos um processo de streaming

ps aux | grep -i wal
postgres  3329  0.0  1.0 117096  5192 ?        Ss   16:33   0:00 postgres: wal receiver process   streaming 0/13000000
postgres  3368  0.0  1.0 117096  5200 ?        Ss   16:33   0:00 postgres: wal receiver process   streaming 0/11000000
postgres  3417  0.1  1.0 117100  5204 ?        Ss   16:35   0:00 postgres: wal receiver process   streaming 0/8000000

Executando a replição do Cluster da Voltek

Agora vamos executar o script de replicação

bash /srv/scripts/sync-pg.sh voltek
PG_SYNC > Parando o PostgreSQL
STOP > voltek
Criando backup do diretorio de cluster antigo
PG_SYNC > AJUSTANDO ACESSO AO POSTGRESQL
PG_SYNC > Iniciando a replicacao da base de backup como sa_rep
AVISO:  ignorando arquivo especial "./server.crt"
AVISO:  ignorando arquivo especial "./server.key"
NOTA:  pg_stop_backup conclu?do, todos os segmentos do WAL foram arquivados
pg_basebackup: base backup completed
PG_SYNC > Ajustando os certificados
PG_SYNC > Criando o arquivo de recovery.conf
PG_SYNC > Iniciando o PostgreSQL
START > voltek

Agora vamos consultar o cluster da Voltek

pg_lsclusters | grep -i voltek
9.1     voltek       5435 online,recovery postgres /var/lib/postgresql/9.1/voltek        custom

Agora vamos consultar se temos um processo de streaming

ps aux | grep -i wal
postgres  3329  0.0  1.0 117096  5192 ?        Ss   16:33   0:00 postgres: wal receiver process   streaming 0/130000B0
postgres  3368  0.0  1.0 117096  5200 ?        Ss   16:33   0:00 postgres: wal receiver process   streaming 0/110000B0
postgres  3417  0.0  1.0 117100  5204 ?        Ss   16:35   0:00 postgres: wal receiver process   streaming 0/8000000
postgres  3481  0.2  1.0 117092  5200 ?        Ss   16:39   0:00 postgres: wal receiver process   streaming 0/8000000