Commit e4925ba277b3611b4fae1df07cb52a217f032723
1 parent
a95abef3
Exists in
master
banco de dados doc
Showing
1 changed file
with
182 additions
and
0 deletions
Show diff stats
| ... | ... | @@ -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 | + | ... | ... |