Differences

This shows you the differences between two versions of the page.

Link to this comparison view

procecimento_para_configurar_multiplas_instancias_do_postgresql_single_host_debian_7 [2020/06/20 15:08] (current)
Douglas Quintiliano dos Santos created
Line 1: Line 1:
 +====== 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**.
 +
 +  - **Rede Utilizada**: 10.3.0.0/24
 +  - **Ip do servidor Master**: 10.3.0.108
 +  - **IP do servidor Slave**: 10.3.0.109
 +  - **Usuário de replicação**: sa_rep
 +  - **Senha de replicação**: senha_rep
 +  - **Porta Cluster Vebita**: 5432
 +  - **Porta Cluster Kiniqe**: 5433
 +  - **Porta Cluster Intelliro**: 5434
 +  - **Porta Cluster Voltek**: 5435
 +
 +
 +===== Preparando o ambiente =====
 +
 +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 
 +<sxh bash>
 +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
 +</sxh>
 +
 +Atualizando os repositorios 
 +<sxh bash>
 +apt-get update 
 +</sxh>
 +
 +Removendo pacotes problematicos 
 +<sxh bash>
 +apt-get remove vim-common -y
 +</sxh>
 +
 +Instalando os pacotes necessarios
 +<sxh bash>
 +apt-get install postgresql-9.1 postgresql-common postgresql-client-9.1 postgresql-9.1-plsh vim htop tcpdump nmap sudo -y
 +</sxh>
 +
 +Parando o PostgreSQL
 +<sxh bash>
 +/etc/init.d/postgresql stop
 +</sxh>
 +
 +Removendo o cluster padrão
 +<sxh bash>
 +rm -rf /var/lib/postgresql/9.1/main
 +</sxh>
 +
 +Criando os diretorios para armazenar os clusters 
 +<sxh bash>
 +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
 +</sxh>
 +
 +Ajustanso as permissões dos diretórios
 +<sxh bash>
 +chown -R postgres:postgres /var/lib/postgresql/9.1/*
 +chmod -R 700 /var/lib/postgresql/9.1/*
 +</sxh>
 +
 +===== Configurando o Cluster para a vebita =====
 +Agora vamos acessar o diretório de configurações do PostgreSQL
 +<sxh bash>
 +cd /etc/postgresql/9.1
 +</sxh>
 +
 +Vamos renomear a pasta base
 +<sxh bash>
 +mv main vebita 
 +</sxh>
 +
 +Agora vamos ajustar o postgresql.conf para a 
 +<sxh bash>
 +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 .'
 +</sxh>
 +
 +Agora vamos ajustar o pg_hba.conf para liberar o acesso da nossa rede ao PostgreSQL
 +<sxh bash>
 +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
 +</sxh>
 +
 +Agora vamos iniciar o cluster para a vebita
 +<sxh bash>
 +su postgres -c "/usr/lib/postgresql/9.1/bin/pg_ctl -D /var/lib/postgresql/9.1/vebita initdb"
 +</sxh>
 +
 +Agora vamos ajustar os certificados
 +<sxh bash>
 +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
 +</sxh>
 +
 +Agora vamos ajustar as permissões dos arquivos
 +<sxh bash>
 +chown postgres:postgres /var/lib/postgresql/9.1/vebita/server*
 +</sxh>
 +
 +Agora vamos subir o cluster da vebita 
 +<sxh bash>
 +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"
 +</sxh>
 +
 +Agora vamos consultar o nosso cluster
 +<sxh bash>
 +pg_lsclusters  | grep -i vebita
 +9.1     vebita  5432 online postgres /var/lib/postgresql/9.1/vebita   custo
 +</sxh>
 +
 +Vamos deixar criado o usuário para realizar a replicação do cluster.
 +<sxh bash>
 +sudo -u postgres psql -p 5432 -c "CREATE USER sa_rep REPLICATION LOGIN ENCRYPTED PASSWORD 'senha_rep';" 2> /dev/null > /dev/null
 +</sxh>
 +
 +
 +===== Configurando o Cluster para a kiniqe =====
 +
 +Agora vamos acessar o diretório de configurações do PostgreSQL
 +<sxh bash>
 +cd /etc/postgresql/9.1
 +</sxh>
 +
 +Agora vamos efetuar a copia dos arquivos para a kiniqe
 +<sxh bash>
 +cp -Rfa vebita kiniqe
 +</sxh>
 +
 +Agora vamos ajustar as configurações para a kiniqe
 +<sxh bash>
 +sed -i 's/vebita/kiniqe/g' kiniqe/postgresql.conf
 +sed -i 's/port = 5432/port = 5433/g' kiniqe/postgresql.conf
 +</sxh>
 +
 +Agora vamos iniciar o cluster para a kiniqe
 +<sxh bash>
 +su postgres -c "/usr/lib/postgresql/9.1/bin/pg_ctl -D /var/lib/postgresql/9.1/kiniqe initdb"
 +</sxh>
 +
 +Agora vamos ajustar os certificados
 +<sxh bash>
 +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
 +</sxh>
 +
 +Agora vamos ajustar as permissões dos arquivos
 +<sxh bash>
 +chown postgres:postgres /var/lib/postgresql/9.1/kiniqe/server*
 +</sxh>
 +
 +Agora vamos subir o cluster da kiniqe 
 +<sxh bash>
 +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"
 +</sxh>
 +
 +Agora vamos consultar o nosso cluster 
 +<sxh bash>
 +pg_lsclusters  | grep -i kiniqe
 +9.1     kiniqe  5433 online postgres /var/lib/postgresql/9.1/kiniqe   custo
 +</sxh>
 +
 +Vamos deixar criado o usuário para realizar a replicação do cluster.
 +<sxh bash>
 +sudo -u postgres psql -p 5433 -c "CREATE USER sa_rep REPLICATION LOGIN ENCRYPTED PASSWORD 'senha_rep';" 2> /dev/null > /dev/null
 +</sxh>
 +
 +
 +===== Configurando o Cluster para a intelliro =====
 +
 +Agora vamos acessar o diretório de configurações do PostgreSQL
 +<sxh bash>
 +cd /etc/postgresql/9.1
 +</sxh>
 +
 +Agora vamos efetuar a copia dos arquivos para o intelliro
 +<sxh bash>
 +cp -Rfa vebita intelliro
 +</sxh>
 +
 +Agora vamos ajustar as configurações para o intelliro
 +<sxh bash>
 +sed -i 's/vebita/intelliro/g' intelliro/postgresql.conf
 +sed -i 's/port = 5432/port = 5434/g' intelliro/postgresql.conf
 +</sxh>
 +
 +Agora vamos iniciar o cluster para o intelliro
 +<sxh bash>
 +su postgres -c "/usr/lib/postgresql/9.1/bin/pg_ctl -D /var/lib/postgresql/9.1/intelliro initdb"
 +</sxh>
 +
 +Agora vamos ajustar os certificados
 +<sxh bash>
 +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
 +</sxh>
 +
 +Agora vamos ajustar as permissões dos arquivos
 +<sxh bash>
 +chown postgres:postgres /var/lib/postgresql/9.1/intelliro/server*
 +</sxh>
 +
 +Agora vamos subir o cluster da intelliro
 +<sxh bash>
 +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"
 +</sxh>
 +
 +Agora vamos consultar o nosso cluster
 +<sxh bash>
 +pg_lsclusters  | grep -i intelliro
 +9.1     intelliro  5434 online postgres /var/lib/postgresql/9.1/intelliro   custo
 +</sxh>
 +
 +Vamos deixar criado o usuário para realizar a replicação do cluster.
 +<sxh bash>
 +sudo -u postgres psql -p 5434 -c "CREATE USER sa_rep REPLICATION LOGIN ENCRYPTED PASSWORD 'senha_rep';" 2> /dev/null > /dev/null
 +</sxh>
 +
 +
 +===== Configurando o Cluster para a voltek =====
 +
 +Agora vamos acessar o diretório de configurações do PostgreSQL
 +<sxh bash>
 +cd /etc/postgresql/9.1
 +</sxh>
 +
 +Agora vamos efetuar a copia dos arquivos para o voltek
 +<sxh bash>
 +cp -Rfa vebita voltek
 +</sxh>
 +
 +Agora vamos ajustar as configurações para o voltek
 +<sxh bash>
 +sed -i 's/vebita/voltek/g' voltek/postgresql.conf
 +sed -i 's/port = 5432/port = 5435/g' voltek/postgresql.conf
 +</sxh>
 +
 +Agora vamos iniciar o cluster para a voltek
 +<sxh bash>
 +su postgres -c "/usr/lib/postgresql/9.1/bin/pg_ctl -D /var/lib/postgresql/9.1/voltek initdb"
 +</sxh>
 +
 +Agora vamos ajustar os certificados
 +<sxh bash>
 +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
 +</sxh>
 +
 +Agora vamos ajustar as permissões dos arquivos
 +<sxh bash>
 +chown postgres:postgres /var/lib/postgresql/9.1/voltek/server*
 +</sxh>
 +
 +Agora vamos subir o cluster da voltek 
 +<sxh bash>
 +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"
 +</sxh>
 +
 +Agora vamos consultar o nosso cluster
 +<sxh bash>
 +pg_lsclusters  | grep -i voltek
 +9.1     voltek  5435 online postgres /var/lib/postgresql/9.1/voltek   custo
 +</sxh>
 +
 +Vamos deixar criado o usuário para realizar a replicação do cluster.
 +<sxh bash>
 +sudo -u postgres psql -p 5435 -c "CREATE USER sa_rep REPLICATION LOGIN ENCRYPTED PASSWORD 'senha_rep';" 2> /dev/null > /dev/null
 +</sxh>
 +
 +
 +===== Ajustando os scripts de incialização do PostgreSQL =====
 +
 +Vamos remover o postgresql da inicialização para evitar problemas de reinicio do serviço indevidamente
 +<sxh bash>
 +insserv -r -f -v postgresql
 +</sxh>
 +
 +Agora vamos mover o arquivo de controle do postgres
 +<sxh bash>
 +mkdir /srv/scripts 
 +mv /etc/init.d/postgresql /srv/scripts/
 +</sxh>
 +
 +Agora vamos adicionar o Postgres na inicialização do sistema 
 +<sxh bash>
 +vim /etc/rc.local
 +[...]
 +# By default this script does nothing.
 +/srv/scripts/postgresql start
 +exit 0
 +</sxh>
 +
 +Agora vamos criar os links para o serviço ser parado corretamente.
 +<sxh bash>
 +ln -s /srv/scripts/postgresql /etc/rc0.d/K05postgresql
 +ln -s /srv/scripts/postgresql /etc/rc6.d/K05postgresql
 +</sxh>
 +
 +Vamos reiniciar o servidor para testar
 +<sxh bash>
 +reboot
 +</sxh>
 +
 +Agora após o reinicio do servidor vamos validar se os clusters subiram 
 +<sxh bash>
 +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
 +</sxh>
 +
 +Agora vamos testar a conexão em cada um dos cluster.
 +
 +Vamos acessar o cluster da vebita
 +<sxh bash>
 +su postgres -c 'psql -p 5432'
 +could not change directory to "/root"
 +psql (9.1.21)
 +Type "help" for help.
 +
 +postgres=# \q
 +</sxh>
 +
 +Vamos acessar o cluster da kiniqe
 +<sxh bash>
 +su postgres -c 'psql -p 5433'
 +could not change directory to "/root"
 +psql (9.1.21)
 +Type "help" for help.
 +
 +postgres=# \q
 +</sxh>
 +
 +Vamos acessar o cluster da intelliro
 +<sxh bash>
 +su postgres -c 'psql -p 5434'
 +could not change directory to "/root"
 +psql (9.1.21)
 +Type "help" for help.
 +
 +postgres=# \q
 +</sxh>
 +
 +Vamos acessar o cluster da voltek
 +<sxh bash>
 +su postgres -c 'psql -p 5435'
 +could not change directory to "/root"
 +psql (9.1.21)
 +Type "help" for help.
 +
 +postgres=# \q
 +</sxh>
 +
 +Agora vamos criar um script para manipular os clusters
 +<sxh bash>
 +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
 +</sxh>
 +
 +Agora vamos dar a permissão de execução para o script
 +<sxh bash>
 +chmod +x /etc/init.d/postgresql
 +</sxh>
 +
 +Agora vamos executar o script sem passar parâmetros
 +<sxh bash>
 +/etc/init.d/postgresql 
 +ERRO > Usar /etc/init.d/postgresql [start/stop/restart/reload/status] [vebita, kiniqe, intelliro, voltek]
 +</sxh>
 +
 +Agora vamos consultar o status do cluster da vebita 
 +<sxh bash>
 +/etc/init.d/postgresql status vebita
 +STATUS > vebita
 +9.1     vebita  5432 online postgres /var/lib/postgresql/9.1/vebita   custo
 +</sxh>
 +
 +Agora vamos parar o cluster da vebita 
 +<sxh bash>
 +/etc/init.d/postgresql stop vebita
 +STOP > vebita
 +</sxh>
 +
 +Agora vamos consultar o status do cluster da vebita 
 +<sxh bash>
 +/etc/init.d/postgresql status vebita
 +STATUS > vebita
 +9.1     vebita  5432 down   postgres /var/lib/postgresql/9.1/vebita   custom
 +</sxh>
 +
 +Vamos consultar os cluster para validar se somente a vebita esta down
 +<sxh bash>
 +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
 +</sxh>
 +
 +Agora vamos subir o cluster da vebita novamente
 +<sxh bash>
 +/etc/init.d/postgresql start vebita
 +START > vebita
 +</sxh>
 +
 +Agora vamos consultar o cluster da vebita novamente
 +<sxh bash>
 +/etc/init.d/postgresql status vebita
 +STATUS > vebita
 +9.1     vebita  5432 online postgres /var/lib/postgresql/9.1/vebita   custom
 +</sxh>
 +
 +Vamos consultar os cluster para validar se todos estão online
 +<sxh bash>
 +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
 +</sxh>
 +
 +
 +====== 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 
 +<sxh bash>
 +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
 +</sxh>
 +
 +Atualizando os repositorios 
 +<sxh bash>
 +apt-get update 
 +</sxh>
 +
 +Removendo pacotes problematicos 
 +<sxh bash>
 +apt-get remove vim-common -y
 +</sxh>
 +
 +Instalando os pacotes necessarios
 +<sxh bash>
 +apt-get install postgresql-9.1 postgresql-common postgresql-client-9.1 postgresql-9.1-plsh vim htop tcpdump nmap sudo -y
 +</sxh>
 +
 +Parando o PostgreSQL
 +<sxh bash>
 +/etc/init.d/postgresql stop
 +</sxh>
 +
 +Removendo o cluster padrão
 +<sxh bash>
 +rm -rf /var/lib/postgresql/9.1/main
 +</sxh>
 +====== Configurando a replica do Cluster para a Vebita ======
 +Agora vamos acessar o diretório de configurações do PostgreSQL
 +<sxh bash>
 +cd /etc/postgresql/9.1
 +</sxh>
 +
 +Vamos renomear a pasta base
 +<sxh bash>
 +mv main vebita 
 +</sxh>
 +
 +Agora vamos ajustar o postgresql.conf para a 
 +<sxh bash>
 +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 .'
 +</sxh>
 +
 +Agora vamos ajustar o pg_hba.conf para liberar o acesso da nossa rede ao PostgreSQL
 +<sxh bash>
 +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
 +</sxh>
 +
 +====== Configurando a replica do Cluster para a Kiniqe ======
 +
 +Agora vamos acessar o diretório de configurações do PostgreSQL
 +<sxh bash>
 +cd /etc/postgresql/9.1
 +</sxh>
 +
 +Agora vamos efetuar a copia dos arquivos para a Kiniqe
 +<sxh bash>
 +cp -Rfa vebita kiniqe
 +</sxh>
 +
 +Agora vamos ajustar as configurações para a Kiniqe
 +<sxh bash>
 +sed -i 's/vebita/kiniqe/g' kiniqe/postgresql.conf
 +sed -i 's/port = 5432/port = 5433/g' kiniqe/postgresql.conf
 +</sxh>
 +
 +
 +====== Configurando a replica do Cluster para a Intelliro ======
 +
 +Agora vamos acessar o diretório de configurações do PostgreSQL
 +<sxh bash>
 +cd /etc/postgresql/9.1
 +</sxh>
 +
 +Agora vamos efetuar a copia dos arquivos para o Intelliro
 +<sxh bash>
 +cp -Rfa vebita intelliro
 +</sxh>
 +
 +Agora vamos ajustar as configurações para o Intelliro
 +<sxh bash>
 +sed -i 's/vebita/intelliro/g' intelliro/postgresql.conf
 +sed -i 's/port = 5432/port = 5434/g' intelliro/postgresql.conf
 +</sxh>
 +
 +
 +====== Configurando a replica do Cluster para a Voltek ======
 +
 +Agora vamos acessar o diretório de configurações do PostgreSQL
 +<sxh bash>
 +cd /etc/postgresql/9.1
 +</sxh>
 +
 +Agora vamos efetuar a copia dos arquivos para o Voltek
 +<sxh bash>
 +cp -Rfa vebita voltek
 +</sxh>
 +
 +Agora vamos ajustar as configurações para o Voltek
 +<sxh bash>
 +sed -i 's/vebita/voltek/g' voltek/postgresql.conf
 +sed -i 's/port = 5432/port = 5435/g' voltek/postgresql.conf
 +</sxh>
 +
 +
 +====== 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
 +<sxh bash>
 +insserv -r -f -v postgresql
 +</sxh>
 +
 +Agora vamos mover o arquivo de controle do postgres
 +<sxh bash>
 +mkdir /srv/scripts 
 +mv /etc/init.d/postgresql /srv/scripts/
 +</sxh>
 +
 +Agora vamos adicionar o Postgres na inicialização do sistema 
 +<sxh bash>
 +vim /etc/rc.local
 +[...]
 +# By default this script does nothing.
 +/srv/scripts/postgresql start
 +exit 0
 +</sxh>
 +
 +Agora vamos criar os links para o serviço ser parado corretamente.
 +<sxh bash>
 +ln -s /srv/scripts/postgresql /etc/rc0.d/K05postgresql
 +ln -s /srv/scripts/postgresql /etc/rc6.d/K05postgresql
 +</sxh>
 +
 +
 +Agora vamos criar um script para manipular os clusters
 +<sxh bash>
 +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
 +</sxh>
 +
 +Agora vamos dar a permissão de execução para o script
 +<sxh bash>
 +chmod +x /etc/init.d/postgresql
 +</sxh>
 +
 +====== Criando o script para a replicação dos Clusters ======
 +
 +Vamos criar o script que controla a replicação dos cluster
 +<sxh bash>
 +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}
 +</sxh>
 +
 +====== Executando a replição do Cluster da Vebita ======
 +
 +Agora vamos executar o script de replicação 
 +<sxh bash>
 +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
 +</sxh>
 +
 +Agora vamos consultar o cluster da vebita
 +<sxh bash>
 +pg_lsclusters | grep -i vebita
 +9.1     vebita  5432 online,recovery postgres /var/lib/postgresql/9.1/vebita   custom
 +</sxh>
 +
 +Agora vamos consultar se temos um processo de streaming
 +<sxh bash>
 +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
 +</sxh>
 +
 +====== Executando a replição do Cluster da Kiniqe ======
 +
 +Agora vamos executar o script de replicação 
 +<sxh bash>
 +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
 +</sxh>
 +
 +Agora vamos consultar o cluster da Kiniqe
 +<sxh bash>
 +pg_lsclusters | grep -i kiniqe
 +9.1     kiniqe  5433 online,recovery postgres /var/lib/postgresql/9.1/kiniqe   custom
 +</sxh>
 +
 +Agora vamos consultar se temos um processo de streaming
 +<sxh bash>
 +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 
 +</sxh>
 +
 +====== Executando a replição do Cluster da Intelliro ======
 +
 +Agora vamos executar o script de replicação 
 +<sxh bash>
 +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
 +</sxh>
 +
 +Agora vamos consultar o cluster da Intelliro
 +<sxh bash>
 +pg_lsclusters | grep -i intelliro
 +9.1     intelliro 5434 online,recovery postgres /var/lib/postgresql/9.1/intelliro  custom
 +</sxh>
 +
 +Agora vamos consultar se temos um processo de streaming
 +<sxh bash>
 +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
 +</sxh>
 +
 +====== Executando a replição do Cluster da Voltek ======
 +
 +Agora vamos executar o script de replicação 
 +<sxh bash>
 +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
 +</sxh>
 +
 +Agora vamos consultar o cluster da Voltek
 +<sxh bash>
 +pg_lsclusters | grep -i voltek
 +9.1     voltek       5435 online,recovery postgres /var/lib/postgresql/9.1/voltek        custom
 +</sxh>
 +
 +Agora vamos consultar se temos um processo de streaming
 +<sxh bash>
 +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
 +</sxh>
 +
 +===== Referências =====
 +  * https://www.postgresql.org/docs/9.1/creating-cluster.html
 +  * https://severalnines.com/database-blog/running-multiple-postgresql-instances-single-host
 +  * https://www.postgresql.org/docs/9.1/server-start.html
 +  * https://www.postgresql.org/docs/9.1/app-pg-ctl.html
  
Print/export
QR Code
QR Code procecimento_para_configurar_multiplas_instancias_do_postgresql_single_host_debian_7 (generated for current page)