Cluster e Performance
Aula 5 de 6
Arquitetura de Cluster
Um cluster Elasticsearch é composto por nodes com papéis específicos que determinam suas responsabilidades.
Node Roles
`yaml
elasticsearch.yml — config por node
Node mestre (coordenação do cluster)
node.roles: ["master"]
Node de dados (armazena e busca dados)
node.roles: ["data"]
Node de ingest (pré-processa documentos)
node.roles: ["ingest"]
Node de machine learning
node.roles: ["ml"]
Node de coordenação apenas (balanceamento)
node.roles: []
Node hot (dados recentes, alta performance)
node.roles: ["data_hot"]
Node warm (dados menos acessados)
node.roles: ["data_warm"]
Node cold (dados raramente acessados)
node.roles: ["data_cold"]
Node frozen (arquivamento)
node.roles: ["data_frozen"] `
Shards e Replicas
json PUT /logs { "settings": { "index": { "number_of_shards": 3, "number_of_replicas": 1 } } }
| Conceito | Descrição |
|---|---|
| Primary Shard | Partição principal dos dados. Índice dividido em N shards. |
| Replica Shard | Cópia do primary shard em outro node. Alta disponibilidade e throughput de leitura. |
| Shard Allocation | Distribuição dos shards entre nodes. |
| Rack Awareness | Evita alocar shards primários e réplicas no mesmo rack/zone. |
Alocação de Shards
json PUT /logs/_settings { "index.routing.allocation.include.zone": "us-east-1a", "index.routing.allocation.require.data": "hot", "index.number_of_replicas": 2 }
Performance Tuning
Force Merge — Otimização de Segmentos
json POST /logs/_forcemerge?max_num_segments=1
Refresh Interval
json PUT /logs/_settings { "index": { "refresh_interval": "30s", "number_of_replicas": 0 } }
Indexing Buffer
`yaml
elasticsearch.yml
indices.memory.index_buffer_size: 10% indices.memory.min_index_buffer_size: 48mb `
Segment Merging
O Elasticsearch usa merge policies para controlar quando e como segmentos de Lucene são mesclados:
`yaml
Configurações do merge scheduler
index.merge.scheduler.max_thread_count: 1 index.merge.policy.segments_per_tier: 10 index.merge.policy.max_merged_segment: 5gb `
Bulk Indexing — Otimização
`json POST /_bulk { "index": { "_index": "logs", "_id": "1" } } { "timestamp": "2025-01-01", "level": "INFO", "message": "Iniciando servidor" } { "index": { "_index": "logs", "_id": "2" } } { "timestamp": "2025-01-01", "level": "ERROR", "message": "Falha na conexão" }
// Recomenda-se batches de 1MB-10MB ou 1000-5000 documentos por requisição `
Snapshot e Restore
Repositório e Snapshot
`json PUT /_snapshot/meu_repositorio { "type": "s3", "settings": { "bucket": "meu-bucket-es", "region": "us-east-1", "compress": true } }
PUT /_snapshot/meu_repositorio/snapshot_2025_01_01 { "indices": "logs-2025.01.*,produtos", "ignore_unavailable": true, "include_global_state": false }
GET /_snapshot/meu_repositorio/snapshot_2025_01_01/_status
POST /_snapshot/meu_repositorio/snapshot_2025_01_01/_restore { "indices": "produtos", "rename_pattern": "produtos", "rename_replacement": "produtos_restored" } `
ILM — Index Lifecycle Management
`json PUT /_ilm/policy/logs_policy { "policy": { "phases": { "hot": { "min_age": "0ms", "actions": { "rollover": { "max_size": "50gb", "max_age": "7d" }, "set_priority": { "priority": 100 } } }, "warm": { "min_age": "30d", "actions": { "shrink": { "number_of_shards": 1 }, "forcemerge": { "max_num_segments": 1 }, "allocate": { "require": { "data": "warm" } }, "set_priority": { "priority": 50 } } }, "cold": { "min_age": "90d", "actions": { "allocate": { "require": { "data": "cold" } }, "freeze": true, "set_priority": { "priority": 0 } } }, "delete": { "min_age": "365d", "actions": { "delete": {} } } } } }
PUT /_index_template/logs_template { "index_patterns": ["logs-*"], "template": { "settings": { "number_of_shards": 3, "number_of_replicas": 1, "index.lifecycle.name": "logs_policy", "index.lifecycle.rollover_alias": "logs" } } } `
Hot-Warm-Cold Architecture
Hot (SSD, 3 nodes) → Dados dos últimos 7 dias → 50 shards, replicas=1 Warm (HDD, 3 nodes) → Dados de 7-90 dias → 10 shards, force merge Cold (HDD, 2 nodes) → Dados de 90-365 dias → 5 shards, frozen
`yaml
node hot
node.roles: ["data_hot", "data_content"]
node warm
node.roles: ["data_warm", "data_content"]
node cold
node.roles: ["data_cold", "data_content"] `
Lab: Cluster Otimizado
`ash
1. Configure um índice logs com ILM policy
- Hot: rollover a 50GB ou 7 dias
- Warm: shrink + force merge aos 30 dias
- Delete: apagar após 1 ano
2. Crie um snapshot manual do índice
3. Force merge para 1 segmento
4. Ajuste refresh_interval para 30s
5. Teste bulk indexing com 10000 documentos
curl -X PUT "http://localhost:9200/_ilm/policy/logs_policy"
-H "Content-Type: application/json"
-d '{"policy": {"phases": {"hot": {"actions": {"rollover": {"max_size": "50gb"}}}}}}'
`
ILM + Hot-Warm-Cold architecture reduzem custos de armazenamento em até 70% enquanto mantêm performance para dados recentes.