Commit e4925ba277b3611b4fae1df07cb52a217f032723

Authored by Marcelo Linhares Castro
1 parent a95abef3
Exists in master

banco de dados doc

Showing 1 changed file with 182 additions and 0 deletions   Show diff stats
sei-banco.md 0 → 100644
... ... @@ -0,0 +1,182 @@
  1 +# Banco de Dados
  2 +
  3 +A base de dados do SEI deve ser vista a partir da união do banco de dados e dos arquivos anexos que ficam em filesystem.
  4 +
  5 +Neste documento vamos denominar:
  6 +- bd: banco de dados do SEI em mysql
  7 +- arquivos anexos: arquivos de conteúdo diverso, binário ou não, que o SEI permite que seja feito o upload por seus usuários
  8 +- base de dados: união entre bd e arquivos anexos
  9 +
  10 +O BD possui diversas informações estruturais e funcionais do sistema SEI, enquanto os arquivos anexos são documentos diversos que são subidos até a aplicação via upload.
  11 +
  12 +
  13 +## Requisitos
  14 +
  15 +Tanto o banco de dados quanto o filesystem com os arquivos anexos possuem os seguintes requisitos:
  16 +
  17 +- não é permitido, em caso de crash ou problemas, a perda de informações
  18 +- a principal ação deve estar na guarda e backup dos dados e logs binários do banco e arquivos anexos para garantir perda zero de informação
  19 +- a segunda principal ação deve estar relacionada a disponibilidade do serviço
  20 +- velocidade aceitável de leitura e escrita para a carga requerida do Ministério do Planejamento
  21 + * 300 transações / segundo
  22 + * 1.4 GB de crescimento / dia do BD
  23 + * 11 GB / dia de crescimento da base de dados
  24 +- deve-se permitir, em caso de necessidade, recuperar os dados na forma point in time recovery, podendo voltar até 1 ano atrás da posição atual
  25 +- portanto os logs binários devem ser mantidos pelo período de pelo menos 1 ano
  26 +
  27 +## Profissional Necessário
  28 +
  29 +O profissional necessário para manter a solução deverá ter os conhecimentos em mysql server 5.7.
  30 +
  31 +Dentre as suas competências deverão constar, no mínimo:
  32 +- instalação / sustentação de mysql server 5.7 em ambiente produtivo
  33 +- implementação de réplica em log binário (master/slave)
  34 +- tuning da base de dados de acordo com o ambiente e expectativas do cliente
  35 +- recuperação de desastres do mysql server
  36 +- point in time recovery de base de dados
  37 +- geração e otimização de dumps
  38 +- análise de logs com relatórios objetivos apontando gargalos e melhorias na infraestrutura
  39 +- médio conhecimento em linux
  40 +
  41 +## Necessidades Específicas para a Base do SEI
  42 +
  43 +O profissional responsável pela base deverá constantemente:
  44 +- garantir que a réplica esteja há menos de 5 segundos do master
  45 +- garantir que a rotina de rsync dos arquivos anexos esteja a menos de 3 minutos dos arquivos de produção
  46 +- garantir a disponibilidade de 99% da base de dados master (considerando dias úteis)
  47 +- informar a DTI sobre qualquer erro ou situação que possa comprometer o ambiente
  48 +- informar imediatamente a DTI sobre qualquer indisponibilidade ou lentidão
  49 +
  50 +
  51 +## Tecnologias
  52 +
  53 +Atualmente o banco de dados é mysql 5.7 com uma réplica também em mysql 5.7.
  54 +Para os arquivos anexos, estamos usando Storage - EMC, com NFS ativado para leitura e escrita dos dados
  55 +
  56 +## Arquitetura
  57 +
  58 +- Arquivos Anexos:
  59 + * 192.x.x.x
  60 + * diretório NFS: /SEI_PROD_xx
  61 +
  62 +- Mysql Master
  63 + * 192.x.x.x
  64 + * servidor físico com 24 cores e 64GB
  65 + * servidor compartilhado com o PDCMP
  66 + * data do mysql: /dados_banco/mysql/data
  67 + * logs binários do mysql: /dados_banco/mysql/binlog
  68 +
  69 +- Mysql Slave - Virtual
  70 + * 192.x.x.x
  71 + * servidor virtual 8 cores e 11GB
  72 + * data do mysql: /dados_banco/mysql/data
  73 + * logs binários do mysql: /dados_banco/mysql/binlog
  74 +
  75 +
  76 +- Mysql Slave - Física
  77 + * 192.x.x.x
  78 + * servidor físico 8 cores e 32GB
  79 + * data do mysql: /replica_bd/mysql/data
  80 + * logs binários do mysql: /replica_bd/mysql/binlog
  81 + * diretório para backup - dumps: /replica_bd/backup/dumps (aponta para Storage VNX)
  82 + * diretório para backup - logs binários: /replica_bd/backup/logbinarios (aponta para Storage VNX)
  83 +
  84 +
  85 +## Rotinas
  86 +
  87 +Para garantir a guarda das informações, inclusive a reconstrução da base de dados em caso de crash, foram implementadas as seguintes ações:
  88 +
  89 +- réplica nativa do mysql usando um master e um slave
  90 +- logs binários independentes do master e slave
  91 +- para os arquivos anexos há quatro rsync rodando, replicando todo o filesystem do diretório de origem para o diretório de backup
  92 +- toda terça e sábado roda um crontab que tira o dump da réplica e salva no diretório de backup
  93 +
  94 +### Rotina dos arquivos anexos
  95 +
  96 +- crontab agendado no root
  97 + * crontab que roda de 5 em 5 segundos copiando todos os arquivos anexos do diretório de prododução para os diretórios de backup (note o flock para impedir a execução ao mesmo tempo de várias instâncias da rotina)
  98 +
  99 +```
  100 +0 0,7,21 * * * flock -n lock_file_prod -c "/root/scripts/copia_prod_replica.sh"
  101 +0 1,8,22 * * * flock -n lock_file_prod_to_ibm -c "/root/scripts/copia_prod_to_ibm.sh"
  102 +* * * * * flock -n lock_file_prod_dodia -c "/root/scripts/copia_prod_replica_dodia.sh"
  103 +* * * * * flock -n lock_file_prod_to_ibm_dodia -c "/root/scripts/copia_prod_to_ibm_dodia.sh"
  104 +* * * * * flock -n lock_file_replica_dodia -c "/root/scripts/copia_replica_sei_anexos_dodia.sh"
  105 +0 1,8,22 * * * flock -n lock_file_replica -c "/root/scripts/copia_replica_sei_anexos.sh"
  106 +19 9,12,16,21,22,23 * * * flock -n lock_file_bin -c "/copia_sei/scripts/sei_bkp_binlogs.sh"
  107 +
  108 +```
  109 +
  110 +* conteúdo do copia_prod_replica_dodia.sh
  111 +
  112 +```
  113 +
  114 +#!/bin/bash
  115 +
  116 +#pegar ano mês e dia
  117 +
  118 +PATTERN=$(date +%Y/%m/%d)
  119 +
  120 +for i in $(seq 1 10)
  121 +do
  122 +
  123 + if [ -d "/SEI_PROD/sei_anexos/$PATTERN" ]; then
  124 +
  125 + if [ ! -d "/SEI_REPLICA/sei_anexos/$PATTERN" ]; then
  126 + mkdir -p /SEI_REPLICA/sei_anexos/$PATTERN
  127 + #echo "criei /tmp/dst/$PATTERN"
  128 + fi
  129 +
  130 + #echo $PATTERN
  131 + rsync -a /SEI_PROD/sei_anexos/$PATTERN/* /SEI_REPLICA/sei_anexos/$PATTERN/
  132 +
  133 + fi
  134 +
  135 +sleep 5
  136 +
  137 +done
  138 +```
  139 +
  140 +### Rotina do Dump da Base
  141 +
  142 +- crontab
  143 +
  144 +```
  145 +0 0 * * 3,6 /copia_sei/scripts/sei_bkp_bd.sh
  146 +```
  147 +
  148 +- arquivo sei_bkp_bd.sh
  149 +
  150 +```
  151 +#!/bin/bash
  152 +
  153 +#vUSER="USERNAME"
  154 +vPASS="<<password>>"
  155 +DATA=$(date +%Y-%m-%d-%H.%M.%S)
  156 +
  157 +echo "" >> /copia_sei/scripts/result.log
  158 +echo "Parando Réplica: $DATA" >> /copia_sei/scripts/result.log
  159 +
  160 +mysqladmin stop-slave -u$vUSER -p$vPASS
  161 +
  162 +echo "Réplica parada. Iniciando Dump" >> /copia_sei/scripts/result.log
  163 +
  164 +mysqldump -u$vUSER -p$vPASS --master-data=2 --max_allowed_packet=500M --databases sei sip > /copia_sei/dumps_base/dmp_$DATA.dump
  165 +
  166 +echo "Dump feito. Restartando Slave" >> /copia_sei/scripts/result.log
  167 +
  168 +mysqladmin start-slave -u$vUSER -p$vPASS
  169 +
  170 +echo "Slave Restartado. $(date +%Y-%m-%d-%H.%M.%S)" >> /copia_sei/scripts/result.log
  171 +```
  172 +
  173 +## Rotacionamento dos dumps e Logs
  174 +
  175 +O rotacionamento dos logs binários ainda não foi implementado.
  176 +
  177 +É feito manualmente.
  178 +
  179 +Deve-se tomar o cuidado de rotacionar apenas o que já foi armazenado pelo netbackup e teve a guarda armazenada em fita.
  180 +
  181 +Poderá, no futuro, implementar rotina automática para rotacionamento.
  182 +
... ...