Availability e Reliability
Nas conversas informais sobre arquitetura de sistemas, quando eu escuto “precisamos pensar na availability e na reliability do sistema”, numa tradução literal seria, “precisamos pensar na disponibilidade e na confiabilidade do sitema”. O que isso realmente quer dizer? Será que estamos falando sobre os mesmos pontos? Estamos falando dos pontos mais comuns? Quais são os seus pontos mais comuns? 🤔🤔
No dia a dia e no jargão de TI são inúmeras as possibilidades de atividades que podem ser pensadas ao falar desses dois tópicos, este post busca explorar alguns dos critérios de decisão que precisam ser pensados para aumentar a disponibilidade e confiabilidade de sistemas para web.
Definições importantes
Os termos availability ou disponibilidade, e, reliability traduzido para confiabilidade são termos da engenharia de processos e da engenharia de manutenção, eles também são utilizados pela engenharia de sistemas. A NBR-5462 traz a definição desses termos da seguinte forma:
-
Availability: Capacidade de um item estar em condições de executar uma certa função em um dado instante ou durante um intervalo de tempo determinado, levando-se em conta os aspectos combinados de sua confiabilidade, mantenabilidade e suporte de manutenção, supondo que os recursos externos requeridos estejam assegurados.
-
Reliability : Capacidade de um item desempenhar uma função requerida sob condições especificadas, durante um dado intervalo de tempo.
Availability e os famosos 99.999s
A disponibilidade refere-se à porcentagem de tempo que a infraestrutura ou componente do sistema permanece operacional em circunstâncias normais para atender ao propósito pretendido, a fórmula para calculá-la é a seguinte:
$$Availability \text{(%)} = \frac{ \text{Tempo Total} }{\text{Tempo Total} + \text{Soma do tempo de inatividade}}$$
Para ilustrar, suponha que um sistema qualquer, que no mês passado, trabalhou por 600 horas em modo pleno de sua capacidade e teve 30h de inatividade. Como calcular a disponibilidade alcançada por este sistema? Vejamos:
$$Availability \text{(%)} = \frac{ \text{600} }{\text{600} + \text{30}}$$ $$Availability \text{(%)} = \text{0,9523809524 }$$ $$Availability = \text{95,23 %}$$
A Tabela 01, mostra o tempo de inatividade que será permitido para um determinado nível de disponibilidade. Uma limitação que sempre existirá e nunca deve ser esquecida, quanto mais 9s depois da vírgula (,) mais confiável e mais caro será o componente.
Disponibilidade dos componentes
Construir a arquitetura de um produto para web é a arte de juntar várias peças em um grande quebra-cabeça. Ao criar uma arquitetura se faz necessário organizar alguns componentes ora em Série ora em Paralelo, essas configurações alteram completamente como são feitos os cálculos da disponibilidade do sistema pois seguem regras específicas para cada tipo de organização.
Para ter uma arquitetura funcional é necessário conhecer as características específicas de cada “peça”, a Tabela 02 traz valores de disponibilidades que utilizaremos nos cálculos a seguir.
COMPONENTE * | DISPONIBILIDADE AO MÊS (%) ** |
---|---|
Loab Balancer | 99,395 |
Linux Server | 99,232 |
DB (MySQL like) | 99,451 |
WAF | 99,354 |
Tabela 02 - Disponibilidade por componentes.
(*) O provedor foi escolhido sem nenhuma preferência pessoal ou comercial. Embora a documentação nas referÊncias aponte para um provedor específico, pode-se utilizar a mesma lógica para qualquer um dos provedores de cloud pública.
(**) O provedor de cloud não fornece uma SLA fixa, ele fornece alguns intervalos, nesses intervalos todos os componentes teriam uma disponibilidade semelhante. Para efeitos de ilustração, utilizei números próximos da realidade, porém não correspondentes com os valores informados pelo provedor de serviços.
Disponibilidade em sistemas em série
Para encontrar a disponibilidade de um sistema onde os componentes estão organizados em série, calcula-se o produto das disponibilidades dos componentes do sistemas, utilizando a seguinte fórmula:
$$D = \prod_{i=1}^n xi $$ $$D = \prod_{i=1}^n xi = x_1 \times x_2 \times x_3 … \times x_n$$
Onde
- Π - é igual ao produtório das disponibilidades dos componentes do sistema.
- n - é igual a quantidade total de componentes
- i - é o índice do conjunto dos componentes representando cada componente
- i=1 - é o primeiro elemento do conjunto dos componentes
- xi - é a variável indexada
Calculando a disponibilidade do sistema
O sistema fictício chamado Simple_Front_IMG, tem os seus de componentes listados na Tabela 03 e sua topologia conforme o Diagrama 01, com essas informações, a disponibilidade deste sistema seria calculado da seguinte forma:
QT | COMPONENTE |
---|---|
01 | WAF |
01 | Loab Balancer Front_end |
01 | Instância linux front_end |
01 | Loab Balancer Back_end |
01 | Instância linux back_end |
01 | DB |
Tabela 03 - Componentes da arquitetura em série.
Cálculo
$$\text{Disponibilidade Componente n = {WAF, LB, Linux_Server, DB}}$$ $$\text{ n = {0,99354 , 0,99395 , 0,99232 , 0,99451 }}$$ $$D = \prod_{i=1}^n xi $$ $$D = \prod_{i=1}^n xi = x_1 \times x_2 \times x_3 … \times x_n$$ $$D = \prod_{i=1}^n xi = 0,99354 \times 0,99395 \times 0,99232 \times 0,99451$$ $$D = 0,97554$$ $$D = 97,554\text{(%)}$$
A disponibilidade anual alcançada pelo sistema é de 97,554(%), segundo a Tabel01, este valor faz com que o sistema tenha aproximadamente 10 dias de downtime num período de um ano. Isso é muito ruim para um sistema web.
Disponibilidade em sistemas em paralelo
Para encontrar a disponibilidade de um sistema onde os componentes estão organizados em paralelo, calcula-se o produto das disponibilidades dos componentes do sistemas da seguinte forma.
$$ D = 1-\prod_{i=1}^n (1 -x_i) $$ $$ D = 1-\prod_{i=1}^n (1 -x_i) = 1 - ( 1- x_1 )\times ( 1 - x_2 ) \times ( 1 - x_3) … \times ( 1 -x_n) $$
Onde
- Π - é igual ao produtório das disponibilidades dos componentes do sistema.
- n - é igual a quantidade total de componentes
- i - é o índice do conjunto dos componentes representando cada componente
- i=1 - é o primeiro elemento do conjunto dos componentes
- (1-xi) - é a operação de um nemos xi que é a variável indexada
Calculando a disponibilidade do sistema
Mais uma vez utilizando um sistema fictício chamado Simple_Front_IMG, tem os seus de componentes listados na Tabela 04 e sua topologia conforme o Diagrama 02, com essas informações, a disponibilidade deste sistema seria calculado da seguinte forma:
QT | COMPONENTE |
---|---|
01 | WAF |
01 | LB Front_end |
03 | Instância linux front_end |
01 | LB Back_end |
03 | Instância linux back_end |
01 | DB |
Tabela 04 - Componentes da arquitetura em paralelo.
Neste exemplo foram criados dois componentes configurados para funcionar em paralelo ( Instâncias linux front_end e Instâncias linux back_end), utilzando os mesmos valores de disponibilidade de individuais, vejamos como fica a disponibilidade desses componentes:
Cálculo
$$\text{n={ Linux_Server_1 , Linux_Server_2 , Linux_Server_3 }}$$ $$\text{n={ 0,99232 , 0,99232 , 0,99232 }}$$ $$ D = 1-\prod_{i=1}^n (1 -x_i) $$ $$ D = 1-\prod_{i=1}^n (1 -x_i) = 1 - ( 1- x_1 )\times ( 1 - x_2 ) \times ( 1 - x_3) … \times ( 1 -x_n) $$ $$ D = 1-\prod_{i=1}^n (1 -x_i) = 1 - ( 1 - Linux_Server_1 )\times ( 1 - Linux_Server_2 ) \times ( 1 - Linux_Server_3) $$ $$ D = 1-\prod_{i=1}^n (1 -x_i) = 1 - ( 1 - 0,99232 )\times ( 1 - 0,99232 ) \times ( 1 - 0,99232) $$ $$ D = 1-\prod_{i=1}^n (1 -x_i) = 1 - ( 0,00768 )\times ( 0,00768 ) \times ( 0,00768) $$ $$ D = 1 - 0,000000452984832 $$ $$ D = 0,999999547 $$ $$ D = 99,9999547 \text{(%)}$$
A disponibilidade anual alcançada pelos componentes: Instância linux front_end e Instância linux back_end sistema é de 99,9999547(%), segundo a Tabel01, este valor faz com que os componentes tenham aproximadamente 31(segundos) de downtime num período de um ano. Isso é mais aceitável para um sistema web.
Resumo
Nos exemplos pode-se observar que a confiabilidade e a disponibilidade de componentes conectados em série é inferior às especificações dos componentes individuais, como mostrado no primeiro exemplo.
Não se pode mudar o valor da disponibilidade de um componente especificamente, pois este é fornecido pelo provedor de cloud, então deve-se lidar com valores fornecidos no dia a dia. O arquiteto da solução tem a liberdade de criar a arquitetura do sistema da forma que achar mais eficaz, entretanto, ao optar por colocar um componente em paralelo foi possível elevar a disponibilidade de 99,232% para 99,9999547% dentro sistema Simple_Front_IMG a um custo muito baixo conforme demonstrado no segundo exemplo.
A partir de agora, quando alguém falar “precisamos pensar na disponibilidade e na confiabilidade do sistema” você já sabe, significa olhar cada componente da arquitetura, conhecer suas disponibilidades individualmente e calcular o quanto ela representa dentro do seu sistema, dessa forma será possível sugerir as mudanças.
DICAS - Pesquisar sobre
- 💡 Load balancer server side
- 💡 Load balancer client side
- 💡 Distribuição de carga
Abraços!
Vida longa e próspera a todos!!
Referências
- NBR-5462, Confiabilidade e mantenabilidade
- Availability & Reliability : https://www.weibull.com/hotwire/issue79/relbasics79.htm
- https://en.wikipedia.org/wiki/High_availability
- Somatório e Produtório: http://arsilva.weebly.com/uploads/2/1/0/0/21008856/somatrio.pdf
- Expressões matemáticas em LaTeX : https://math.meta.stackexchange.com/questions/5020/mathjax-basic-tutorial-and-quick-reference
- Expressões matemáticas em LaTeX : http://www.malinc.se/math/latex/basiccodeen.php
- Caracteres especiais : https://gist.github.com/mrquincle/1102e58562411b7f633c08d5dc9a2e1f
- Diagramas as code : https://diagrams.mingrammer.com/
- Disponibilidade ELB - https://aws.amazon.com/elasticloadbalancing/sla/?did=sla_card&trk=sla_card
- Disponibilidade EC2 - https://aws.amazon.com/compute/sla/
- Disponibilidade Autora - https://aws.amazon.com/rds/aurora/sla/?did=sla_card&trk=sla_card
- Disponibilidade WAF - https://aws.amazon.com/waf/sla/?did=sla_card&trk=sla_card
- Diagrama 01 - https://github.com/leoml/blog-infraascode/blob/master/posts/availability-reliability/sistemas-em-serie.py
- Diagrama 02 - https://github.com/leoml/blog-infraascode/blob/master/posts/availability-reliability/sistemas-em-paralelo.py
MENTORIA
Curtiu o blog? Quer trocar uma ideia comigo sobre algum post?
Marca Aqui! É um papo gratuito
oferecido para quem é leitor do blog, podemos falar de temas como: DevOps, SRE e carreira em TI.
Te convido a ver os outros posts do blog Infra-as-Code garanto que tem coisas legais lá!!
|