Como consultor de banco de dados há um bom tempo, é inevitável não dispor de uma grande quantidade de histórias. Algumas divertidas, outras interessantes e, infelizmente, muitas tristes. Quando digo tristes, me refiro às situações onde me deparei com ambientes dignos de uma pegadinha, daquelas que você se pergunta onde está a câmera escondida. Pois bem, neste artigo vou contar uma história que qualquer profissional que trabalha com consultaria está sujeito.
Para os leitores que não entenderam o título, eu vou explicar. Após refletir sobre esta história, não pude deixar de compará-la com um programa da MTV chamado “Pimp My Ride”. Este programa, em resumo, escolhe um participante que possui um carro todo esculhambado. E quando digo esculhambado estou sendo generoso, pois a maioria dos veículos escolhidos é praticamente um lixo ambiente. O apresentador do programa vai até o dono do veículo, apresenta-se e diz que vai envenená-lo (pimp), no bom sentido, é claro.
Após apresentar o veículo para a equipe de produção do programa, isto é, os profissionais que fazem todo o trabalho “sujo”, a equipe começa a literalmente desmontar o veículo sempre evidenciando o estado lastimável do carro. É impressionante o que as pessoas fazem com seus veículos, chegando ao ponto de utilizar até um absorvente (?) para evitar que a chuva caia dentro do carro.
Depois da desmontagem a equipe do programa começa a fazer ajustes, leia-se quase completa reconstrução. O veículo então é re-apresentado ao seu dono, que fica abismado com o resultado. Pronto, o veículo está envenenado para a surpresa do dono. Um amigo me disse que já copiaram a versão americana do programa, e que a versão nacional deste programa se chama “Lata Velha” e é apresentado pelo Luciano Huck.
Voltado para a história da consultoria, lembro-me de ter sido chamado para prestar uma consultoria a uma empresa que estava com alguns problemas em seu banco de dados. Esta empresa utilizava uma aplicação para a Web desenvolvida em ASP (o antigo, não o ASP.NET) com um banco de dados SQL Server 2000. Com apenas estes detalhes em mãos me dirigi para o cliente.
Após a recepção, me encontrei com a equipe técnica responsável pela aplicação. Equipe era o que eu pensava, pois só havia um responsável técnico. Para não citar nomes, vamos chamar este profissional de Sr. José. Zé para os colegas de trabalho. Simpático, Zé me contou um pouco da história do ambiente. Disse-me que a aplicação foi desenvolvida e era de responsabilidade de dois outros profissionais, que receberam uma proposta de trabalho melhor e decidiram sair da empresa. Zé foi chamado às pressas e, em apenas uma semana, teve que aprender praticamente tudo sobre o negócio, a aplicação, o ambiente (servidores, cabeamento, links de internet etc) e do banco de dados. Como descobri depois, a aplicação e o ambiente são uma responsabilidade muito grande para apenas uma pessoa. Ainda mais com apenas uma semana de aprendizado. Pobre Zé, fez tudo ao seu alcance, mais ainda estava com muitas dificuldades para tocar o barco.
Infelizmente este cenário não me assusta mais. Já prestei tantas consultorias com situações semelhantes a esta que já me acostumei. Nestas situações, primeiro mantenho a calma e resolvo dar um passo por vez. Por acaso leitor, essa situação lhe traz alguma recordação? Caso positivo, isto apenas confirma a minha tristeza em reação às situações que muitos profissionais da área de Tecnologia da Informação estão sujeitos.
Após uma breve explicação sobre as regras de negócio e como a aplicação funcionava, bem por cima, pois nem Zé sabia direito muitas coisas, conheci os principais problemas que demandaram a minha consultoria. Zé me apresentou uma lista dos problemas que eu precisava ajudar a resolver, que incluíam: problemas com desempenho, defeitos na aplicação e falhas na segurança.
Vou abrir um pequeno parêntese aqui. Logo no começo do trabalho fiz questão de deixar bem claro que a minha especialidade é banco de dados e que, apesar de conhecer outras áreas, só poderia ajudá-lo no que diz respeito à minha especialidade.
Antes de começar a descrever tecnicamente o cenário com o qual me deparei, deixo aqui uma dica de profissionalismo: não procure culpar as pessoas, pelo menos não diretamente e não antes de resolver a situação. Em diversas situações é comum atribuir uma grande parte dos problemas aos técnicos envolvidos. Porém, nem sempre eles são culpados ou podem levar a culpa. Muitas vezes quem é o responsável pela parte técnica sofre pressões ou mesmo é orientado a proceder de certa maneira que, mais cedo ou mais tarde, vai gerar um problema sério. Por exemplo, já perdi a conta de quantas vezes tive que me debugar um código fonte escrito por alguém de madrugada, sendo sustentado por doses cavalares de café.
Por isso, raramente procuro culpados no momento em que me deparo com problemas graves. Ainda mais durante uma consultoria, pois este tipo de atitude pode levar à atritos com a equipe técnica da empresa.
Voltando para o ambiente e para o Zé, fui dar uma olhada em seu servidor de banco de dados, que estava sendo executado em uma máquina dedicada para o banco de dados da aplicação Web.
Lembrando-se agora, gostaria que o Zé tivesse me preparado psicologicamente para o que eu iria encontrar. Sabe um daqueles acidentes de trânsito com engavetamento? Pois é, isso descreve parcialmente a confusão que estava neste servidor. Vou descrever aqui os “pequenos” problemas, de acordo com o Zé.
Verificando a memória utilizada, constatei que o servidor já tinha consumido toda a memória física e já estava utilizando a memória virtual. Quase sem espaço nas duas HDs, o servidor estava tão lento que até para logar demorar um tempão. O mais impressionante, porém, foi descobrir a quantidade de vírus (isso mesmo, vírus no servidor de banco de dados!) e de aplicativos de usuário instalados. Segurança? Praticamente nenhuma, pois além da senha do administrador ser curta, já fazia pelo menos um ano que ela não era trocada.
Fiquei receoso de perguntar sobre backup. “Bom, de vez em quando eu copio o conteúdo da pasta Meus Documentos para um CD que fica ali na gaveta”, disse-me Zé quando lhe perguntei sobre cópias de segurança.
Atualizações? “Uma vez eu tentei aplicar o SP2 no servidor mais demorou muito e parei o processo”, afirmou Zé. Neste ponto eu já imaginava como é que a aplicação estava de pé funcionando neste ambiente….
“O que mais faltava?”, pensei eu. Mais ainda tinha muito mais por vir! Zé me disse que, não raramente, a rede ficava tão lenta que não dava nem para acessar remotamente o servidor. Mas o pior mesmo, segundo ele, era quando o servidor simplesmente desligava sem nenhuma razão aparente, tornando indisponível a aplicação Web. E, por falar na aplicação, ele me disse que o dono da empresa estava pensando em cancelar todo o site, pois devido aos inúmeros problemas, não estava valendo a pena manter os custos operacionais. Isto por que a aplicação chegou a ser responsável por 5% do faturamento da empresa.
Logo que eu e o Zé terminamos de levantar todos os principais problemas, procurei deixar uma coisa bem clara: da mesma maneira que no programa “Pimp My Ride”, eu sempre presto consultoria não apenas para resolver o problema imediato do cliente, mais também para mostrar, passo a passo, o que foi feito, aproveitando a oportunidade para treinar e capacitar os profissionais envolvidos. Acredito que, desta maneira, não apenas resolvo o problema imediato, que muitas vezes pode ser descrito como “apagar incêndios”, mas também agrego conhecimento à equipe técnica responsável.
Voltando para o ambiente, o primeiro passo foi planejar como implementar todas as mudanças necessárias com o menor downtime possível, isto é, alterar as configurações do servidor sem deixar o site fora do ar. Utilizamos temporariamente um servidor, com menor poder de processamento, memória e disco, com uma cópia do banco de dados para possibilitar as alterações do servidor. A aplicação também foi modificada, por Zé, alertando aos usuários que alguma instabilidade poderia ocorrer durante o período de manutenção. Feito isso, nos propusemos a modificar o servidor de banco de dados.
O primeiro passo foi desabilitar uma série de serviços desnecessários. Suporte à multimídia, impressão e serviços de acesso remotos não essenciais foram apenas alguns dos serviços desabilitados. Só com esta ação o servidor já apresentou uma diminuição na memória utilizada. O próximo passo foi retirar todos os vírus, spywares e outras pragas virtuais. Após esta retirada, foi a vez de remover uma série de softwares desnecessários, como leitores de e-mail, plug-ins para o navegador e muitos outros. Para garantir que nenhum outro tipo de software desnecessário fosse instalado, foram configuradas políticas de domínio para bloquear a execução de uma série de aplicações, incluindo os navegadores.
O próximo passo foi passar todas as atualizações: service packs do windows, service packs do SQL Server e demais patchs e hotfixes. Em seguida, combinei com Zé que deveríamos instituir uma política se usuários e senhas, reforçadas por regras como:
- Troca de senha a cada três meses;
- Desabilitar as contas padrão;
- Forçar senhas com letras, números e caracteres especiais que tenham um tamanho mínimo de 10 posições;
- Outras políticas gerais de senha, como o cancelamento após um algumas tentativas e horários definidos para certos usuários.
Um detalhe importante a ser considerado, quando se fala de política de senhas, é a parte humana. Deixei bem claro para Zé que apenas reforçar a segurança com soluções tecnológicas não adiantava muito: é importante reforçar a segurança com políticas que envolvam as pessoas como, por exemplo, políticas que deixam claro que os administradores não devem anotar senhas em um papel. Infelizmente é necessário também definir certas punições para evitar o risco de quebra na segurança e também para coibir os usuários a vazar informações. No final das contas, um documento contendo a política de segurança foi escrito.
Mais alguns acertos no servidor e partimos para o banco de dados. O primeiro passo foi identificar o que estava sendo utilizado ativamente pela aplicação e o que era histórico. Com a posse desta informação, “quebrei” o banco de dados em dois, com o objetivo de separar as informações mais utilizadas daquelas que foram consideradas histórico.
Além disso, modifiquei parâmetros específicos no servidor para garantir que o acesso a memória seja mais “econômico” e que o banco de dados não cresça tanto. Alias o problema de espaço em disco esta ligado ao banco de dados: como não havia backup periódico do banco de dados, e este estava com o recovery Model Full e com todas as opções de auto-crescimento habilitadas (o que, infelizmente, é a realidade em muitas empresas que adotam o SQL Server como servidor de banco de dados) o arquivo de Transaction Log cresceu absurdamente. Modifiquei as configurações da base de dados, separei os arquivos de dados e de Transaction log e elaborei uma rotina de backup periódica e automática para resolver estes problemas. Sempre lembrando que, a cada modificação no servidor ou ação tomada, eu explicava para Zé o que estava acontecendo, que se encarregava de documentar o procedimento.
Com a questão da memória e do disco resolvidas, fui verificar o uso do processador. Apesar de possuir um alto pode de processamento, não raramente a CPU acusava o uso de 100% de processamento. Comecei a identificar os pontos onde isso acontecia e, aplicando técnicas para distribuir a carga, utilizar índices e otimizar stored procedures, consegui evitar o uso excessivo de processamento, por parte do servidor de banco de dados. Memória, CPU e disco já estavam ajustados, só faltava agora a rede.
Para entender o porquê da lentidão na rede, tive que analisar como a aplicação interagia com o servidor de banco de dados. Para isso, utilizar o Profiler e captei as principais consultas enviadas para o servidor de banco de dados. E não eram poucas. Resolvei, então, que deveríamos fazer pequenas modificações pontuais na aplicação: evitar solicitar muitas consultas diretamente para o servidor, trocando-as por chamadas à stored procedures, limitar a quantidade de linhas retornadas a partir do banco de dados, com a paginação de resultados, e utilização maciça do cachê. Com o uso destas técnicas, conseguimos diminuir em cerca de 60% o consumo de rede, com base na troca de informações entre o servidor de banco de dados e o servidor de aplicações.
Mais ainda faltava muita coisa para ser feita. Mais especificamente, faltava acertar problemas de desempenho e também a questão da disponibilidade. E, talvez o mais importante, tomar medidas pró-ativas, para evitar que Zé fosse chamado de madrugada para apagar um “incêndio” decorrente de um defeito no ambiente.
Neste ponto, já revertemos o servidor de banco de dados temporário para o servidor oficial. A partir desta reversão, pude verificar quais são as verdadeiras consultas enviadas pela aplicação em horários de extremo uso (picos de usuários) e nos horários mais folgados. Com base nisso, e também em uma análise do que os usuários mais fazem na aplicação, comecei a esquadrinhar a próximas modificações. Como na maioria das aplicações WEB, os usuários fazem mais visualização de dados do que gravação, isto é, a maioria dos usuários somente joga os produtos no “carrinho” ou apenas os vê, sendo que, em contrapartida, apenas uma pequena parcela dos usuários finaliza as compras e grava dados na base.
Existem muitas técnicas para otimizar o desempenho. Neste caso específico, o que mais gerou resultados positivos foi a utilização de índices e a re-escrita das consultas da aplicação. Obviamente, antes de começar a fazer os testes verifiquei qual o tempo médio que os usuários gastavam nas operações mais comuns e qual seria o tempo ideal, de acordo com o conhecimento do Zé e de outros especialistas no negócio. Além disso, deixei claro que, para manter o tempo de resposta, verificaria apenas o banco de dados, que na maioria das vezes NÃO é o principal responsável. Esta última frase pode até gerar polêmica, mas eu me reservo no direito de fazer esta afirmação com base na minha experiência em consultoria de banco de dados. Mais uma vez, a idéia aqui não é apontar dedos e procurar culpados, mais sim alertar para os problemas.
Após resolver os principais problemas, comecei a explicar para o Zé que apenas isso não serie necessário: de nada adiantaria deixar o ambiente limpo, otimizado e controlado se, por algum motivo bobo, tudo fosse água abaixo em um momento de grande utilização. Na área de sistemas, e em particular na parte administrativa, a maioria das pessoas nem lembra que o sistema existe. Porém, é só um pequeno erro aparecer que lá vêm os usuários com dez pedras na mão. Sem contar que quase não há reconhecimento quando tudo funciona corretamente. Mas quando algo, por menor que seja, não funciona como esperado… é melhorar estar preparado, pois alguém, mais cedo ou mais tarde, vai te procurar. E, de acordo com a lei de Murfy que costuma reinar na área de T.I., será no pior momento possível.
Após deixar este ponto bem claro, comecei a explicar a importância da disponibilidade. Como trabalhamos com máquinas, todos esperam que elas estejam disponíveis 24 horas por dia, nos 365 dias do ano. Infelizmente, para se obter este tipo de disponibilidade, é necessária uma grande quantidade de recursos. Não apenas hardware, como RAID, link de rede redundante, gabinetes com fonte extra etc, mas também na parte de software e de pessoal. Ter a consciência que gastos para se obter uma disponibilidade razoável são necessário é o primeiro passo a ser dado. Ás vezes isso é muito mais uma questão cultural do que técnica, mas esse já é assunto para outro artigo.
No ambiente do Zé, expliquei quais seriam algumas das ações para garantir o mínimo de disponibilidade. Configurei uma replicação transacional do ambiente de produção para um ambiente de backup. Além disso, mostrei na prática como agir caso algum erro acontecesse. A rede caiu? Faltou força? A HD do servidor ficou sem espaço em disco? Uma fonte do servidor queimou? Cara uma destas situações, e outras mais desastrosas, foram documentadas, priorizadas, organizadas e praticadas, indicando quais os recursos necessários para se resolver o problema, quanto tempo, em média, seria gasto para resolver esta solução e quem seria o responsável por isso. Junto com este documento, e com o treinamento prático, uma lista de responsáveis por manter esta alta disponibilidade foi elaborada.
Com base em outras soluções técnicas, conseguimos estimar uma disponibilidade aceitável, a partir dos recursos disponíveis. Mais uma vez, deixei claro que, quanto maior for a disponibilidade desejada, mais caro vai sair. Por fim, Zé me fez um elogio, pois ele nunca tinha visto tanta preocupação com a disponibilidade da parte técnica.
Em seguida, comecei a falta sobre as ações pró-ativas. Este, no meu ponto de vista, é um tópico fundamental para quem trabalha com administração/desenvolvimento. Agir de forma pró-ativa é muito importante pois, caso contrário, é melhor se acostumar a ser chamado de madrugada para apagar incêndios.
Mais uma vez, saber agir de forma pró-ativa requer ultrapassar uma grande barreira cultural. Aqui devemos combater a máxima: em time que está ganhando não se mexe. Alias, quando ouço isso já me preparo para gastar um bom tempo explicando a necessidade de mudança de atitude.
Ser pró-ativo significa agir antes do problema. Enxergar depois da curva. Levar o bolo enquanto os outros ainda estão trazendo a farinha. Agindo desta maneira, efetivamente estamos fazendo as máquinas trabalharem para nós e não o contrário.
Voltando para a consultoria, expliquei para o Zé é que é um Capacity Plan (plano de capacidade) e como montar um. Com as estimativas contidas neste documento, pode-se planejar o consumo futuro de recursos, como quando é necessário adicionar uma nova HD ao servidor. Obviamente, este documento contém apenas algumas estimativas, que devem ser atualizadas periodicamente, e representam apenas um passo inicial.
Em seguida, a parte prática: configurar auditoria no SQL Server, criar alertas do SQL Server baseados nos marcadores de desempenho do Windows, utilizadas rotinas administrativas periódicas no servidor para limpeza, otimização, organização e coleta de dados, geração automática de relatórios do ambiente (enviadas por e-mail) e criação de uma série de atitudes automáticas que o sistema pode realizar em casos de problemas. Estas tarefas consomem tempos e recursos, mas em situações extremas, é um verdadeiro alívio contar com elas.
Já estava quase no final da consultoria quando resolvi deixar bem claro para Zé que, apesar de tudo que tínhamos feito, de nada adiantaria a consultoria e as ações tomadas se as práticas não fossem seguidas. O que quis dizer foi o seguinte: Se você deixar o cavalo solto ele vai embora junto com o primeiro que passar. Por isso é importante a atribuição de responsabilidade e o profissionalismo constante, para manter tudo aquilo que foi ganho pelas ações tomadas.
Acabada a parte técnica, resolvemos fazer uma pequena apresentação para os superiores de Zé, tanto para “mostrar serviço” como para indicar que tudo aquilo não foi feito em vão. Da mesma maneira que no programa “Pimp My Ride”, choviam elogios. Acreditem: mostrar como era antes e como ficou depois possui um grande apelo. E o mais importante de tudo: deixar claro que o que foi feito não é mágica, mas sim o resultado de trabalho duro, dedicação, esforço e muita, mas muita força de vontade para resolver os problemas.
Um grande abraço e até a próxima coluna.