Availability e Reliability

Image: Availability 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.

Tabela 01: Availability Reliability - Fonte Wikipedia

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.

Diagrama 01: Topologia de um sistema 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.

Diagrama 02 - Topologia de um sistema 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


Eu adoraria ouvir suas outras histórias e situações semelhantes ao que acabei de escrever neste post, você pode me encontrar em @infraascode_br ou linkedin.com/in/leonardoml/ .

Te convido a ver os outros posts do blog Infra-as-Code garanto que tem coisas legais lá!!


--- --- IMPORTANTE --- ---
As opiniões aqui expressas são pessoais e de responsabilidade única e exclusiva do autor, elas não refletem necessariamente a posição das empresas que eu trabalho(ei) e/ou presto(ei) serviço.