Configuring High Availability
1. Running Multiple Prometheus Instances
Example: Configuring HA with two Prometheus instances
# prometheus-1.yml
global:
scrape_interval: 15s
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
# prometheus-2.yml
global:
scrape_interval: 15s
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9091"]
| Configuration | Description | Notes |
|---|---|---|
| prometheus.config.file | prometheus.yml |
Path to the main configuration file |
| storage.tsdb.path | data/ |
Directory to store the TSDB data |
| web.listen-address | :9090 |
Address to listen on for web interface and HTTP endpoints |
| storage.tsdb.retention.time | 2d |
How long to retain samples in the database |
2. Using Thanos for HA
Example: Basic Thanos Setup
# Prometheus config with Thanos sidecar
prometheus:
hosts:
- prometheus-1:9090
- prometheus-2:9090
thanos:
sidecar:
listen: 0.0.0.0:10901
prometheus_url: http://localhost:9090
grpc_listen: 0.0.0.0:10902
| Component | Description | Notes |
|---|---|---|
| thanos.sidecar | Runs alongside Prometheus to expose data via gRPC | Required for HA setup |
| thanos.store | Stores and serves aggregated metrics from multiple Prometheus instances | Can be deployed in distributed mode |
| thanos.query | Query engine that can query across multiple Thanos instances | Provides unified query interface |
Thanos vs Native Prometheus HA
- Thanos: Distributed, scalable, supports long-term storage
- Native HA: Simple replication, limited storage options
Thanos HA Setup Workflow
- Deploy Prometheus instances in separate regions or zones
- Run Thanos sidecar on each Prometheus instance
- Deploy Thanos Store and Query components
- Configure query routing to use Thanos Query
3. Implementing Deduplication
Prometheus supports deduplication to prevent duplicate metric samples from being stored or reported, which can occur in high availability setups with multiple instances.
| Configuration Option | Description | Default Value | Notes |
|---|---|---|---|
| --deduplication | Enables deduplication of samples across instances | false | Requires --enable-feature=deduplication to be enabled |
| --deduplication.timeout | Timeout for deduplication operations | 5m | Time to wait before considering a sample as duplicate |
Example: Enabling Deduplication
prometheus --enable-feature=deduplication --deduplication=true --deduplication.timeout=10m
4. Configuring Load Balancing
Example: Load Balancer Configuration
# Example HAProxy configuration for Prometheus
global
daemon
maxconn 4096
defaults
mode http
timeout connect 5s
timeout client 30s
timeout server 30s
frontend prometheus_frontend
bind *:9090
balance roundrobin
server prometheus1 10.0.1.10:9090 check
server prometheus2 10.0.1.11:9090 check
server prometheus3 10.0.1.12:9090 check
backend prometheus_backend
balance roundrobin
server prometheus1 10.0.1.10:9090 check
server prometheus2 10.0.1.11:9090 check
server prometheus3 10.0.1.12:9090 check
| Load Balancer | Configuration | Notes |
|---|---|---|
| haproxy | balance roundrobin |
Round-robin load balancing algorithm |
| nginx | upstream |
Define group of servers to balance |
| AWS ELB | Target Groups |
Define target instances for load balancing |
5. Using Remote Storage for HA
For high availability in Prometheus, remote storage can be used to store metrics data across multiple systems. This ensures that if one Prometheus instance fails, another can continue to serve metrics from the remote storage.
| Storage Type | Description | HA Considerations | Notes |
|---|---|---|---|
| Remote Write | Writes metrics to a remote endpoint | Multiple Prometheus instances can write to the same remote storage | Supports deduplication and sharding |
| Remote Read | Reads metrics from a remote endpoint | Can be used to query data across multiple Prometheus instances | Supports querying from multiple sources |
Example: Configuring Remote Write
remote_write:
- url: http://remote-storage.example.com/api/v1/write
queue_config:
capacity: 10000
max_shards: 10
Example: Configuring Remote Read
remote_read:
- url: http://remote-storage.example.com/api/v1/read
name: "prometheus"
6. Implementing Alert Deduplication
| Configuration Option | Description | Default Value | Notes |
|---|---|---|---|
| alertmanager.timeout | Timeout for sending alerts to Alertmanager | 10s |
Used to prevent long waits during alert deduplication |
| alertmanager.http.config | HTTP client configuration for Alertmanager | {} |
Can include TLS settings and timeouts for deduplication |
| alertmanager.alerts.deduplication | Enable or disable alert deduplication | true |
Ensures duplicate alerts are not sent to Alertmanager |
Example: Alertmanager Configuration with Deduplication
alertmanager:
timeout: 10s
http_config:
tls_config:
insecure_skip_verify: false
alerts:
deduplication: true
7. Setting Up Cross-Region Replication
Configuring cross-region replication in Prometheus involves setting up multiple Prometheus instances in different regions to ensure high availability and data redundancy. This setup allows for failover capabilities and improved query performance by reducing latency.
| Component | Description | Configuration |
|---|---|---|
| replica | Identifier for the replica instance | "prometheus-1" |
| region | Region identifier for the instance | "us-west-1" |
| remote_write | Configuration for writing data to remote endpoints | |
| remote_read | Configuration for reading data from remote endpoints | |
Example: Remote Write Configuration
remote_write:
- url: http://prometheus-remote-write:9090/api/v1/write
queue_config:
capacity: 1000
max_samples_per_send: 1000
Example: Remote Read Configuration
remote_read:
- url: http://prometheus-remote-read:9090/api/v1/read
read_recent: true
8. Using Consistent Hashing
Prometheus supports consistent hashing for high availability setups to ensure that metrics are distributed evenly across instances.
| Configuration Option | Description | Values |
|---|---|---|
| --hashmod | Enables consistent hashing for sharding | true or false |
| --shard.count | Number of shards to use for consistent hashing | Integer value |
| --shard.key | Key used for consistent hashing | String (e.g., instance) |
Example: Configuring Consistent Hashing
prometheus --hashmod=true --shard.count=3 --shard.key=instance
9. Implementing Health Checks
| Check Type | Description | Configuration | Notes |
|---|---|---|---|
| HTTP Probe | Checks Prometheus endpoint status via HTTP | http_get: |
Use for basic liveness/readiness checks |
| TCP Probe | Verifies Prometheus can connect to a TCP port | tcp_connect: |
Use for checking service availability |
| Script Probe | Runs custom script to determine health | exec: |
Allows complex logic for custom checks |
Example: HTTP Probe Configuration
scrape_configs:
- job_name: 'prometheus'
http_sd_configs:
- url: 'http://localhost:9090/targets'
metrics_path: /metrics
scrape_interval: 15s
http_get:
url: 'http://localhost:9090/health'
timeout: 5s
Example: TCP Probe Configuration
scrape_configs:
- job_name: 'prometheus'
tcp_connect:
host: 'localhost'
port: 9090
scrape_interval: 15s
10. Monitoring HA Setup
Example: HA Setup Overview
# prometheus-ha.yml
global:
evaluation_interval: 1m
scrape_interval: 15s
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
rule_files:
- "alerts.yml"
alerting:
alertmanagers:
- static_configs:
- targets:
- "alertmanager1:9093"
- "alertmanager2:9093"
| Component | Description | Configuration |
|---|---|---|
| prometheus | Primary monitoring instance | scrape_configs, alerting |
| alertmanager | Alert routing and notification | alertmanagers in prometheus.yml |
HA Monitoring Workflow
- Deploy Prometheus in active-passive or active-active mode
- Configure Alertmanager cluster with shared storage
- Set up cross-instance service discovery (e.g., Consul, DNS)
- Monitor instance health via Prometheus metrics
HA Modes Comparison
- Active-Passive: One instance active, others standby
- Active-Active: All instances handle traffic simultaneously
11. Handling Split-Brain Scenarios
| Scenario | Description | Impact | Solution |
|---|---|---|---|
| Network Partition | Cluster nodes lose connectivity to each other but remain connected to clients. | Data inconsistency, duplicate alerts, partial query results. | Implement quorum-based decision making or use a consensus protocol like Raft to ensure only one cluster can make decisions. |
| Node Failure | A node in the cluster becomes unreachable due to hardware or software failure. | Loss of data availability, potential data loss if not properly replicated. | Use replication and automatic failover mechanisms to maintain availability and data integrity. |
Example: Configuring Quorum in Prometheus
prometheus:
global:
evaluation_interval: 1m
scrape_interval: 15s
rule_files:
- "rules.yml"
alerting:
alertmanagers:
- static_configs:
- targets:
- "alertmanager:9093"
remote_write:
- url: "http://prometheus-remote-write:9090/api/v1/write"
queue_config:
capacity: 1000
max_samples_per_send: 1000
batch_send_deadline: 5s
Best Practices for Split-Brain Prevention
- Use a consensus protocol like Raft to ensure only one cluster can make decisions during network partitions.
- Implement proper replication and failover mechanisms to maintain data availability.
- Monitor cluster health regularly to detect and address network issues before they cause splits.
12. Implementing Failover Strategies
| Strategy | Description | Implementation | Notes |
|---|---|---|---|
| Active-Passive | One Prometheus instance is active, others are standby | |
Requires external tooling for failover |
| Active-Active | All instances are active and handle traffic | |
Requires load balancing and consistent storage |
| Multi-Region | Instances in different regions for disaster recovery | |
Use cross-region replication for data consistency |
Example: Active-Passive Setup
# Primary instance
prometheus --config.file=prometheus-primary.yml \
--storage.tsdb.path=data/primary \
--web.listen-address=:9090
# Standby instance
prometheus --config.file=prometheus-standby.yml \
--storage.tsdb.path=data/standby \
--web.listen-address=:9091