sexta-feira, 8 de dezembro de 2017

Orquestradores - Aplicações e preocupações

 Presumo nesta publicação que já entendas de contêineres, caso precise temos um bom material para apresentar este conceito e passos iniciais, é a publicação do colega Maicon Baum que constará nas referências deste artigo.

 Independente do orquestrador que estejas utilizando, sendo os mais comuns Kubernetes ou Docker Swarm, os maiores problemas das plataformas são como dimensionar recursos para que atendam aos contratos com módulos ou microsserviços das aplicações que hospedam. 

 Não tenhas a ambição que os orquestradores resolverão automaticamente, ou por padrão de instalação, dimensionamento de aplicações, e ainda que o façam, este ponto envolve uma análise de regras operacionais das aplicações, viabilidade de escalonamento e expansão da própria plataforma, ou até mesmo a relação de custo e retorno das aplicações envolvidas. 

 É por essa razão que devemos nos atentarmos para limites e políticas sejam elas por contêiner, ou de forma mais inteligente por service (Docker Swarm) ou NameSpace (K8s). 

 Com relação a política, seja namespace ou stack, deves considerar condições que satisfaçam o bom  uso da plataforma quando relacionada às limitações de seu código.    

 De nada adianta liberar diversos processadores para uso de uma aplicação NodeJS se a mesma não foi desenvolvida para trabalhar multithread. Logo, isso força a mesma medida que permite a integração cada dia maior do desenvolvedor com o analista de infraestrutura da plataforma. Cito permite, pois proporciona a ambos um ganho de conhecimento. 

 Mencionaremos aqui como aplicar estes limites na prática nos orquestradores citados: Docker Swarm e Kubernetes. 

 IMPORTANTE: Em ambos é possível realizar a limitação por contêiner no Dockerfile, entretanto este não é o modelo mais eficiente quando estamos trabalhando com orquestradores e suas réplicas. 

 Docker Swarm

 Método(s) disponível(is) : Por serviço

 Aplicação: Na publicação do stack ou na criação, ou atualização individual dos serviços poderás utilizar restrições ou limitações de recursos.

 No site de documentação do produto existem exemplos de aplicação, seja criando um serviço ou atualizando um. 

 https://docs.docker.com/engine/reference/commandline/service_create



Kubernetes 

 Método(s) disponível(is) : 

 Resource Quotas

Quality of Service


Aplicação: O Kubernetes dispõe de um modelo mais eficiente e granular de administração de recursos, então temos dois modelos, um de QoS(quality of service) e outro de Resource Quota. 

  Documentação para aplicação dos métodos: 

 https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod
