- Posted on
- • Artificial Intelligence
Artificial Intelligence High Availability Databases
- Author
-
-
- User
- linuxbash
- Posts by this author
- Posts by this author
-
Artificial Intelligence High Availability Databases on Linux: A Practical Guide
Ever shipped an AI service that was blazing-fast—until a single database hiccup woke you at 03:00? AI workloads aren’t just model files; they’re stateful systems feeding on metadata, features, embeddings, metrics, and user events. When any one of these data stores goes down, you don’t just get errors—you degrade model quality, increase latency, and lose trust.
This post shows you how to build and operate highly available (HA) databases for AI on Linux with practical, Bash-first steps you can copy, paste, and adapt. You’ll map AI components to the right data stores, choose HA topologies that fit your consistency/latency needs, and set up basic failover, backups, and observability—using packages you can install via apt, dnf, and zypper.
Why HA matters for AI systems
AI is stateful in multiple places:
- Model registry, experiments, and lineage (OLTP metadata)
- Online features and session state (low-latency KV)
- Vector search for embeddings (ANN/semantic search)
- Time-series logs and inference metrics
Failures do more than interrupt traffic:
- Recommenders backslide to “safe” but poor defaults
- Retrieval-Augmented Generation (RAG) returns stale or off-topic context
- Feature drift goes undetected without durable audit data
The right question isn’t “How do I get 100% uptime?” It’s “What RTO/RPO do I need for each datastore, and what trade-offs (consistency vs availability) am I willing to accept?”
Core frameworks and actionable steps
Below are five practical steps to design and stand up HA for AI data paths. Where tools are cited, you’ll find Linux install commands for apt, dnf, and zypper.
1) Map AI components to stores and decide consistency
Before spinning up clusters, assign each AI component a store and a failure policy.
Metadata and control plane (models, experiments, lineage)
- Store: PostgreSQL or MariaDB
- Bias: Consistency (avoid split-brain on writes)
Online features/caching/session state
- Store: Redis (Sentinel or Cluster)
- Bias: Low latency, tolerate brief inconsistency
Vector search (embeddings for RAG)
- Store: Postgres + pgvector, or a distributed vector DB
- Bias: Partition + replicate; accept eventual consistency
Time-series/analytics (inference logs, drift monitoring)
- Store: ClickHouse/TimescaleDB/Opensearch
- Bias: High ingest throughput, replicated storage
Document for each:
RPO (max data loss you can tolerate)
RTO (max downtime to failover)
Consistency/availability preference (e.g., Postgres with synchronous replica for RPO=0)
2) Stand up a highly available PostgreSQL control plane
PostgreSQL is a solid default for AI metadata, feature definitions, and small/medium vector indexes (via pgvector). Keep the write path consistent and expose a stable endpoint to clients.
Install packages (one-liners per distro):
- Debian/Ubuntu (apt):
sudo apt update
sudo apt install -y postgresql postgresql-client pgbouncer haproxy keepalived
- RHEL/CentOS/Fedora (dnf):
sudo dnf install -y postgresql-server postgresql-contrib pgbouncer haproxy keepalived
- openSUSE/SLES (zypper):
sudo zypper refresh
sudo zypper install -y postgresql-server postgresql-contrib pgbouncer haproxy keepalived
Initialize and start PostgreSQL:
- Debian/Ubuntu:
sudo systemctl enable --now postgresql
- RHEL/CentOS/Fedora:
sudo postgresql-setup --initdb
sudo systemctl enable --now postgresql
- openSUSE/SLES:
sudo -u postgres initdb -D /var/lib/pgsql/data
sudo systemctl enable --now postgresql
Basic primary/replica flow (outline):
- On primary, enable WAL and replication in postgresql.conf:
sudo -u postgres bash -lc "printf '\nwal_level = replica\nmax_wal_senders = 10\nhot_standby = on\n' >> /var/lib/pgsql/data/postgresql.conf"
- Create a replication role:
sudo -u postgres psql -c "CREATE ROLE replicator WITH REPLICATION LOGIN ENCRYPTED PASSWORD 'STRONGPASS';"
- Allow replicas in pg_hba.conf (replace CIDR as needed):
echo "host replication replicator 10.0.0.0/24 md5" | sudo tee -a /var/lib/pgsql/data/pg_hba.conf
sudo systemctl restart postgresql
- On the replica, take a base backup:
sudo -u postgres pg_basebackup -h <PRIMARY_IP> -D /var/lib/pgsql/data -U replicator -P -R
sudo systemctl enable --now postgresql
Keepalived to present a virtual IP (VIP) only on the healthy primary:
- Health check script (returns 0 only if primary):
sudo tee /usr/local/bin/pg_vip_check.sh >/dev/null <<'EOF'
#!/usr/bin/env bash
pg_isready -q -h 127.0.0.1 || exit 1
psql -Atqc "SELECT pg_is_in_recovery()" 2>/dev/null | grep -q f
EOF
sudo chmod +x /usr/local/bin/pg_vip_check.sh
- Minimal keepalived config (edit interface, VIP, priorities):
sudo tee /etc/keepalived/keepalived.conf >/dev/null <<'EOF'
vrrp_script chk_pg {
script "/usr/local/bin/pg_vip_check.sh"
interval 2
fall 2
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass strongpass
}
virtual_ipaddress {
10.0.0.100/24
}
track_script {
chk_pg
}
}
EOF
sudo systemctl enable --now keepalived
Terminate and pool connections:
- HAProxy for read/write routing (point apps to the VIP:5432):
sudo tee /etc/haproxy/haproxy.cfg >/dev/null <<'EOF'
global
maxconn 4096
defaults
mode tcp
timeout connect 5s
timeout client 1m
timeout server 1m
frontend psql
bind *:5432
default_backend pg
backend pg
option tcp-check
# Primary first, replicas as backup
server pg1 10.0.0.11:5432 check
server pg2 10.0.0.12:5432 check backup
EOF
sudo systemctl enable --now haproxy
- PgBouncer for pooling:
sudo tee /etc/pgbouncer/pgbouncer.ini >/dev/null <<'EOF'
[databases]
appdb = host=127.0.0.1 port=5432 dbname=appdb
[pgbouncer]
listen_addr = 0.0.0.0
listen_port = 6432
auth_type = md5
auth_file = /etc/pgbouncer/userlist.txt
pool_mode = transaction
max_client_conn = 2000
default_pool_size = 50
EOF
sudo systemctl enable --now pgbouncer
Tip: For zero data loss (RPO=0), enable synchronous_commit and set synchronous_standby_names on the primary; understand the latency cost.
3) Make online features highly available with Redis
Redis is perfect for low-latency features, rate limits, and short-lived session state. Use Sentinel for simple failover or Redis Cluster for sharding.
Install Redis:
- Debian/Ubuntu (apt):
sudo apt update
sudo apt install -y redis-server
- RHEL/CentOS/Fedora (dnf):
sudo dnf install -y redis
- openSUSE/SLES (zypper):
sudo zypper refresh
sudo zypper install -y redis
Minimal Sentinel (3 nodes recommended):
sudo tee /etc/redis/sentinel.conf >/dev/null <<'EOF'
port 26379
daemonize yes
sentinel monitor mymaster 10.0.0.21 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
EOF
sudo -u redis redis-sentinel /etc/redis/sentinel.conf --daemonize yes
Clients connect via Sentinels to discover the current master. For sharding, initialize Redis Cluster with at least 3 masters (plus replicas) and connect with a cluster-aware client.
Persistence and safety:
- In redis.conf:
appendonly yes
appendfsync everysec
- Test failover:
redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
sudo systemctl stop redis
sleep 10
redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
4) Protect yourself with backups and drills
PostgreSQL:
- Enable WAL archiving and take regular base backups. Simple base backup to local disk:
sudo -u postgres pg_basebackup -h 127.0.0.1 -D /var/backups/pg/$(date +%F) -U replicator -P
- Archive WALs (postgresql.conf):
archive_mode = on
archive_command = 'test ! -f /var/archwal/%f && cp %p /var/archwal/%f'
- Restore test:
sudo -u postgres psql -c "SELECT pg_switch_wal();"
ls /var/archwal
Redis:
- Ensure snapshots and AOF are enabled:
save 900 1
save 300 10
save 60 10000
appendonly yes
- Verify RDB/AOF presence:
ls -lh /var/lib/redis/
Disaster drills:
- Kill a primary in a safe lab and measure RTO:
sudo systemctl stop postgresql
watch -n1 "psql -h 10.0.0.100 -U postgres -Atqc 'select now()'"
- Chaos every sprint: one controlled failover, one restore-from-backup.
5) Observe replication, lag, and saturation
Install basic node metrics:
- Debian/Ubuntu (apt):
sudo apt update
sudo apt install -y prometheus-node-exporter
- RHEL/CentOS/Fedora (dnf):
sudo dnf install -y prometheus-node-exporter
- openSUSE/SLES (zypper):
sudo zypper refresh
sudo zypper install -y prometheus-node-exporter
Quick health checks:
- PostgreSQL:
pg_isready -h 10.0.0.100
psql -Atqc "select pg_is_in_recovery(), pg_last_wal_replay_lsn()" # run on replica
- Redis:
redis-cli info replication | egrep 'role|connected_slaves|master_link_status|slave0'
Watch for:
Connection saturation (add PgBouncer, raise max_connections carefully)
Replication lag (tune network, WAL/compression, or add read replicas close to clients)
Slow queries (indexes, ANALYZE, work_mem, caching hot feature sets in Redis)
Real-world example: resilient RAG microservice
Metadata and prompts: PostgreSQL (primary + replica, Keepalived VIP for writes)
Vector index: pgvector in PostgreSQL for moderate scale (or a specialized vector DB for >10M embeddings)
Online features (user prefs, recency signals): Redis with Sentinel
Connection layer: HAProxy + PgBouncer
Backup: PostgreSQL WAL archiving + nightly base backup; Redis AOF + daily RDB snapshot
Test: Quarterly restore from backup into a staging cluster and re-run top 1000 queries to validate performance
This architecture delivers consistent writes where needed (metadata), low-latency reads for features, and a controlled failover experience, without overcomplicating operations.
Conclusion and next steps
High availability for AI isn’t one “magic” database—it’s a set of pragmatic choices aligned to each data path’s consistency and latency needs. Start by mapping your AI components, then stand up a minimal HA control plane (PostgreSQL), a resilient online store (Redis), a stable client entry point (HAProxy/PgBouncer), and prove your backups with real restores.
Your next step: 1) In a lab, bring up the PostgreSQL + Keepalived + HAProxy stack above. 2) Point a small service to the VIP and run a failover drill. 3) Add Redis + Sentinel, then measure end-to-end RTO and observed latency.
If you want a follow-up with pgvector, ClickHouse/Timescale, or a deeper dive into synchronous Postgres topologies (Patroni/repmgr), reply with your target scale and RPO/RTO goals and I’ll tailor a build guide.