<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Amir Mehmood</title>
    <description>The latest articles on DEV Community by Amir Mehmood (@hostingpodium).</description>
    <link>https://dev.to/hostingpodium</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4200448%2Fe0aaf673-f5bf-4d3c-95c2-bc07c4b836b2.png</url>
      <title>DEV Community: Amir Mehmood</title>
      <link>https://dev.to/hostingpodium</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hostingpodium"/>
    <language>en</language>
    <item>
      <title>OpenTelemetry Distributed Tracing with Grafana Tempo, Loki &amp; Prometheus on Kubernetes</title>
      <dc:creator>Amir Mehmood</dc:creator>
      <pubDate>Thu, 22 Oct 2026 22:03:49 +0000</pubDate>
      <link>https://dev.to/hostingpodium/opentelemetry-distributed-tracing-with-grafana-tempo-loki-prometheus-on-kubernetes-52a</link>
      <guid>https://dev.to/hostingpodium/opentelemetry-distributed-tracing-with-grafana-tempo-loki-prometheus-on-kubernetes-52a</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://hostingpodium.com/blog/opentelemetry-distributed-tracing-grafana-tempo-loki-kubernetes/" rel="noopener noreferrer"&gt;HostingPodium Enterprise Engineering Blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free SRE &amp;amp; Developer Diagnostics:&lt;/strong&gt; Test your stack live with our &lt;a href="https://hostingpodium.com/tools/dns-propagation-checker/" rel="noopener noreferrer"&gt;&lt;strong&gt;Global DNS Propagation Checker &amp;amp; SSL Health Auditor&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://hostingpodium.com/tools/speed-audit/" rel="noopener noreferrer"&gt;&lt;strong&gt;Free Website Speed &amp;amp; Core Web Vitals Checker&lt;/strong&gt;&lt;/a&gt;, or explore all &lt;a href="https://hostingpodium.com/tools/" rel="noopener noreferrer"&gt;&lt;strong&gt;9 Free Webmaster &amp;amp; Cloud Engineering Tools&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This guide details a production-grade deployment of OpenTelemetry tracing, Grafana Tempo storage, Loki log correlation, and Prometheus exemplars on Kubernetes. It includes configuration, scaling, and runbook procedures for reliable observability.&lt;/p&gt;




&lt;h2&gt;
  
  
  Scope and assumptions
&lt;/h2&gt;

&lt;p&gt;This guide targets production clusters running &lt;a href="https://hostingpodium.com/our-services/kubernetes-openshift/" rel="noopener noreferrer"&gt;Kubernetes&lt;/a&gt; 1.27+ on bare-metal or cloud VMs. All components are deployed as native Kubernetes objects; no external SaaS services are referenced. The reference implementation uses the OpenTelemetry Collector DaemonSet, Grafana Tempo for trace storage, Loki for log aggregation, and Prometheus with exemplars for latency SLOs. The guide assumes familiarity with Helm, kube-adm, and Linux kernel tuning.&lt;/p&gt;

&lt;h2&gt;
  
  
  End-to-end data flow
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Key artifact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Instrumentation&lt;/td&gt;
&lt;td&gt;OpenTelemetry SDK (Java, Go, Python)&lt;/td&gt;
&lt;td&gt;Span context, trace ID, baggage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Export&lt;/td&gt;
&lt;td&gt;OTel Collector (daemonset)&lt;/td&gt;
&lt;td&gt;OTLP over gRPC, batch processor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;Grafana Tempo (S3-compatible backend)&lt;/td&gt;
&lt;td&gt;Trace blocks, index files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Log correlation&lt;/td&gt;
&lt;td&gt;Loki (sidecar or fluent-bit)&lt;/td&gt;
&lt;td&gt;Log lines with trace_id label&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Metrics&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://hostingpodium.com/blog/prometheus-grafana-enterprise-observability-stack/" rel="noopener noreferrer"&gt;Prometheus&lt;/a&gt; (scrape)&lt;/td&gt;
&lt;td&gt;Exemplars attached to http_request_duration_seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Deploying the OpenTelemetry Collector as a DaemonSet
&lt;/h2&gt;