https://kubernetes.io/docs/concepts/policy/resource-quotas

 Um item não menos relevante é o gerenciamento de logs de sua aplicação, ainda que o limite de armazenamento de log possa ser administrado pelo orquestrador, isso demanda IO (entrada e saída) e por consequência deixar aplicações gravando informações desnecessárias e/ou com baixa criticidade afeta a performance da plataforma como um todo, lembre-se, seja na cloud pública, privada ou híbrida, IO é performance, e se tens bastante performance é porque também custa dinheiro. 


 Referências: 

 http://ilegra.com/beyonddata/2017/07/docker-for-beginners/

 Palavras chave de busca: 

 docker swarm k8s kubernetes container contêiner limites restrições constraints limits devops

  Agradecimentos:

 Agradeço ao engenheiro de infraestrutura, arquiteto de software e amigo Lincolm Aguiar (https://www.linkedin.com/in/lincolmaguiar) que foi parceiro de apresentação do talkabout que foi o conteúdo norteador e originou essa publicação.   

terça-feira, 16 de maio de 2017

Apache - KeepAlive problem



Dias atrás fomos desafiados por um evento intermitente e até então desconhecido. O time de desenvolvedores em questão, alegava que utilizando um sistema web via navegador, ao realizar um refresh (F5) a requisição para uma API que possuía o webserver Apache como frontend  pendurava e não mais respondia. Entretanto se apontavam a API para um managedserver* do WebLogic respondia corretamente. Isso impactava diretamente no sistema, degradando a imagem que o usuário tem deste sistema.  
Com integração entre os times, conhecimento específico e experiência dos envolvidos a causa foi identificada, nosso vilão ‘KeepAlive’ desativado, e mais um problema resolvido.

Inúmeros eventos nos levaram a estressar e aplicarmos testes com a finalidade de isolarmos o que era causa e o que era sintoma.


"Mas claro o KeepAlive...", devem estar pensando, até que pudéssemos chegar ao vilão, dezenas de análises, isolamentos e mudanças foram testadas, tais como atualizar versão do Apache, recompilar outros módulos do MPM (worker, prefork e event), e até outro módulo como ModProxy, por fim outro WebServer Nginx.


Este é o tipo de problema que adoramos ter todos os dias, desafios com alto grau de complexidade, para que possamos aprimorar e executar métodos de gestão de incidentes.

Uma pausa para refletir…

A carreira do profissional de middleware, vale a pena? Ainda existe demanda?
Enquanto a tendência dos entusiastas da tecnologia da informação é explorar e falar cada vez mais de soluções e métodos intangíveis, focando-se em discursos elegantes com palavras atuais como cloud*, Big Data*, machine learning*, entre outras tecnologias e métodos que em muitos casos ainda não são uma realidade dentro de sua organização, de nada adiantará saber escalar, balancear recursos, ou trabalhar com soluções inovadoras em cliques do mouse, ou classes requisitando SDKs  se o ambiente que sustentas e atua não está pronto para este tipo de uso, é instável e preso a um presente regulado por ausência de investimento em inovação.


Quando atuamos em um cenário deste, o generalista, profissional desejado por diversas organizações, não fará diferença. Pois serão erros, alertas e incidentes de tecnologias específicas, para estes casos somente o especialista será valioso e poderá dar uma resposta imediata.


Nos preocupa quando nos deparamos com profissionais focados em inovação, por exemplo, que sequer tem uma boa base de rede e sistema operacional.

E o profissional de middleware? Bem, este com uma base boa, conforme mencionado acima, sempre terá lugar quando todos fogem, quando escalar não resolve o problema, é quando resolve utiliza-se a um alto custo por aplicações e configurações má dimensionadas, sejam em uma infraestrutura pública ou privada.

O mercado exigirá do profissional de middleware uma boa adaptação às novas tecnologias e linguagens emergentes, mas assim como o administrador de banco de dados, não será nestes 10 ou 20 anos que ele verá o seu fim. Pois onde houver um servidor de aplicação como backend, um webserver como frontend, um cache ou balanceador de carga, existirá a necessidade de um profissional de middleware.

Entenda que ser um especialista em middleware, não faz de vocês ignorantes em outras áreas, mas especialistas atentos às inovações e que tem ciência das novas funcionalidades disponíveis no mercado.

Vamos então ao detalhamento técnico do problema com o KeepAlive?   

Unindo os relatos dos usuários e desenvolvedores que mencionaram que após clicar duas vezes no mesmo item do sistema o mesmo pendurava, avaliamos quais logs poderiam  nos apoiar no Apache e não identificamos informações relevantes, ainda que tenhamos passado a severidade do log dos módulos e core do Apache para debug.

O sintoma observado neste momento eram as conexões presas gerando WAIT nos servers do Apache, até o momento na versão 2.2 utilizando como MPM o Worker.

Após nós analisamos os logs dos containers Java, que processavam as requisições vindas do webserver tanto pelo sistema quanto para a API, começamos a evoluir, pois os managedservers* nos davam mais informações:

<20 17h57min17s="" brt=""> <[ServletContext@448764570[app:app module:app path:null spec-version:3.0]] Root cause of ServletException.
org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://192.168.1.245:85/api/rest/publico/usuarioCliente/findUsuarioById":Response had end of stream after 0 bytes; nested exception is java.io.EOFException: Response had end of stream after 0 bytes
 

Diante do cenário presente, buscamos após a análise o isolamento de componentes afetados, iniciando o isolamento por arquitetura, após soluções tecnológicas e por fim seus módulos.

Iniciamos os trabalhos em um ambiente controlado e sem concorrência onde a simulação foi viável, com backups realizados para que pudéssemos voltar ao marco 0.

Primeiramente eliminamos possíveis causas como rede, ajustes de sistema operacional e parametrização de Sysctl e Limits. Outro item isolado foi a criação de novos VirtualHosts, com novas portas, porque os atuais estavam usando outro modulo que gostariamos de isolar do problema que era o rewrite_module*. Após atualizamos a versão do Apache 2.2 para 2.4, sem sucesso na operação alternamos entre módulos MPM disponíveis, atualização do módulo de integração com o Weblogic, por fim substituição pelo ModProxy. Como tentativa de eliminação substituímos o Apache por Nginx.

Nenhuma alteração surtiu efeito a ponto de eliminar os sintomas.

Trabalhar em equipe não é apenas trabalhar em conjunto é preciso compartilhamento. Os resultados nunca são alcançados apenas por uma pessoa, é preciso compartilhar com o outro para chegar ao objetivo final.

Quando um colega não consegue avançar, o mesmo pede apoio a outro não por ter menos conhecimento, mas para que ganhe com isso uma nova percepção de atuação sobre o evento.


Então realizamos uma comparação de ambientes e análise de boas práticas. Com isso e em função do comportamento do ambiente analisado que culminou com este diagnóstico, desativamos o KeepAlive do ambiente isolado, testamos e juntamente com o time de desenvolvimento e analista de testes estressamos o sistema para garantir que não fosse um falso-positivo.    

O KeepAlive do Apache permite o reuso das conexões com o webserver, aumenta a performance e reduz o consumo de recursos. Entretanto o sistema não trabalha com um conteúdo estático volumoso, logo, por serem conexões dinâmicas o seu efeito era prejudicial e gerava por vezes erros HTTP 408 e CLOSE_WAIT na camada TCP do sistema operacional do webserver.
Logo, tenha em mente que o KeepAlive é uma configuração do Apache que torna reutilizáveis as requisições, entretanto existem relatos de que quando ativado pode prejudicar requisições com o método POST, que se aplica ao nosso caso.  


Legendas:
* managedserver : Instância do Weblogic gerenciadas por um Domain

* cloud : Cloud computing ou computação em nuvem é a entrega da computação como um serviço ao invés de um produto

* Big Data : Big data é o termo que descreve o imenso volume de dados – estruturados e não estruturados.

* machine leaning : A aprendizagem automática ou aprendizado de máquina (em inglês: "machine learning") é um sub-campo da ciência da computação que evoluiu do estudo de reconhecimento de padrões e da teoria da aprendizagem computacional em inteligência artificial.

* rewrite_module : Módulo do Apache que utiliza um mecanismo baseado em regras de reescrita (baseadas em um parser de expressões regulares).
Basicamente o módulo permite a reescrita de URL's _on the fly.



Referências:




Apresentação dos autores:

*Gabriel Prestes, formado em Gestão da Tecnologia da Informação, arquiteto de middleware da ilegra com experiência de mais de 8 anos em suítes de middleware Oracle e RedHat. É um entusiasta de carros antigos.

*Junior Amaral, formado em Tecnologia da Informação, Database Administrator (Oracle) e middleware da ilegra com experiência de mais de 15 anos em banco Oracle e 5 anos em suítes de middleware Oracle e RedHat. É um apaixonado por aviação.