Skip to content

Instantly share code, notes, and snippets.

@scovl
Created March 5, 2025 16:10
Show Gist options
  • Select an option

  • Save scovl/2ee7de7a0caf039675c3e2c81a4fdc42 to your computer and use it in GitHub Desktop.

Select an option

Save scovl/2ee7de7a0caf039675c3e2c81a4fdc42 to your computer and use it in GitHub Desktop.
sonar

Estratégias de Escalabilidade do SonarQube Community Edition

Sumário

Estratégias de Escalabilidade

Proposta 01: ECS com Terraform

A primeira proposta baseia-se no AWS Elastic Container Service (ECS) utilizando Terraform para provisionar a infraestrutura, conforme o guia detalhado de Alexander Hose em https://alexanderhose.com/transform-your-code-quality-with-sonarqube-on-aws-ecs-a-comprehensive-guide/.

Arquitetura da Infraestrutura

A arquitetura proposta para escalar o SonarQube Community Edition utilizando AWS ECS inclui:

  1. VPC (Virtual Private Cloud): Isola a infraestrutura em sub-redes públicas e privadas.
  2. ECS (Elastic Container Service): Gerencia a execução de contêineres do SonarQube.
  3. EFS (Elastic File System): Armazena dados compartilhados, como plugins e logs.
  4. RDS (Relational Database Service): Hospeda o banco de dados do SonarQube.
  5. ALB (Application Load Balancer): Distribui o tráfego entre as instâncias do SonarQube.
  6. KMS (Key Management Service): Criptografa credenciais e dados sensíveis.

Vantagens:

  1. Simplicidade Serverless: O uso do ECS com Fargate elimina a necessidade de gerenciar servidores físicos ou máquinas virtuais, reduzindo a complexidade operacional.
  2. Infraestrutura como Código (IaC): O Terraform permite a criação e gerenciamento da infraestrutura de forma automatizada e replicável.
  3. Escalabilidade Automática: O ECS pode escalar automaticamente com base na demanda, utilizando políticas de auto-scaling.
  4. Integração com AWS: A solução é totalmente integrada com serviços AWS como RDS, EFS, ALB e KMS, facilitando a gestão de recursos.

Desvantagens:

  1. Limitação da Versão Community: A versão Community do SonarQube não suporta clusterização, o que impede a escalabilidade horizontal efetiva. O ECS pode escalar os contêineres, mas o SonarQube ainda estará limitado a uma única instância funcional.
  2. Dependência do EFS: O uso do Elastic File System (EFS) para armazenamento compartilhado pode introduzir latência e aumentar os custos, especialmente para um grande volume de projetos (138 mil).
  3. Custo Elevado: A combinação de ECS Fargate, EFS e RDS pode resultar em custos operacionais significativos, especialmente para uma carga de trabalho grande.
  4. Complexidade de Configuração: A configuração detalhada do Terraform pode ser complexa e exigir conhecimento avançado de IaC e AWS.

Problemas que não resolve:

  • Escalabilidade Horizontal: Apesar do ECS permitir escalar contêineres, o SonarQube Community Edition não suporta clusterização, o que limita a escalabilidade real.
  • Gerenciamento de Workers: A versão Community só permite um único worker para tarefas de background, o que pode se tornar um gargalo.
  • Reindexação do Elasticsearch: O Elasticsearch embutido no SonarQube não pode ser escalado separadamente, o que pode impactar o desempenho em grandes volumes de dados.

Embora o ECR permita armazenar múltiplas versões da imagem do SonarQube, isso por si só não resolve a escalabilidade. O versionamento é útil para rollbacks e testes, mas não impacta diretamente a capacidade de escalar o serviço. A escalabilidade depende mais da configuração do ECS e do Fargate do que do ECR.


Proposta 02: ECS com Cluster.dev

A segunda proposta utiliza o AWS ECS com o Cluster.dev como ferramenta de Infraestrutura como Código (IaC), conforme detalhado por Sidath Munasinghe em https://aws.plainenglish.io/streamlining-sonarqube-on-aws-ecs-simplified-deployment-using-cluster-dev-0b988536fff0.

Componentes Principais

  • ECS com Fargate: Executa contêineres SonarQube de forma serverless, com auto-scaling baseado em CPU e memória.
  • RDS PostgreSQL: Banco de dados gerenciado para resiliência e escalabilidade.
  • ALB (Application Load Balancer): Distribui tráfego entre tarefas ECS.
  • Cluster.dev: Orquestra recursos AWS via Terraform, utilizando unidades como ECSCluster, ECSTaskDefinition, e ECSService.
  • Security Groups: Controlam o acesso entre componentes.

Foco na Escalabilidade

