Skip to content

Configuration (pgElephant Suite)

This page describes all available configuration parameters for pgraft, part of the unified pgElephant high-availability suite. All configuration and monitoring is unified with the rest of the suite.

PostgreSQL Configuration

All pgraft configuration parameters are set in postgresql.conf. The extension must be added to shared_preload_libraries and PostgreSQL must be restarted for changes to take effect.

shared_preload_libraries = 'pgraft'

Core Cluster Configuration

These parameters define the basic cluster identity and network settings.

Parameter Type Default Description
pgraft.cluster_id string "pgraft-cluster" Cluster identifier - must be same for all nodes
pgraft.node_id int 1 Unique node ID (1-based) - must be unique per node
pgraft.address string "127.0.0.1" Node listen address for Raft communication
pgraft.port int 7001 Raft communication port (not PostgreSQL port)
pgraft.data_dir string "/tmp/pgraft/${node_id}" Persistent storage directory

Example

pgraft.cluster_id = 'production-cluster'
pgraft.node_id = 1
pgraft.address = '127.0.0.1'
pgraft.port = 7001
pgraft.data_dir = '/var/lib/postgresql/pgraft'

Important

  • cluster_id must be identical on all nodes in the cluster
  • node_id must be unique for each node (1, 2, 3, ...)
  • port is for Raft protocol, not PostgreSQL connections

Consensus Settings

These parameters control the Raft consensus algorithm behavior.

Parameter Type Default Description
pgraft.election_timeout int 1000 Election timeout in milliseconds
pgraft.heartbeat_interval int 100 Heartbeat interval in milliseconds
pgraft.snapshot_interval int 10000 Snapshot frequency (entries)
pgraft.max_log_entries int 1000 Log compaction threshold

Example

pgraft.election_timeout = 1000        # milliseconds
pgraft.heartbeat_interval = 100       # milliseconds
pgraft.snapshot_interval = 10000      # entries
pgraft.max_log_entries = 1000         # compaction threshold

Tuning Guidelines

Election Timeout

  • Typical range: 500-5000ms
  • Higher values: More stable but slower failover
  • Lower values: Faster failover but more prone to spurious elections
  • Should be at least 10x the heartbeat interval

Heartbeat Interval

  • Typical range: 50-200ms
  • Determines how often leader sends heartbeats
  • Lower values: Better detection of failures, more network traffic
  • Higher values: Less network traffic, slower failure detection

Snapshot Interval

  • How many log entries before creating a snapshot
  • Affects recovery time and disk usage
  • Typical range: 1000-100000 entries

Max Log Entries

  • Threshold for log compaction
  • Prevents unbounded log growth
  • Should be larger than snapshot_interval

Performance Settings

These parameters control batching and compaction behavior.

Parameter Type Default Description
pgraft.batch_size int 100 Entry batch size for replication
pgraft.max_batch_delay int 10 Max batching delay in milliseconds
pgraft.compaction_threshold int 10000 Compaction trigger threshold

Example

pgraft.batch_size = 100
pgraft.max_batch_delay = 10           # milliseconds
pgraft.compaction_threshold = 10000

Security & Monitoring

Optional security and monitoring features.

Parameter Type Default Description
pgraft.auth_enabled bool false Enable authentication between nodes
pgraft.tls_enabled bool false Enable TLS for inter-node communication
pgraft.metrics_enabled bool false Enable Prometheus metrics
pgraft.metrics_port int 9100 Metrics server port

Example

pgraft.auth_enabled = false
pgraft.tls_enabled = false
pgraft.metrics_enabled = true
pgraft.metrics_port = 9100

Coming Soon

Authentication and TLS features are planned for future releases.

Complete Configuration Example

Here's a complete configuration for a production 3-node cluster:

# PostgreSQL settings
port = 5432
shared_preload_libraries = 'pgraft'

# Core cluster configuration
pgraft.cluster_id = 'prod-cluster'
pgraft.node_id = 1
pgraft.address = '192.168.1.101'
pgraft.port = 7001
pgraft.data_dir = '/var/lib/postgresql/pgraft'

# Consensus settings
pgraft.election_timeout = 1000
pgraft.heartbeat_interval = 100
pgraft.snapshot_interval = 10000
pgraft.max_log_entries = 1000

# Performance settings
pgraft.batch_size = 100
pgraft.max_batch_delay = 10
pgraft.compaction_threshold = 10000

# Monitoring
pgraft.metrics_enabled = true
pgraft.metrics_port = 9100
# PostgreSQL settings
port = 5432
shared_preload_libraries = 'pgraft'

# Core cluster configuration
pgraft.cluster_id = 'prod-cluster'
pgraft.node_id = 2
pgraft.address = '192.168.1.102'
pgraft.port = 7002
pgraft.data_dir = '/var/lib/postgresql/pgraft'

# Consensus settings (same as node 1)
pgraft.election_timeout = 1000
pgraft.heartbeat_interval = 100
pgraft.snapshot_interval = 10000
pgraft.max_log_entries = 1000

# Performance settings (same as node 1)
pgraft.batch_size = 100
pgraft.max_batch_delay = 10
pgraft.compaction_threshold = 10000

# Monitoring
pgraft.metrics_enabled = true
pgraft.metrics_port = 9100
# PostgreSQL settings
port = 5432
shared_preload_libraries = 'pgraft'

# Core cluster configuration
pgraft.cluster_id = 'prod-cluster'
pgraft.node_id = 3
pgraft.address = '192.168.1.103'
pgraft.port = 7003
pgraft.data_dir = '/var/lib/postgresql/pgraft'

# Consensus settings (same as node 1)
pgraft.election_timeout = 1000
pgraft.heartbeat_interval = 100
pgraft.snapshot_interval = 10000
pgraft.max_log_entries = 1000

# Performance settings (same as node 1)
pgraft.batch_size = 100
pgraft.max_batch_delay = 10
pgraft.compaction_threshold = 10000

# Monitoring
pgraft.metrics_enabled = true
pgraft.metrics_port = 9100

Applying Configuration Changes

After modifying postgresql.conf:

# Restart PostgreSQL
pg_ctl restart -D /path/to/data

# Or reload (for parameters that support reload)
pg_ctl reload -D /path/to/data

Restart Required

Most pgraft parameters require a PostgreSQL restart because the extension is loaded via shared_preload_libraries.

Verifying Configuration

After starting PostgreSQL, verify your configuration:

-- Check if pgraft is loaded
SELECT * FROM pg_extension WHERE extname = 'pgraft';

-- Get current cluster configuration
SELECT * FROM pgraft_get_cluster_status();

-- Check worker status
SELECT pgraft_get_worker_state();