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
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/*
Configurando o 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 = 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
Configurando o 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
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
Configurando o 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
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
Configurando o 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
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
Ajustando os scripts de incialização do PostgreSQL
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