A escalabilidade é alcançada por meio de políticas de auto-scaling no ECS Service, que ajustam dinamicamente o número de tarefas conforme a demanda, suportadas pelo ALB para balanceamento de carga.

Vantagens:

  1. Abstração Simplificada: O Cluster.dev abstrai parte da complexidade do Terraform, facilitando a implantação e gerenciamento da infraestrutura.
  2. Auto-scaling Fluido: O uso do ECS com Fargate permite um auto-scaling mais dinâmico, ajustando o número de tarefas com base na demanda.
  3. Menor Dependência do EFS: Esta proposta evita o uso do EFS, o que pode reduzir custos e latência.
  4. Segurança Estruturada: O uso de Security Groups e a integração com serviços AWS como RDS e ALB proporcionam uma configuração de segurança mais robusta.

Desvantagens:

  1. Limitação da Versão Community: Assim como na Proposta 01, a versão Community não suporta clusterização, o que limita a escalabilidade horizontal.
  2. Custo Ainda Elevado: Embora o EFS não seja utilizado, o uso de Fargate e RDS ainda pode resultar em custos significativos.
  3. Flexibilidade Limitada: A solução é menos flexível que Kubernetes (EKS), o que pode limitar opções de personalização e escalabilidade futura.
  4. Dependência de Contêineres Temporários: A ausência de EFS pode exigir o uso de contêineres temporários para armazenamento, o que pode não ser ideal para grandes volumes de dados.

Problemas que não resolve:

  • Escalabilidade Horizontal: A limitação da versão Community impede a escalabilidade horizontal, mesmo com o uso de ECS e Fargate.
  • Gerenciamento de Workers: Apenas um worker é permitido, o que pode ser insuficiente para processar 138 mil projetos.
  • Reindexação do Elasticsearch: O Elasticsearch embutido continua sendo um gargalo, pois não pode ser escalado separadamente.

Proposta 03: EKS com Kubernetes

A terceira proposta utiliza o Amazon Elastic Kubernetes Service (EKS) para hospedar o SonarQube Community Edition, aproveitando o Elastic File System (EFS) como armazenamento persistente e um banco de dados PostgreSQL implantado via Helm no mesmo cluster.

Arquitetura da Infraestrutura

  • EKS Cluster: Um cluster Kubernetes gerenciado com dois nós trabalhadores (t3.medium), provisionado via eksctl.
  • EFS (Elastic File System): Armazenamento persistente para dados do SonarQube.
  • PostgreSQL: Banco de dados implantado no cluster via Helm, conectado ao SonarQube.
  • Kubernetes Service (LoadBalancer): Expõe o SonarQube externamente através de um balanceador de carga.
  • Deployment: Define o pod do SonarQube com uma réplica fixa.

Vantagens:

  1. Flexibilidade do Kubernetes: O EKS oferece maior flexibilidade e suporte a recursos avançados de Kubernetes, como deployments, services e autoscaling.
  2. Escalabilidade de Nós: O EKS permite escalar os nós do cluster, o que pode melhorar o desempenho geral, mesmo que o SonarQube em si não possa ser escalado horizontalmente.
  3. Integração com EFS: O uso do Elastic File System (EFS) como armazenamento persistente permite compartilhar dados entre pods, o que pode ser útil para grandes volumes de dados.
  4. Potencial de Escalabilidade Futura: Embora a versão Community não suporte clusterização, a infraestrutura do EKS está pronta para uma possível migração para a versão Data Center Edition no futuro.

Desvantagens:

  1. Complexidade Técnica: A configuração e gerenciamento de um cluster EKS exigem conhecimento avançado de Kubernetes, o que pode ser uma barreira para equipes menos experientes.
  2. Custo Elevado: O EKS, combinado com EFS e LoadBalancer, pode resultar em custos operacionais significativos.
  3. Limitação da Versão Community: Assim como nas outras propostas, a versão Community não suporta clusterização, o que limita a escalabilidade horizontal.
  4. Replicação Fixa: O SonarQube Community Edition só pode rodar em uma réplica, o que anula parte da vantagem do Kubernetes em termos de escalabilidade.

Problemas que não resolve:

  • Escalabilidade Horizontal: Apesar da flexibilidade do Kubernetes, o SonarQube Community Edition não suporta clusterização, o que limita a escalabilidade real.
  • Gerenciamento de Workers: Apenas um worker é permitido, o que pode ser insuficiente para processar 138 mil projetos.
  • Reindexação do Elasticsearch: O Elasticsearch embutido continua sendo um gargalo, pois não pode ser escalado separadamente.

Comparação entre Propostas

