<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Consistency on IT Comparison</title><link>https://comparison.metacog.co.kr/tags/consistency/</link><description>Recent content in Consistency on IT Comparison</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 06 Sep 2026 09:47:10 +0900</lastBuildDate><atom:link href="https://comparison.metacog.co.kr/tags/consistency/index.xml" rel="self" type="application/rss+xml"/><item><title>Primary vs Replica Reads: Strong Consistency vs Read Scaling</title><link>https://comparison.metacog.co.kr/posts/2026-09-06-primary-vs-replica-reads-strong-consistency-vs-read-scaling/</link><pubDate>Sun, 06 Sep 2026 09:47:10 +0900</pubDate><guid>https://comparison.metacog.co.kr/posts/2026-09-06-primary-vs-replica-reads-strong-consistency-vs-read-scaling/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;In a replicated database, read queries can be routed to the &lt;strong class="kw"&gt;primary&lt;/strong&gt; node or to one of the &lt;strong class="kw"&gt;read replicas&lt;/strong&gt;. The choice trades guaranteed data freshness for the ability to scale read throughput and reduce load on the write path.&lt;/p&gt;
&lt;h2 id="comparison-diagram"&gt;Comparison Diagram&lt;/h2&gt;
&lt;div class="compare-diagram"&gt;
&lt;svg viewBox="0 0 640 360" xmlns="http://www.w3.org/2000/svg"&gt;&lt;rect x="260" y="20" width="120" height="48" rx="6" style="fill:none;stroke:var(--border)" stroke-width="1.5"/&gt;&lt;text x="320" y="49" text-anchor="middle" style="fill:var(--content)" font-size="14"&gt;Client&lt;/text&gt;&lt;rect x="90" y="160" width="160" height="64" rx="6" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="170" y="186" text-anchor="middle" style="fill:var(--primary)" font-size="15" font-weight="bold"&gt;Primary&lt;/text&gt;&lt;text x="170" y="205" text-anchor="middle" style="fill:var(--secondary)" font-size="11"&gt;handles all writes&lt;/text&gt;&lt;rect x="390" y="160" width="160" height="64" rx="6" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="470" y="186" text-anchor="middle" style="fill:var(--primary)" font-size="15" font-weight="bold"&gt;Replica&lt;/text&gt;&lt;text x="470" y="205" text-anchor="middle" style="fill:var(--secondary)" font-size="11"&gt;read-only copy&lt;/text&gt;&lt;line x1="250" y1="192" x2="390" y2="192" style="stroke:var(--border)" stroke-width="1.5" stroke-dasharray="5,4"/&gt;&lt;path d="M250,192 L390,192" style="stroke:var(--border)" stroke-width="1.5" stroke-dasharray="5,4" marker-end="url(#arrowRep)"/&gt;&lt;text x="320" y="180" text-anchor="middle" style="fill:var(--secondary)" font-size="10"&gt;async replication (lag)&lt;/text&gt;&lt;defs&gt;&lt;marker id="arrowRep" markerWidth="8" markerHeight="8" refX="6" refY="4" orient="auto"&gt;&lt;path d="M0,0 L8,4 L0,8 Z" style="fill:var(--border)"/&gt;&lt;/marker&gt;&lt;marker id="arrowA" markerWidth="8" markerHeight="8" refX="6" refY="4" orient="auto"&gt;&lt;path d="M0,0 L8,4 L0,8 Z" style="fill:var(--compare-a)"/&gt;&lt;/marker&gt;&lt;marker id="arrowB" markerWidth="8" markerHeight="8" refX="6" refY="4" orient="auto"&gt;&lt;path d="M0,0 L8,4 L0,8 Z" style="fill:var(--compare-b)"/&gt;&lt;/marker&gt;&lt;/defs&gt;&lt;path d="M300,68 L190,160" style="stroke:var(--compare-a)" stroke-width="1.5" fill="none" marker-end="url(#arrowA)"/&gt;&lt;text x="215" y="110" text-anchor="middle" style="fill:var(--compare-a)" font-size="11"&gt;write&lt;/text&gt;&lt;path d="M310,68 L235,160" style="stroke:var(--compare-a)" stroke-width="1.5" fill="none" stroke-dasharray="4,3" marker-end="url(#arrowA)"/&gt;&lt;text x="290" y="130" text-anchor="middle" style="fill:var(--compare-a)" font-size="11"&gt;read (fresh)&lt;/text&gt;&lt;path d="M340,68 L450,160" style="stroke:var(--compare-b)" stroke-width="1.5" fill="none" stroke-dasharray="4,3" marker-end="url(#arrowB)"/&gt;&lt;text x="400" y="130" text-anchor="middle" style="fill:var(--compare-b)" font-size="11"&gt;read (maybe stale)&lt;/text&gt;&lt;text x="170" y="260" text-anchor="middle" style="fill:var(--secondary)" font-size="12"&gt;single node, no lag&lt;/text&gt;&lt;text x="470" y="260" text-anchor="middle" style="fill:var(--secondary)" font-size="12"&gt;scales out horizontally&lt;/text&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;h2 id="comparison-table"&gt;Comparison Table&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Primary Reads&lt;/th&gt;
&lt;th&gt;Replica Reads&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Read target&lt;/td&gt;
&lt;td&gt;Always the single primary node&lt;/td&gt;
&lt;td&gt;Any of one or more read replicas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Consistency guarantee&lt;/td&gt;
&lt;td&gt;Read-your-writes, strongly consistent&lt;/td&gt;
&lt;td&gt;Eventual consistency, may lag behind writes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Replication lag exposure&lt;/td&gt;
&lt;td&gt;None, reads the current write state directly&lt;/td&gt;
&lt;td&gt;Exposed to lag, from milliseconds to seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contention with writes&lt;/td&gt;
&lt;td&gt;Reads compete with writes for CPU, locks, and I/O&lt;/td&gt;
&lt;td&gt;Writes on primary don&amp;rsquo;t directly compete with replica reads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read throughput scaling&lt;/td&gt;
&lt;td&gt;Bounded by single node capacity&lt;/td&gt;
&lt;td&gt;Scales horizontally by adding more replicas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Latency profile&lt;/td&gt;
&lt;td&gt;Consistent, no wait for replication to catch up&lt;/td&gt;
&lt;td&gt;Can be lower if replica is geographically closer, but variable under lag&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failover behavior&lt;/td&gt;
&lt;td&gt;Node failure requires promotion and brief write/read outage&lt;/td&gt;
&lt;td&gt;Load balancer can reroute to another healthy replica&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical use case&lt;/td&gt;
&lt;td&gt;Financial transactions, read-after-write flows, admin views&lt;/td&gt;
&lt;td&gt;Analytics, reporting, public APIs, dashboards&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="key-differences"&gt;Key Differences&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong class="kw"&gt;Primary reads&lt;/strong&gt; guarantee read-your-writes consistency; &lt;strong class="kw"&gt;replica reads&lt;/strong&gt; may return stale data due to lag.&lt;/li&gt;
&lt;li&gt;Replica reads scale horizontally by adding &lt;strong class="kw"&gt;read replicas&lt;/strong&gt;; primary reads are bottlenecked by a &lt;strong class="kw"&gt;single node&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Primary reads compete with write traffic for resources; replica reads isolate read load via &lt;strong class="kw"&gt;replication&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong class="kw"&gt;Replication lag&lt;/strong&gt; on replicas ranges from milliseconds to seconds depending on network and write volume.&lt;/li&gt;
&lt;li&gt;Failover on the primary causes brief unavailability; replica failures are masked by &lt;strong class="kw"&gt;load balancing&lt;/strong&gt; across peers.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="when-to-use-each"&gt;When to Use Each&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Primary Reads&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Sync vs Async Replication: When the Write Actually Commits</title><link>https://comparison.metacog.co.kr/posts/2026-09-06-sync-vs-async-replication-when-the-write-actually-commits/</link><pubDate>Sun, 06 Sep 2026 09:39:49 +0900</pubDate><guid>https://comparison.metacog.co.kr/posts/2026-09-06-sync-vs-async-replication-when-the-write-actually-commits/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;Synchronous and asynchronous replication differ in exactly one moment: when the primary tells the client a write succeeded. &lt;strong class="kw"&gt;Sync replication&lt;/strong&gt; waits for the replica to confirm before acknowledging, while &lt;strong class="kw"&gt;async replication&lt;/strong&gt; acknowledges immediately and copies the data afterward. That single timing difference cascades into everything else — latency, throughput, and how much data you can lose on failover.&lt;/p&gt;
&lt;h2 id="comparison-diagram"&gt;Comparison Diagram&lt;/h2&gt;
&lt;div class="compare-diagram"&gt;
&lt;svg viewBox="0 0 640 360" xmlns="http://www.w3.org/2000/svg"&gt;&lt;defs&gt;&lt;marker id="arrowA" markerWidth="8" markerHeight="8" refX="6" refY="3" orient="auto"&gt;&lt;path d="M0,0 L6,3 L0,6 Z" style="fill:var(--compare-a)"/&gt;&lt;/marker&gt;&lt;marker id="arrowB" markerWidth="8" markerHeight="8" refX="6" refY="3" orient="auto"&gt;&lt;path d="M0,0 L6,3 L0,6 Z" style="fill:var(--compare-b)"/&gt;&lt;/marker&gt;&lt;/defs&gt;&lt;text x="160" y="22" text-anchor="middle" style="fill:var(--primary)" font-size="16" font-weight="bold"&gt;Sync Replication&lt;/text&gt;&lt;text x="480" y="22" text-anchor="middle" style="fill:var(--primary)" font-size="16" font-weight="bold"&gt;Async Replication&lt;/text&gt;&lt;rect x="90" y="40" width="140" height="40" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="160" y="65" text-anchor="middle" style="fill:var(--content)" font-size="13"&gt;Client&lt;/text&gt;&lt;rect x="90" y="150" width="140" height="40" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="160" y="175" text-anchor="middle" style="fill:var(--content)" font-size="13"&gt;Primary&lt;/text&gt;&lt;rect x="90" y="270" width="140" height="40" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="160" y="295" text-anchor="middle" style="fill:var(--content)" font-size="13"&gt;Replica&lt;/text&gt;&lt;line x1="150" y1="80" x2="150" y2="150" style="stroke:var(--compare-a)" stroke-width="1.5" marker-end="url(#arrowA)"/&gt;&lt;text x="60" y="115" style="fill:var(--secondary)" font-size="10"&gt;1. write&lt;/text&gt;&lt;line x1="150" y1="190" x2="150" y2="270" style="stroke:var(--compare-a)" stroke-width="1.5" marker-end="url(#arrowA)"/&gt;&lt;text x="60" y="235" style="fill:var(--secondary)" font-size="10"&gt;2. replicate&lt;/text&gt;&lt;line x1="210" y1="270" x2="210" y2="190" style="stroke:var(--compare-a)" stroke-width="1.5" marker-end="url(#arrowA)"/&gt;&lt;text x="213" y="235" style="fill:var(--secondary)" font-size="10"&gt;3. ack&lt;/text&gt;&lt;line x1="170" y1="150" x2="170" y2="80" style="stroke:var(--compare-a)" stroke-width="1.5" marker-end="url(#arrowA)"/&gt;&lt;text x="173" y="115" style="fill:var(--secondary)" font-size="10"&gt;4. commit&lt;/text&gt;&lt;text x="160" y="330" text-anchor="middle" style="fill:var(--content)" font-size="11"&gt;Client waits for step 3&lt;/text&gt;&lt;rect x="410" y="40" width="140" height="40" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="480" y="65" text-anchor="middle" style="fill:var(--content)" font-size="13"&gt;Client&lt;/text&gt;&lt;rect x="410" y="150" width="140" height="40" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="480" y="175" text-anchor="middle" style="fill:var(--content)" font-size="13"&gt;Primary&lt;/text&gt;&lt;rect x="410" y="270" width="140" height="40" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="480" y="295" text-anchor="middle" style="fill:var(--content)" font-size="13"&gt;Replica&lt;/text&gt;&lt;line x1="470" y1="80" x2="470" y2="150" style="stroke:var(--compare-b)" stroke-width="1.5" marker-end="url(#arrowB)"/&gt;&lt;text x="390" y="115" style="fill:var(--secondary)" font-size="10"&gt;1. write&lt;/text&gt;&lt;line x1="500" y1="150" x2="500" y2="80" style="stroke:var(--compare-b)" stroke-width="1.5" marker-end="url(#arrowB)"/&gt;&lt;text x="503" y="115" style="fill:var(--secondary)" font-size="10"&gt;2. commit&lt;/text&gt;&lt;line x1="480" y1="190" x2="480" y2="270" style="stroke:var(--compare-b)" stroke-width="1.5" stroke-dasharray="5,4" marker-end="url(#arrowB)"/&gt;&lt;text x="390" y="235" style="fill:var(--secondary)" font-size="10"&gt;3. replicate later&lt;/text&gt;&lt;text x="480" y="330" text-anchor="middle" style="fill:var(--content)" font-size="11"&gt;Client returns at step 2&lt;/text&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;h2 id="comparison-table"&gt;Comparison Table&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Sync Replication&lt;/th&gt;
&lt;th&gt;Async Replication&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Write acknowledgment&lt;/td&gt;
&lt;td&gt;Waits for replica confirmation before committing&lt;/td&gt;
&lt;td&gt;Commits on primary alone, replicates after&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Commit latency&lt;/td&gt;
&lt;td&gt;Includes network round-trip to replica&lt;/td&gt;
&lt;td&gt;Bound only by primary&amp;rsquo;s local write&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data consistency&lt;/td&gt;
&lt;td&gt;Replica is always up to date at commit time&lt;/td&gt;
&lt;td&gt;Replica can lag behind primary momentarily&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Throughput under load&lt;/td&gt;
&lt;td&gt;Degrades as replica distance or count grows&lt;/td&gt;
&lt;td&gt;Unaffected by replica speed or distance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Replica or network failure&lt;/td&gt;
&lt;td&gt;Writes block or fail until replica responds&lt;/td&gt;
&lt;td&gt;Writes continue uninterrupted on primary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failover data loss&lt;/td&gt;
&lt;td&gt;None — replica always has the committed write&lt;/td&gt;
&lt;td&gt;Possible — unreplicated writes are lost&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Replication lag monitoring&lt;/td&gt;
&lt;td&gt;Not applicable — lag is structurally zero&lt;/td&gt;
&lt;td&gt;Critical — must track and alert on lag&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="key-differences"&gt;Key Differences&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong class="kw"&gt;Commit timing&lt;/strong&gt; is the root difference: sync waits, async doesn&amp;rsquo;t&lt;/li&gt;
&lt;li&gt;Sync trades &lt;strong class="kw"&gt;latency&lt;/strong&gt; for a zero-data-loss guarantee on failover&lt;/li&gt;
&lt;li&gt;Async trades &lt;strong class="kw"&gt;durability&lt;/strong&gt; for consistently fast local commits&lt;/li&gt;
&lt;li&gt;Multi-region setups favor async since &lt;strong class="kw"&gt;round-trip time&lt;/strong&gt; would make sync commits too slow&lt;/li&gt;
&lt;li&gt;Async requires active &lt;strong class="kw"&gt;lag monitoring&lt;/strong&gt; that sync simply doesn&amp;rsquo;t need&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="when-to-use-each"&gt;When to Use Each&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Sync Replication&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Consistency vs Availability: The CAP Theorem Tradeoff</title><link>https://comparison.metacog.co.kr/posts/2026-09-06-consistency-vs-availability-the-cap-theorem-tradeoff/</link><pubDate>Sun, 06 Sep 2026 09:35:36 +0900</pubDate><guid>https://comparison.metacog.co.kr/posts/2026-09-06-consistency-vs-availability-the-cap-theorem-tradeoff/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;When a distributed system suffers a network partition, it must choose between &lt;strong class="kw"&gt;consistency&lt;/strong&gt; (every node sees the same data, even if that means rejecting requests) and &lt;strong class="kw"&gt;availability&lt;/strong&gt; (every request gets a response, even if the data might be stale). This CAP theorem tradeoff shapes how databases behave under failure and directly affects correctness guarantees versus uptime.&lt;/p&gt;
&lt;h2 id="comparison-diagram"&gt;Comparison Diagram&lt;/h2&gt;
&lt;div class="compare-diagram"&gt;
&lt;svg viewBox="0 0 640 360" xmlns="http://www.w3.org/2000/svg"&gt;&lt;line x1="320" y1="10" x2="320" y2="350" style="stroke:var(--border)" stroke-width="1.5" stroke-dasharray="6,5"/&gt;&lt;text x="160" y="28" text-anchor="middle" style="fill:var(--primary)" font-size="17" font-weight="bold"&gt;Consistency (CP)&lt;/text&gt;&lt;text x="480" y="28" text-anchor="middle" style="fill:var(--primary)" font-size="17" font-weight="bold"&gt;Availability (AP)&lt;/text&gt;&lt;rect x="100" y="44" width="120" height="36" rx="5" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="160" y="67" text-anchor="middle" style="fill:var(--content)" font-size="13"&gt;Client&lt;/text&gt;&lt;rect x="420" y="44" width="120" height="36" rx="5" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="480" y="67" text-anchor="middle" style="fill:var(--content)" font-size="13"&gt;Client&lt;/text&gt;&lt;line x1="140" y1="80" x2="105" y2="140" style="stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;polygon points="105,140 112,131 118,138" style="fill:var(--compare-a)"/&gt;&lt;line x1="175" y1="140" x2="185" y2="80" style="stroke:var(--compare-a)" stroke-width="1.5" stroke-dasharray="4,3"/&gt;&lt;polygon points="185,80 178,86 182,90" style="fill:var(--compare-a)"/&gt;&lt;text x="210" y="105" text-anchor="middle" style="fill:var(--compare-a)" font-size="11"&gt;503 blocked&lt;/text&gt;&lt;line x1="460" y1="80" x2="425" y2="140" style="stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;polygon points="425,140 432,131 438,138" style="fill:var(--compare-b)"/&gt;&lt;line x1="495" y1="140" x2="505" y2="80" style="stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;polygon points="505,80 498,86 502,90" style="fill:var(--compare-b)"/&gt;&lt;text x="530" y="105" text-anchor="middle" style="fill:var(--compare-b)" font-size="11"&gt;200 OK (stale)&lt;/text&gt;&lt;rect x="60" y="140" width="100" height="50" rx="5" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="110" y="170" text-anchor="middle" style="fill:var(--content)" font-size="13"&gt;Node A&lt;/text&gt;&lt;rect x="200" y="140" width="100" height="50" rx="5" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;text x="250" y="170" text-anchor="middle" style="fill:var(--content)" font-size="13"&gt;Node B&lt;/text&gt;&lt;path d="M180 135 L172 150 L188 165 L180 180 L172 195" style="stroke:var(--border);fill:none" stroke-width="2"/&gt;&lt;text x="180" y="122" text-anchor="middle" style="fill:var(--secondary)" font-size="10"&gt;partition&lt;/text&gt;&lt;rect x="380" y="140" width="100" height="50" rx="5" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="430" y="170" text-anchor="middle" style="fill:var(--content)" font-size="13"&gt;Node A&lt;/text&gt;&lt;rect x="520" y="140" width="100" height="50" rx="5" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="570" y="170" text-anchor="middle" style="fill:var(--content)" font-size="13"&gt;Node B&lt;/text&gt;&lt;path d="M500 135 L492 150 L508 165 L500 180 L492 195" style="stroke:var(--border);fill:none" stroke-width="2"/&gt;&lt;text x="500" y="122" text-anchor="middle" style="fill:var(--secondary)" font-size="10"&gt;partition&lt;/text&gt;&lt;text x="160" y="235" text-anchor="middle" style="fill:var(--secondary)" font-size="12"&gt;Waits for quorum, rejects request&lt;/text&gt;&lt;text x="160" y="260" text-anchor="middle" style="fill:var(--content)" font-size="12"&gt;Guarantee: no stale reads&lt;/text&gt;&lt;text x="480" y="235" text-anchor="middle" style="fill:var(--secondary)" font-size="12"&gt;Answers immediately from local data&lt;/text&gt;&lt;text x="480" y="260" text-anchor="middle" style="fill:var(--content)" font-size="12"&gt;Guarantee: no downtime&lt;/text&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;h2 id="comparison-table"&gt;Comparison Table&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Consistency (CP)&lt;/th&gt;
&lt;th&gt;Availability (AP)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Normal operation (no partition)&lt;/td&gt;
&lt;td&gt;Behaves identically to any healthy cluster; all replicas agree&lt;/td&gt;
&lt;td&gt;Behaves identically to any healthy cluster; all replicas agree&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Behavior when a partition occurs&lt;/td&gt;
&lt;td&gt;Nodes that cannot confirm quorum stop responding&lt;/td&gt;
&lt;td&gt;All nodes keep responding regardless of quorum status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Write handling during partition&lt;/td&gt;
&lt;td&gt;Writes are rejected or queued until enough replicas are reachable&lt;/td&gt;
&lt;td&gt;Writes are accepted locally and replicated once the partition heals&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read handling during partition&lt;/td&gt;
&lt;td&gt;Reads are blocked or errored if the latest value can&amp;rsquo;t be confirmed&lt;/td&gt;
&lt;td&gt;Reads are served from whatever local replica is reachable, even if stale&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client-facing failure mode&lt;/td&gt;
&lt;td&gt;Client sees a timeout or explicit error (e.g. 503)&lt;/td&gt;
&lt;td&gt;Client sees a successful response that may contain outdated data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data guarantee provided&lt;/td&gt;
&lt;td&gt;Linearizability - no two nodes ever disagree on current state&lt;/td&gt;
&lt;td&gt;Liveness - the system always answers, correctness may lag&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recovery after partition heals&lt;/td&gt;
&lt;td&gt;Resumes cleanly; no conflicting writes existed since they were blocked&lt;/td&gt;
&lt;td&gt;Must reconcile diverging writes via vector clocks, LWW, or CRDTs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Representative systems&lt;/td&gt;
&lt;td&gt;HBase, Zookeeper, MongoDB (default majority writes)&lt;/td&gt;
&lt;td&gt;Cassandra, DynamoDB, Riak&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="key-differences"&gt;Key Differences&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The tradeoff only bites during an actual &lt;strong class="kw"&gt;network partition&lt;/strong&gt; - outside of that, both behave the same.&lt;/li&gt;
&lt;li&gt;Consistency requires a &lt;strong class="kw"&gt;quorum&lt;/strong&gt; agreement before answering, which can mean refusing requests.&lt;/li&gt;
&lt;li&gt;Availability guarantees a response but risks returning &lt;strong class="kw"&gt;stale data&lt;/strong&gt; to the client.&lt;/li&gt;
&lt;li&gt;The choice determines whether you need a &lt;strong class="kw"&gt;conflict resolution&lt;/strong&gt; strategy for divergent writes after recovery.&lt;/li&gt;
&lt;li&gt;Many production databases offer &lt;strong class="kw"&gt;tunable consistency&lt;/strong&gt;, letting you pick per-operation rather than a single global stance.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="when-to-use-each"&gt;When to Use Each&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Consistency (CP)&lt;/strong&gt;&lt;/p&gt;</description></item></channel></rss>