&lt;p&gt;The collector runs on every node to avoid network hops for pod-local traffic. The manifest below uses the official &lt;code&gt;otel/opentelemetry-collector-contrib&lt;/code&gt; image, enables host networking for UDP receivers, and configures a tail-based sampler.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
yaml

---

## Free Webmaster, SRE &amp;amp; Cloud Diagnostic Tools (No Signup Required)

Verify and benchmark your production infrastructure directly from your browser using the **[HostingPodium Free Webmaster &amp;amp; Developer Suite](https://hostingpodium.com/tools/)**:

| Free Engineering Utility | Primary Diagnostic Use Case |
| :--- | :--- |
| **[Global DNS Propagation &amp;amp; SSL Checker](https://hostingpodium.com/tools/dns-propagation-checker/)** | Verify live A, AAAA, CNAME, MX, TXT, NS &amp;amp; CAA records across 21+ global resolvers + TLS certificate audits |
| **[Website Speed Test &amp;amp; Core Web Vitals Auditor](https://hostingpodium.com/tools/speed-audit/)** | Measure server TTFB, LCP, INP, CLS, and HTTP/2 compression latency in real time |
| **[Rich Snippets &amp;amp; Schema.org JSON-LD Generator](https://hostingpodium.com/tools/schema-generator/)** | Generate &amp;amp; validate structured JSON-LD markup for TechArticles, FAQs, Products &amp;amp; Organizations |
| **[HTTP Redirect Chain &amp;amp; Status Code Tracer](https://hostingpodium.com/tools/redirect-tracer/)** | Trace 301/302 redirect hops, inspect response headers, and verify load balancer health checks |
| **[DMARC, SPF &amp;amp; DKIM Email Security Validator](https://hostingpodium.com/tools/dmarc-checker/)** | Audit domain email authentication policies and generate compliant DMARC records |
| **[Google SERP Simulator &amp;amp; Meta Tag Previewer](https://hostingpodium.com/tools/serp-preview/)** | Preview desktop/mobile Google snippets, OpenGraph cards, and pixel-width truncation |
| **[Free WebP Image Converter &amp;amp; Optimizer](https://hostingpodium.com/tools/webp-converter/)** | Client-side PNG/JPG to WebP compression for faster Core Web Vitals LCP |

### Related Enterprise Architecture &amp;amp; Benchmarks
- **Canonical Engineering Guide:** [OpenTelemetry Distributed Tracing with Grafana Tempo, Loki &amp;amp; Prometheus on Kubernetes](https://hostingpodium.com/blog/opentelemetry-distributed-tracing-grafana-tempo-loki-kubernetes/)
- **Managed Engineering Practice:** [24/7 Managed Infrastructure, Linux SRE &amp;amp; Observability](https://hostingpodium.com/our-services/server-hosting-administration/)
- **Infrastructure Benchmark Comparison:** [Hetzner Alternative: 24/7 Managed Bare Metal vs Unmanaged Hardware](https://hostingpodium.com/compare/hetzner-alternative/)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>kubernetes</category>
      <category>linux</category>
      <category>database</category>
      <category>sre</category>
    </item>
    <item>
      <title>Designing PostgreSQL HA with Patroni, etcd, and HAProxy in Multi-Zone Linux Clusters</title>
      <dc:creator>Amir Mehmood</dc:creator>
      <pubDate>Thu, 22 Oct 2026 12:28:41 +0000</pubDate>
      <link>https://dev.to/hostingpodium/designing-postgresql-ha-with-patroni-etcd-and-haproxy-in-multi-zone-linux-clusters-8e0</link>
      <guid>https://dev.to/hostingpodium/designing-postgresql-ha-with-patroni-etcd-and-haproxy-in-multi-zone-linux-clusters-8e0</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://hostingpodium.com/blog/postgresql-high-availability-patroni-etcd-haproxy-linux/" rel="noopener noreferrer"&gt;HostingPodium Enterprise Engineering Blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free SRE &amp;amp; Developer Diagnostics:&lt;/strong&gt; Test your stack live with our &lt;a href="https://hostingpodium.com/tools/dns-propagation-checker/" rel="noopener noreferrer"&gt;&lt;strong&gt;Global DNS Propagation Checker &amp;amp; SSL Health Auditor&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://hostingpodium.com/tools/speed-audit/" rel="noopener noreferrer"&gt;&lt;strong&gt;Free Website Speed &amp;amp; Core Web Vitals Checker&lt;/strong&gt;&lt;/a&gt;, or explore all &lt;a href="https://hostingpodium.com/tools/" rel="noopener noreferrer"&gt;&lt;strong&gt;9 Free Webmaster &amp;amp; Cloud Engineering Tools&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This guide explains how to construct a zero-data-loss PostgreSQL HA cluster with Patroni, etcd, and HAProxy across three Linux zones, covering configuration, kernel tuning, and operational runbooks.&lt;/p&gt;




&lt;h2&gt;
  
  
  Scope
&lt;/h2&gt;

&lt;p&gt;This guide details a production-grade PostgreSQL high-availability (HA) stack built on Patroni, etcd, and HAProxy. The target environment is a three-zone deployment on RHEL 9 or AlmaLinux 9, each zone hosting a dedicated compute node. The design guarantees zero data loss under a single-zone outage, enforces split-brain protection at the consensus layer, and provides deterministic client routing via health-checked TCP load balancing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cluster topology
&lt;/h2&gt;

&lt;p&gt;The logical layout consists of:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Instances per zone&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;etcd&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Consensus store for Patroni metadata&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Patroni + PostgreSQL&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Primary or replica, runs synchronous replication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HAProxy&lt;/td&gt;
&lt;td&gt;1 (optional active-passive pair)&lt;/td&gt;
&lt;td&gt;Client entry point, performs TCP health checks&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All nodes share a private VLAN (10.0.0.0/24) for inter-process traffic and a public VLAN for client access. The HAProxy virtual IP (VIP) is allocated from the public subnet and is moved by keepalived on failover.&lt;/p&gt;

&lt;h2&gt;
  
  
  etcd consensus layer
&lt;/h2&gt;

&lt;p&gt;etcd runs as a three-member cluster, one member per zone. The &lt;code&gt;--initial-cluster-state&lt;/code&gt; flag is set to &lt;code&gt;new&lt;/code&gt; on first boot, and &lt;code&gt;--initial-cluster-token&lt;/code&gt; is a UUID unique to the deployment. To prevent split-brain, the &lt;code&gt;--auto-compaction-retention&lt;/code&gt; is set to &lt;code&gt;1h&lt;/code&gt; and the election timeout is tuned to 5 seconds.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# /etc/etcd/etcd.conf&lt;/span&gt;
&lt;span class="nv"&gt;ETCD_DATA_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/var/lib/etcd"&lt;/span&gt;
&lt;span class="nv"&gt;ETCD_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"etcd-&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;hostname&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;ETCD_INITIAL_ADVERTISE_PEER_URLS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;hostname&lt;/span&gt; &lt;span class="nt"&gt;-I&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $1}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;:2380"&lt;/span&gt;
&lt;span class="nv"&gt;ETCD_ADVERTISE_CLIENT_URLS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;hostname&lt;/span&gt; &lt;span class="nt"&gt;-I&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $1}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;:2379"&lt;/span&gt;
&lt;span class="nv"&gt;ETCD_INITIAL_CLUSTER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"etcd-node1=https://10.0.0.11:2380,etcd-node2=https://10.0.0.12:2380,etcd-node3=https://10.0.0.13:2380"&lt;/span&gt;
&lt;span class="nv"&gt;ETCD_INITIAL_CLUSTER_STATE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"new"&lt;/span&gt;
&lt;span class="nv"&gt;ETCD_INITIAL_CLUSTER_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/etcd/token&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;ETCD_CLIENT_CERT_AUTH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"true"&lt;/span&gt;
&lt;span class="nv"&gt;ETCD_PEER_CLIENT_CERT_AUTH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"true"&lt;/span&gt;
&lt;span class="nv"&gt;ETCD_CERT_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/etc/etcd/ssl/etcd.pem"&lt;/span&gt;
&lt;span class="nv"&gt;ETCD_KEY_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/etc/etcd/ssl/etcd-key.pem"&lt;/span&gt;
&lt;span class="nv"&gt;ETCD_TRUSTED_CA_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/etc/etcd/ssl/ca.pem"&lt;/span&gt;
&lt;span class="nv"&gt;ETCD_QUOTA_BACKEND_BYTES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;8589934592   &lt;span class="c"&gt;# 8 GiB&lt;/span&gt;
&lt;span class="nv"&gt;ETCD_ELECTION_TIMEOUT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;5000
&lt;span class="nv"&gt;ETCD_HEARTBEAT_INTERVAL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;250
&lt;span class="nv"&gt;ETCD_AUTO_COMPACTION_RETENTION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1h
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All etcd traffic is encrypted with TLS 1.2+. The quorum size of three ensures that any two zones can form a majority, satisfying the &lt;em&gt;majority rule&lt;/em&gt; for Raft.&lt;/p&gt;

&lt;h2&gt;
  
  
  Patroni configuration
&lt;/h2&gt;

&lt;p&gt;Patroni reads its state from etcd and controls PostgreSQL via &lt;code&gt;pg_ctl&lt;/code&gt;. The configuration file is identical on each node, with zone-specific values injected through environment variables.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# /etc/patroni/patroni.yml&lt;/span&gt;
&lt;span class="na"&gt;scope&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pg-ha-cluster&lt;/span&gt;
&lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/db/&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$(hostname)&lt;/span&gt;
&lt;span class="na"&gt;restapi&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;listen&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;0.0.0.0:8008&lt;/span&gt;
  &lt;span class="na"&gt;connect_address&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;$(hostname -I | awk '{print $1}'):8008&lt;/span&gt;
&lt;span class="na"&gt;etcd&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://10.0.0.11:2379,https://10.0.0.12:2379,https://10.0.0.13:2379&lt;/span&gt;
  &lt;span class="na"&gt;protocol&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https&lt;/span&gt;
  &lt;span class="na"&gt;cacert&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/etc/patroni/ssl/ca.pem&lt;/span&gt;
  &lt;span class="na"&gt;cert&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/etc/patroni/ssl/patroni.pem&lt;/span&gt;
  &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/etc/patroni/ssl/patroni-key.pem&lt;/span&gt;
&lt;span class="na"&gt;bootstrap&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;dcs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;ttl&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;30&lt;/span&gt;
    &lt;span class="na"&gt;loop_wait&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
    &lt;span class="na"&gt;retry_timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
    &lt;span class="na"&gt;maximum_lag_on_failover&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1048576&lt;/span&gt;   &lt;span class="c1"&gt;# 1 MiB&lt;/span&gt;
    &lt;span class="na"&gt;postgresql&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;use_pg_rewind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
      &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;wal_level&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;replica&lt;/span&gt;
        &lt;span class="na"&gt;max_wal_senders&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
        &lt;span class="na"&gt;max_replication_slots&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
        &lt;span class="na"&gt;wal_keep_size&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1024&lt;/span&gt;          &lt;span class="c1"&gt;# MiB&lt;/span&gt;
        &lt;span class="na"&gt;synchronous_commit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;on&lt;/span&gt;
        &lt;span class="na"&gt;synchronous_standby_names&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;
        &lt;span class="na"&gt;hot_standby&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;on&lt;/span&gt;
        &lt;span class="na"&gt;max_connections&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;500&lt;/span&gt;
        &lt;span class="na"&gt;shared_buffers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;4GB&lt;/span&gt;
        &lt;span class="na"&gt;effective_cache_size&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;12GB&lt;/span&gt;
        &lt;span class="na"&gt;work_mem&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;64MB&lt;/span&gt;
        &lt;span class="na"&gt;maintenance_work_mem&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;512MB&lt;/span&gt;
        &lt;span class="na"&gt;checkpoint_timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5min&lt;/span&gt;
        &lt;span class="na"&gt;checkpoint_completion_target&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.9&lt;/span&gt;
  &lt;span class="na"&gt;initdb&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;encoding&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;UTF8&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;locale&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;en_US.UTF-8&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;data-checksums&lt;/span&gt;
  &lt;span class="na"&gt;pg_hba&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;host all all 10.0.0.0/24 md5&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;host replication all 10.0.0.0/24 md5&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;host all all 0.0.0.0/0 reject&lt;/span&gt;
  &lt;span class="na"&gt;users&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;admin&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$(cat&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;/etc/patroni/secrets/admin.pass)"&lt;/span&gt;
      &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;CREATEDB&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;postgresql&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;listen&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;0.0.0.0:5432&lt;/span&gt;
  &lt;span class="na"&gt;data_dir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/var/lib/pgsql/13/data&lt;/span&gt;
  &lt;span class="na"&gt;bin_dir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/usr/pgsql-13/bin&lt;/span&gt;
  &lt;span class="na"&gt;authentication&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;replication&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;replicator&lt;/span&gt;
      &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$(cat&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;/etc/patroni/secrets/replicator.pass)"&lt;/span&gt;
    &lt;span class="na"&gt;superuser&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
      &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$(cat&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;/etc/patroni/secrets/postgres.pass)"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key Patroni Bootstrap &amp;amp; Synchronous Replication Parameters
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;synchronous_standby_names="*"&lt;/code&gt; forces every replica to acknowledge writes, guaranteeing zero data loss as long as a quorum of replicas remains reachable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;maximum_lag_on_failover=1MiB&lt;/code&gt; prevents a lagging replica from being promoted.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;wal_keep_size=1024&lt;/code&gt; reserves enough WAL for a full-zone outage.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  HAProxy routing
&lt;/h2&gt;

&lt;p&gt;HAProxy runs in TCP mode on a dedicated VIP (10.0.1.100). It performs a health check against the Patroni REST API; only nodes reporting &lt;code&gt;state: "running"&lt;/code&gt; and &lt;code&gt;role: "master"&lt;/code&gt; are advertised as primary. Replicas are exposed on a separate port for read-only workloads.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# /etc/haproxy/haproxy.cfg&lt;/span&gt;
global
    log /dev/log    local0
    maxconn 5000
    daemon
    tune.ssl.default-dh-param 2048
    ssl-default-bind-ciphers &lt;span class="nv"&gt;PROFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;SYSTEM
    ssl-default-server-ciphers &lt;span class="nv"&gt;PROFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;SYSTEM
    ssl-default-bind-options no-sslv3 no-tlsv10 no-tlsv11
    nbproc 2
    cpu-map 1 0-3
    cpu-map 2 4-7

defaults
    mode tcp
    log global
    &lt;span class="nb"&gt;timeout &lt;/span&gt;connect 5s
    &lt;span class="nb"&gt;timeout &lt;/span&gt;client 30s
    &lt;span class="nb"&gt;timeout &lt;/span&gt;server 30s
    option tcplog
    retries 3

frontend pgsql_front
    &lt;span class="nb"&gt;bind &lt;/span&gt;10.0.1.100:5432
    default_backend pgsql_primary
    acl is_read path_beg /read
    use_backend pgsql_replica &lt;span class="k"&gt;if &lt;/span&gt;is_read

backend pgsql_primary
    option httpchk GET /master
    http-check expect status 200
    server pg1 10.0.0.21:5432 check port 8008 inter 2s rise 2 fall 3
    server pg2 10.0.0.22:5432 check port 8008 inter 2s rise 2 fall 3 backup
    server pg3 10.0.0.23:5432 check port 8008 inter 2s rise 2 fall 3 backup

backend pgsql_replica
    option httpchk GET /replica
    http-check expect status 200
    server pg1 10.0.0.21:5432 check port 8008 inter 2s rise 2 fall 3 disabled
    server pg2 10.0.0.22:5432 check port 8008 inter 2s rise 2 fall 3
    server pg3 10.0.0.23:5432 check port 8008 inter 2s rise 2 fall 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Failover is driven by keepalived moving the VIP to the node whose Patroni instance reports &lt;code&gt;role: "master"&lt;/code&gt;. The health-check interval of 2 seconds yields sub-second detection of primary loss.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kernel and system parameters
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://hostingpodium.com/our-services/linux-engineering/" rel="noopener noreferrer"&gt;Linux kernel&lt;/a&gt; tuning focuses on network buffers, shared memory limits, and file descriptor counts. The following &lt;code&gt;sysctl&lt;/code&gt; settings are applied on every PostgreSQL node:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Rationale&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;net.core.somaxconn&lt;/td&gt;
&lt;td&gt;4096&lt;/td&gt;
&lt;td&gt;Allows HAProxy to accept many concurrent connections.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;net.ipv4.tcp_tw_reuse&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Reduces TIME_WAIT buildup under heavy client churn.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;vm.max_map_count&lt;/td&gt;
&lt;td&gt;262144&lt;/td&gt;
&lt;td&gt;Required for large shared memory segments used by PostgreSQL.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;kernel.shmmax&lt;/td&gt;
&lt;td&gt;68719476736&lt;/td&gt;
&lt;td&gt;68 GiB – matches shared_buffers plus overhead.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;kernel.shmall&lt;/td&gt;
&lt;td&gt;16777216&lt;/td&gt;
&lt;td&gt;Number of pages (8 KiB each) to support shmmax.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;fs.file-max&lt;/td&gt;
&lt;td&gt;1000000&lt;/td&gt;
&lt;td&gt;Ensures PostgreSQL can open the required number of sockets and files.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Persist the values in &lt;code&gt;/etc/sysctl.d/99-pg-ha.conf&lt;/code&gt; and reload with &lt;code&gt;sysctl --system&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Synchronous replication strategy
&lt;/h2&gt;

&lt;p&gt;Patroni is configured for &lt;code&gt;synchronous_commit=on&lt;/code&gt; and &lt;code&gt;synchronous_standby_names="*"&lt;/code&gt;. In a three-zone deployment this means the primary must receive acknowledgment from both replicas before confirming a transaction. The write latency typically rises by 2-4 ms, measured with &lt;code&gt;pgbench -c 50 -j 4 -T 60&lt;/code&gt;. The trade-off is acceptable for workloads that cannot tolerate data loss.&lt;/p&gt;

&lt;p&gt;In the event that a replica becomes unreachable, Patroni automatically demotes the primary to asynchronous mode after a configurable &lt;code&gt;failover_timeout&lt;/code&gt; (default 30 seconds). This prevents a permanent write stall while preserving data integrity once the missing replica rejoins.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failover and recovery runbook
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Detect primary loss&lt;/strong&gt;: HAProxy health check fails, keepalived triggers VIP move.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Patroni election&lt;/strong&gt;: Remaining nodes consult etcd; the node with the lowest &lt;code&gt;name&lt;/code&gt; wins the Raft election and assumes &lt;code&gt;role: "master"&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Promote replica&lt;/strong&gt;: Patroni runs &lt;code&gt;pg_ctl promote&lt;/code&gt;. PostgreSQL replays pending WAL up to the last synchronous commit.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Validate quorum&lt;/strong&gt;: Verify &lt;code&gt;SELECT pg_is_in_recovery();&lt;/code&gt; returns false on the new primary and &lt;code&gt;SELECT * FROM pg_stat_replication;&lt;/code&gt; shows both replicas in sync.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Update HAProxy&lt;/strong&gt;: &lt;a href="https://hostingpodium.com/tools/redirect-tracer/" rel="noopener noreferrer"&gt;Health check endpoint&lt;/a&gt; &lt;code&gt;/master&lt;/code&gt; now returns 200, HAProxy routes traffic to the new primary within two seconds.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Re-integrate failed zone&lt;/strong&gt;: Once the node is back online, start etcd, let it join the Raft cluster, then start Patroni. It will register as a replica and begin streaming WAL.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Post-failover audit&lt;/strong&gt;: Capture &lt;code&gt;etcdctl endpoint status --write-out=table&lt;/code&gt; and &lt;code&gt;patronictl list&lt;/code&gt; output for &lt;a href="https://hostingpodium.com/tools/dmarc-checker/" rel="noopener noreferrer"&gt;compliance records&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the failed zone contained the original primary and its data directory is corrupted, initiate a fresh base backup using &lt;code&gt;pg_basebackup -D /var/lib/pgsql/13/data -Fp -Xs -P -R&lt;/code&gt; from the current primary before re-joining.&lt;/p&gt;

&lt;h2&gt;
  
  
  Observability stack
&lt;/h2&gt;

&lt;p&gt;Metrics are collected via &lt;a href="https://hostingpodium.com/blog/prometheus-grafana-enterprise-observability-stack/" rel="noopener noreferrer"&gt;Prometheus&lt;/a&gt; exporters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;etcd exporter on port 2379/metrics&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Patroni exporter (built-in) on port 8008/metrics&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;PostgreSQL exporter on port 9187&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;HAProxy exporter on port 9101&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Alertmanager Rules &amp;amp; Quorum Loss Thresholds
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# alerts.yml&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;alert&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PostgreSQLPrimaryDown&lt;/span&gt;
  &lt;span class="na"&gt;expr&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;patroni_role{role="master"} == &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
  &lt;span class="na"&gt;for&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;30s&lt;/span&gt;
  &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;severity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;critical&lt;/span&gt;
  &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Primary&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;PostgreSQL&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;instance&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;is&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;down"&lt;/span&gt;
    &lt;span class="na"&gt;runbook&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://internal.runbooks/pg-primary-failure"&lt;/span&gt;

&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;alert&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;EtcdQuorumLost&lt;/span&gt;
  &lt;span class="na"&gt;expr&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;etcd_server_has_leader == &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
  &lt;span class="na"&gt;for&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;15s&lt;/span&gt;
  &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;severity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;warning&lt;/span&gt;
  &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Etcd&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;cluster&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;has&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;lost&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;quorum"&lt;/span&gt;
    &lt;span class="na"&gt;runbook&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://internal.runbooks/etcd-quorum"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Logs are shipped to Elasticsearch via Filebeat; each component tags logs with &lt;code&gt;service=postgresql|etcd|haproxy&lt;/code&gt; for easy correlation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trade-offs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Latency vs. durability&lt;/strong&gt;: Synchronous replication adds 2-4 ms per transaction; asynchronous mode reduces latency but permits data loss if the primary crashes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Complexity of etcd&lt;/strong&gt;: Managing a Raft cluster adds operational overhead compared to a simple file-based DCS, but it eliminates split-brain scenarios that can arise with ZooKeeper or Consul under network partitions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;HAProxy vs. PgBouncer&lt;/strong&gt;: HAProxy offers TCP-level health checks and VIP failover, whereas PgBouncer provides connection pooling but cannot move a VIP without additional tooling.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Resource footprint&lt;/strong&gt;: Running three full PostgreSQL instances with 4 GiB shared buffers each consumes ~12 GiB RAM per node; sizing must account for OS, etcd, and HAProxy overhead.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Operational checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Validate &lt;a href="https://hostingpodium.com/tools/dns-propagation-checker/" rel="noopener noreferrer"&gt;TLS certificates&lt;/a&gt; on etcd, Patroni, and HAProxy before deployment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run &lt;code&gt;etcdctl endpoint health&lt;/code&gt; on each member; expect 100 % success.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Confirm &lt;code&gt;patronictl list&lt;/code&gt; shows one master and two replicas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Execute &lt;code&gt;pgbench -c 10 -j 2 -T 30&lt;/code&gt; and record 95th-percentile latency; must stay below 10 ms under baseline load.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Test failover by stopping &lt;code&gt;patroni&lt;/code&gt; on the master; verify VIP moves and new master promotion within 30 seconds.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Inspect Prometheus alerts after each test; no pending critical alerts should remain.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Back up etcd snapshots daily with &lt;code&gt;etcdctl snapshot save /backups/etcd-$(date +%F).db&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Following this checklist on a weekly cadence keeps the HA stack within SLA limits and provides early detection of configuration drift.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;The combination of Patroni, etcd, and HAProxy delivers a deterministic failover path, strict split-brain avoidance, and zero-data-loss guarantees for PostgreSQL workloads spread across three availability zones. By adhering to the kernel parameters, replication settings, and runbook steps outlined above, operators can meet sub-second recovery objectives and maintain consistent performance under load.&lt;/p&gt;




&lt;h2&gt;
  
  
  Free Webmaster, SRE &amp;amp; Cloud Diagnostic Tools (No Signup Required)
&lt;/h2&gt;

&lt;p&gt;Verify and benchmark your production infrastructure directly from your browser using the &lt;strong&gt;&lt;a href="https://hostingpodium.com/tools/" rel="noopener noreferrer"&gt;HostingPodium Free Webmaster &amp;amp; Developer Suite&lt;/a&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Free Engineering Utility&lt;/th&gt;
&lt;th&gt;Primary Diagnostic Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://hostingpodium.com/tools/dns-propagation-checker/" rel="noopener noreferrer"&gt;Global DNS Propagation &amp;amp; SSL Checker&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Verify live A, AAAA, CNAME, MX, TXT, NS &amp;amp; CAA records across 21+ global resolvers + TLS certificate audits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://hostingpodium.com/tools/speed-audit/" rel="noopener noreferrer"&gt;Website Speed Test &amp;amp; Core Web Vitals Auditor&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Measure server TTFB, LCP, INP, CLS, and HTTP/2 compression latency in real time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://hostingpodium.com/tools/schema-generator/" rel="noopener noreferrer"&gt;Rich Snippets &amp;amp; Schema.org JSON-LD Generator&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Generate &amp;amp; validate structured JSON-LD markup for TechArticles, FAQs, Products &amp;amp; Organizations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://hostingpodium.com/tools/redirect-tracer/" rel="noopener noreferrer"&gt;HTTP Redirect Chain &amp;amp; Status Code Tracer&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Trace 301/302 redirect hops, inspect response headers, and verify load balancer health checks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://hostingpodium.com/tools/dmarc-checker/" rel="noopener noreferrer"&gt;DMARC, SPF &amp;amp; DKIM Email Security Validator&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Audit domain email authentication policies and generate compliant DMARC records&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://hostingpodium.com/tools/serp-preview/" rel="noopener noreferrer"&gt;Google SERP Simulator &amp;amp; Meta Tag Previewer&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Preview desktop/mobile Google snippets, OpenGraph cards, and pixel-width truncation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://hostingpodium.com/tools/webp-converter/" rel="noopener noreferrer"&gt;Free WebP Image Converter &amp;amp; Optimizer&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Client-side PNG/JPG to WebP compression for faster Core Web Vitals LCP&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Related Enterprise Architecture &amp;amp; Benchmarks
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Canonical Engineering Guide:&lt;/strong&gt; &lt;a href="https://hostingpodium.com/blog/postgresql-high-availability-patroni-etcd-haproxy-linux/" rel="noopener noreferrer"&gt;Designing PostgreSQL HA with Patroni, etcd, and HAProxy in Multi-Zone Linux Clusters&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Managed Engineering Practice:&lt;/strong&gt; &lt;a href="https://hostingpodium.com/our-services/server-hosting-administration/" rel="noopener noreferrer"&gt;24/7 Managed Infrastructure, Linux SRE &amp;amp; Observability&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure Benchmark Comparison:&lt;/strong&gt; &lt;a href="https://hostingpodium.com/compare/hetzner-alternative/" rel="noopener noreferrer"&gt;Hetzner Alternative: 24/7 Managed Bare Metal vs Unmanaged Hardware&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>postgres</category>
      <category>linux</category>
      <category>database</category>
      <category>sre</category>
    </item>
  </channel>
</rss>