1. Plataforma de Orquestração

  • Proposta 01 (ECS com Terraform):

    • Vantagem: Simplicidade serverless, sem gerenciamento de nós.
    • Desvantagem: Menos flexibilidade que Kubernetes.
  • Proposta 02 (ECS com Cluster.dev):

    • Vantagem: Abstração simplifica a implantação.
    • Desvantagem: Similar à Proposta 01 em flexibilidade limitada.
  • Proposta 03 (EKS):

    • Vantagem: Maior flexibilidade e suporte nativo a recursos avançados de Kubernetes.
    • Desvantagem: Complexidade maior devido à gestão de nós e cluster.

2. Escalabilidade

  • Proposta 01: Suporta auto-scaling limitado via ECS, mas depende de EFS e da falta de clusterização na Community Edition.
  • Proposta 02: Auto-scaling mais fluido com Fargate, mas igualmente restrito a uma instância funcional devido ao Community Edition.
  • Proposta 03: Escalabilidade bloqueada a uma réplica pela Community Edition; EKS permite escalar nós, mas não réplicas do SonarQube.
    • Diferença: Proposta 03 tem potencial teórico maior com Kubernetes, mas é ineficaz na prática sem a Data Center Edition.

3. Armazenamento

  • Proposta 01: Usa EFS para dados compartilhados, com latência e custo como desvantagens.
  • Proposta 02: Evita EFS, dependendo do RDS e contêineres temporários.
  • Proposta 03: Usa EFS como PVC, similar à Proposta 01, mas integrado ao Kubernetes.
    • Diferença: Proposta 02 é mais enxuta; 01 e 03 dependem do EFS com desafios semelhantes.

4. Complexidade

  • Proposta 01: Alta devido ao Terraform detalhado.
  • Proposta 02: Reduzida pelo Cluster.dev.
  • Proposta 03: Moderada, com configuração manual via eksctl e YAML, mas exige familiaridade com Kubernetes.
    • Diferença: Proposta 02 é a mais simples; Proposta 03 exige mais conhecimento técnico que 01.

5. Custo

  • Proposta 01: Alto devido a EFS, Fargate e RDS.
  • Proposta 02: Menor sem EFS, mas ainda inclui Fargate e RDS.
  • Proposta 03: Elevado por EFS, nós EKS gerenciados e LoadBalancer.
    • Diferença: Proposta 02 é potencialmente mais econômica; 03 e 01 são mais custosas.

6. Segurança

  • Proposta 01: KMS e Secrets Manager, mas configuração manual.
  • Proposta 02: Security Groups via Cluster.dev, mais estruturado.
  • Proposta 03: Secrets do Kubernetes, básico e sem foco em segurança avançada (conforme artigo).
    • Diferença: Proposta 02 tem melhor abstração; 03 é menos segura por falta de práticas detalhadas.

Solução Recomendada

Dado os cenários acima, a melhor solução é em uma arquitetura multi-instância, com proxy inteligente e um banco de dados compartilhado. Dadas as restrições da Community Edition e o volume de projetos, a "Solução Recomendada" é a melhor opção. Ela não é perfeita (não existe solução perfeita com a Community Edition para essa escala), mas é a mais prática, econômica e funcional. As outras propostas são, em essência, soluções tecnicamente elegantes, mas inadequadas para o problema em questão. Elas gastam recursos (tempo, dinheiro, complexidade) em tecnologias que não resolvem o problema central: a limitação inerente da versão gratuita do SonarQube.

Isto é, a melhor solução dado o cenário, é segmentar os projetos entre instâncias. Fazer um workaround inteligente. Embora não seja uma verdadeira escalabilidade horizontal, simula o efeito ao distribuir a carga. Esta proposta entende que ao distribuir os projetos, cada instância do SonarQube tem seu próprio Elasticsearch, aliviando a pressão. Usar EC2 diretamente, em vez de soluções serverless como Fargate, é provavelmente mais econômico para uma carga de trabalho constante e previsível. O Fargate é ótimo para picos, mas caro para uso contínuo.

Entendendo o Problema

Os principais desafios identificados são:

  • Elasticsearch fixo dentro do SonarQube, impedindo escalabilidade horizontal
  • Ausência de suporte a clusterização na versão Community
  • Limitação a um único worker para processamento de background tasks
  • Volume muito alto de projetos (138 mil)

Arquitetura Proposta

                           ┌─────────────────┐
                           │   Application   │
                           │  Load Balancer  │
                           └────────┬────────┘
                                    │
                 ┌──────────────────┼──────────────────┐
                 │                  │                  │
        ┌────────▼────────┐ ┌───────▼────────┐ ┌──────▼─────────┐
        │   SonarQube     │ │   SonarQube    │ │   SonarQube    │
        │   Instance 1    │ │   Instance 2   │ │   Instance 3   │
        │  (UI + Search)  │ │  (UI + Search) │ │  (UI + Search) │
        └────────┬────────┘ └───────┬────────┘ └──────┬─────────┘
                 │                  │                  │
                 └──────────────────┼──────────────────┘
                                    │
                           ┌────────▼────────┐
                           │   PostgreSQL    │
                           │      RDS        │
                           └─────────────────┘

Componentes da Solução

  1. Múltiplas Instâncias EC2 de SonarQube:

    • Cada instância contém uma instalação completa do SonarQube Community Edition
    • Configuração idêntica em todas as instâncias
    • Cada instância gerencia seu próprio Elasticsearch interno
  2. Application Load Balancer (ALB) com Roteamento Inteligente:

    • Distribui requisições HTTP/HTTPS entre as instâncias
    • Implementa sticky sessions para manter a consistência da experiência do usuário
    • Configurado com health checks para detectar instâncias não responsivas
  3. Banco de Dados PostgreSQL RDS Compartilhado:

    • Todas as instâncias se conectam ao mesmo banco de dados
    • Dimensionado adequadamente para suportar a carga de todas as instâncias
  4. Segmentação de Projetos:

    • Divisão lógica dos 138 mil projetos entre as instâncias
    • Cada instância é responsável por um subconjunto específico de projetos

Script de Manutenção para Reindexação

Para manter o desempenho, implementaríamos um script de manutenção que executa reindexações periódicas:

#!/bin/bash
# Script para reindexação periódica do Elasticsearch em cada instância

INSTANCES=("10.0.1.10" "10.0.1.11" "10.0.1.12")
ADMIN_TOKEN="your-admin-token"

for instance in "${INSTANCES[@]}"; do
  echo "Reindexando instância $instance"
  curl -X POST -u "$ADMIN_TOKEN:" "http://$instance:9000/api/system/reindex"
  sleep 3600  # Esperar 1 hora entre instâncias para não sobrecarregar o banco
done

Otimizações Adicionais

  1. Configuração do PostgreSQL RDS:

    • Instância db.r5.4xlarge ou superior
    • Provisionamento de IOPS para garantir desempenho consistente
    • Parâmetros otimizados para SonarQube:
      shared_buffers = 8GB
      work_mem = 64MB
      maintenance_work_mem = 2GB
      effective_cache_size = 24GB
      
  2. Otimização do JVM para SonarQube:

    • Configurar heap size adequado (50% da RAM disponível)
    • Ajustar garbage collection para cargas de trabalho de análise
  3. Configuração de Rede:

    • Colocar todas as instâncias na mesma zona de disponibilidade que o RDS para minimizar latência
    • Usar placement groups para melhorar a performance de rede

Vantagens:

  1. Escalabilidade Horizontal Controlada: A segmentação de projetos permite distribuir a carga entre múltiplas instâncias, contornando a limitação de clusterização da versão Community.
  2. Alta Disponibilidade: O uso de um Application Load Balancer (ALB) garante que o tráfego seja redirecionado para instâncias saudáveis em caso de falha.
  3. Custo-Benefício: A solução mantém a versão Community, evitando custos adicionais de migração para a versão Data Center Edition.
  4. Implementação Gradual: A solução pode ser implementada gradualmente, começando com 2-3 instâncias e expandindo conforme necessário.

Desvantagens:

  1. Gerenciamento Manual: A segmentação de projetos requer gerenciamento manual ou scripts personalizados, o que pode aumentar a complexidade operacional.
  2. Experiência do Usuário: Usuários que trabalham com projetos em diferentes instâncias precisarão alternar entre elas, o que pode impactar a experiência do usuário.
  3. Manutenção: Atualizações e manutenção precisam ser coordenadas entre todas as instâncias, o que pode ser trabalhoso.
  4. Monitoramento: É necessário um monitoramento abrangente para identificar gargalos em instâncias específicas.

Problemas que resolve:

  • Escalabilidade Horizontal: A segmentação de projetos permite distribuir a carga entre múltiplas instâncias, contornando a limitação de clusterização da versão Community.
  • Gerenciamento de Workers: Cada instância pode ser configurada com múltiplos workers, melhorando o processamento de tarefas de background.
  • Reindexação do Elasticsearch: A reindexação pode ser realizada de forma distribuída entre as instâncias, reduzindo o impacto no desempenho.

Problemas que não resolve:

  • Clusterização Nativa: A solução não oferece clusterização nativa, o que pode ser um problema para volumes extremamente altos de projetos.
  • Migração Futura: Para necessidades futuras de escalabilidade, pode ser necessário migrar para a versão Data Center Edition.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment