<?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>Aurora-Dsql on Tarragon</title><link>https://tarrragon.github.io/blog/tags/aurora-dsql/</link><description>Recent content in Aurora-Dsql on Tarragon</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Tarragon (CC BY 4.0)</copyright><lastBuildDate>Tue, 02 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tarrragon.github.io/blog/tags/aurora-dsql/index.xml" rel="self" type="application/rss+xml"/><item><title>Aurora PG/MySQL vs Aurora DSQL 取捨：何時 single-region managed 夠用、何時跨到 distributed</title><link>https://tarrragon.github.io/blog/backend/01-database/vendors/aurora/aurora-vs-dsql-tradeoff/</link><pubDate>Tue, 02 Jun 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/01-database/vendors/aurora/aurora-vs-dsql-tradeoff/</guid><description>&lt;blockquote>
&lt;p>本文是 Aurora family 內的決策取捨文章。聚焦 &lt;em>standard Aurora（Aurora PostgreSQL / MySQL，single-region managed SQL）&lt;/em> 跟 &lt;em>Aurora DSQL（active-active distributed SQL）&lt;/em> 之間的升級門檻判斷。兩個既有 SSoT 不在本篇重複：「PG → DSQL 怎麼遷」見 &lt;a href="https://tarrragon.github.io/blog/backend/01-database/vendors/postgresql/migrate-to-aurora-dsql/" data-link-title="PostgreSQL → Aurora DSQL Migration：PG wire-compatible Distributed SQL 的 Paradigm Shift" data-link-desc="Aurora DSQL（2024-12 re:Invent preview / 2025-05 GA）是 AWS 推的 PG wire-compatible *active-active distributed SQL*、跟 self-managed PG / Aurora PG 不同 paradigm（OCC &amp;#43; snapshot isolation &amp;#43; multi-region strong consistency）。Migration 結構是 *protocol drop-in &amp;#43; paradigm shift*：app SQL 不太改、但 transaction retry / extension 缺位 / 多 region 一致性需重設計。本文走 DSQL vs Aurora PG vs self-managed PG 三軸對比、為什麼遷的三條 driver（global write / operational zero-touch / region resiliency）、Type E phased plan、5 production 踩雷（transaction retry 沒處理 / extension 缺位 / sequence throughput 限制 / Aurora PG 直升 DSQL 不可行 / region failover semantic）、跟 PG → Aurora 跟 PG → CockroachDB 對比">migrate-to-aurora-dsql&lt;/a>；「DSQL vs Spanner vs CockroachDB 三方 distributed SQL 選型」見 &lt;a href="https://tarrragon.github.io/blog/backend/01-database/vendors/cockroachdb/aurora-dsql-spanner-decision-tree/" data-link-title="CockroachDB vs Aurora DSQL vs Spanner：撞牆訊號分型 &amp;#43; 七問題決策樹" data-link-desc="Distributed SQL 三選一決策樹。先用撞牆訊號分型識別 driver path（DoorDash 單主寫入撞牆 / Netflix Cassandra 缺口 / Hard Rock 合規驅動）、再走七問題（跨雲 / 雲商生態 / 風險預算 / PG 相容 / 管理負擔 / team size / vendor sizing barrier）。PostgreSQL 相容性 audit checklist 4 項、Spanner 100 pu sizing barrier、Hard Rock 「省 10-20 工程師」機會成本警示、Netflix Database Platform Team 規模">aurora-dsql-spanner-decision-tree&lt;/a>。本篇只回答「standard Aurora 夠不夠、要不要跨過去」。&lt;/p>&lt;/blockquote>
&lt;p>多數團隊不需要 Aurora DSQL。Aurora PostgreSQL / MySQL 已經是 managed SQL、storage / compute 分離、跨 AZ 高可用、read replica 擴讀——絕大多數 OLTP workload 在這層就解決了。Aurora DSQL 是 2024-12 re:Invent preview、2025-05 GA 的 &lt;em>不同 paradigm&lt;/em> 產品：PG wire-compatible 但底層是 active-active distributed、OCC + snapshot isolation、multi-region strong consistency。它解的是 standard Aurora &lt;em>解不了&lt;/em> 的特定問題，代價是放棄一部分 PostgreSQL 相容性與交易自由度。要不要跨過去，看 workload 是否真的撞到 standard Aurora 的結構上限。&lt;/p></description><content:encoded><![CDATA[<blockquote>
<p>本文是 Aurora family 內的決策取捨文章。聚焦 <em>standard Aurora（Aurora PostgreSQL / MySQL，single-region managed SQL）</em> 跟 <em>Aurora DSQL（active-active distributed SQL）</em> 之間的升級門檻判斷。兩個既有 SSoT 不在本篇重複：「PG → DSQL 怎麼遷」見 <a href="/blog/backend/01-database/vendors/postgresql/migrate-to-aurora-dsql/" data-link-title="PostgreSQL → Aurora DSQL Migration：PG wire-compatible Distributed SQL 的 Paradigm Shift" data-link-desc="Aurora DSQL（2024-12 re:Invent preview / 2025-05 GA）是 AWS 推的 PG wire-compatible *active-active distributed SQL*、跟 self-managed PG / Aurora PG 不同 paradigm（OCC &#43; snapshot isolation &#43; multi-region strong consistency）。Migration 結構是 *protocol drop-in &#43; paradigm shift*：app SQL 不太改、但 transaction retry / extension 缺位 / 多 region 一致性需重設計。本文走 DSQL vs Aurora PG vs self-managed PG 三軸對比、為什麼遷的三條 driver（global write / operational zero-touch / region resiliency）、Type E phased plan、5 production 踩雷（transaction retry 沒處理 / extension 缺位 / sequence throughput 限制 / Aurora PG 直升 DSQL 不可行 / region failover semantic）、跟 PG → Aurora 跟 PG → CockroachDB 對比">migrate-to-aurora-dsql</a>；「DSQL vs Spanner vs CockroachDB 三方 distributed SQL 選型」見 <a href="/blog/backend/01-database/vendors/cockroachdb/aurora-dsql-spanner-decision-tree/" data-link-title="CockroachDB vs Aurora DSQL vs Spanner：撞牆訊號分型 &#43; 七問題決策樹" data-link-desc="Distributed SQL 三選一決策樹。先用撞牆訊號分型識別 driver path（DoorDash 單主寫入撞牆 / Netflix Cassandra 缺口 / Hard Rock 合規驅動）、再走七問題（跨雲 / 雲商生態 / 風險預算 / PG 相容 / 管理負擔 / team size / vendor sizing barrier）。PostgreSQL 相容性 audit checklist 4 項、Spanner 100 pu sizing barrier、Hard Rock 「省 10-20 工程師」機會成本警示、Netflix Database Platform Team 規模">aurora-dsql-spanner-decision-tree</a>。本篇只回答「standard Aurora 夠不夠、要不要跨過去」。</p></blockquote>
<p>多數團隊不需要 Aurora DSQL。Aurora PostgreSQL / MySQL 已經是 managed SQL、storage / compute 分離、跨 AZ 高可用、read replica 擴讀——絕大多數 OLTP workload 在這層就解決了。Aurora DSQL 是 2024-12 re:Invent preview、2025-05 GA 的 <em>不同 paradigm</em> 產品：PG wire-compatible 但底層是 active-active distributed、OCC + snapshot isolation、multi-region strong consistency。它解的是 standard Aurora <em>解不了</em> 的特定問題，代價是放棄一部分 PostgreSQL 相容性與交易自由度。要不要跨過去，看 workload 是否真的撞到 standard Aurora 的結構上限。</p>
<blockquote>
<p><strong>時間錨點</strong>：Aurora DSQL 2024-12 preview、2025-05 GA。vendor 能力持續演進、實際決策前以 AWS docs 當前狀態為準。</p></blockquote>
<h2 id="核心差異single-writer-vs-active-active">核心差異：single-writer vs active-active</h2>
<p>兩者的根本差異在寫入架構：</p>
<table>
  <thead>
      <tr>
          <th>維度</th>
          <th>Aurora PG / MySQL（standard）</th>
          <th>Aurora DSQL</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>寫入架構</td>
          <td>single writer（一個 region 一個 writer）</td>
          <td>active-active（多 region 同時可寫）</td>
      </tr>
      <tr>
          <td>一致性</td>
          <td>單 region 強一致、跨 region 非同步</td>
          <td>multi-region strong consistency</td>
      </tr>
      <tr>
          <td>SQL 相容</td>
          <td>完整 PostgreSQL / MySQL</td>
          <td>PG wire-compatible <em>子集</em>、無多數 extension</td>
      </tr>
      <tr>
          <td>交易模型</td>
          <td>標準 PG/MySQL transaction、長交易</td>
          <td>OCC + snapshot isolation、需處理 retry</td>
      </tr>
      <tr>
          <td>寫入擴展</td>
          <td>受 single writer instance 上限約束</td>
          <td>水平擴展、無 single writer 瓶頸</td>
      </tr>
      <tr>
          <td>運維</td>
          <td>managed、但仍要管 instance / failover</td>
          <td>serverless、zero-touch、無 instance 概念</td>
      </tr>
  </tbody>
</table>
<p>standard Aurora 的 storage 層雖然分散，<em>compute 寫入仍是 single writer</em>——這是它的結構上限。DSQL 把寫入也分散，代價是 SQL 相容性縮窄（PG 子集、extension 缺位）與交易語意改變（OCC，衝突要 application retry）。</p>
<h2 id="該跨到-dsql-的訊號">該跨到 DSQL 的訊號</h2>
<p>只有撞到 standard Aurora 結構上限的特定需求，才值得跨 paradigm：</p>
<ul>
<li><strong>global write（多 region 都要低延遲寫入）</strong>：standard Aurora 跨 region 只有非同步副本、寫入要回到單一 writer region；真正需要多 region active-active 寫入 → DSQL</li>
<li><strong>single-writer 寫入上限撞牆</strong>：寫入量大到單一 writer instance（即使最大 instance class）撐不住、且無法用 sharding 簡單解 → DSQL 的水平寫入擴展</li>
<li><strong>region resiliency（單 region 失效仍要可寫）</strong>：standard Aurora 的跨 region failover 有 RPO/RTO 與寫入中斷；要求單 region 失效時其他 region 仍持續接受寫入 → DSQL active-active</li>
<li><strong>operational zero-touch</strong>：不想管 instance / failover / 容量 → DSQL serverless 模型（但這單項不足以跨 paradigm、要搭配上面的結構需求）</li>
</ul>
<h2 id="不該跨的訊號standard-aurora-夠用">不該跨的訊號（standard Aurora 夠用）</h2>
<p>以下情況跨 DSQL 是過度工程、且會付出相容性代價：</p>
<ul>
<li><strong>single-region 夠用</strong>：寫入集中在一個 region、跨 region 只需要讀副本或 DR → standard Aurora</li>
<li><strong>需要 PostgreSQL extension</strong>：依賴 PostGIS / pgvector / 特定 extension → DSQL 子集不支援、留 standard Aurora</li>
<li><strong>複雜 / 長交易</strong>：依賴長交易、複雜多語句交易、特定 isolation 行為 → standard Aurora 的完整交易模型</li>
<li><strong>寫入量 standard Aurora 撐得住</strong>：single writer 還有餘量 → 不必為「未來可能」預先跨 paradigm</li>
</ul>
<p><code>9.C14 Standard Chartered</code> 與 <code>9.C4 DraftKings</code> 是反向佐證：金融帳本 / 博彩這類高一致性、高關鍵 OLTP workload，在 <em>standard Aurora</em> 上就能同時拿到韌性與性能（DraftKings replication lag 降到 10-30ms 級、Standard Chartered 把韌性與性能當單一目標）。它們沒有跨到 distributed SQL——因為 single-region 強一致 + 跨 AZ 高可用已滿足需求。多數金融 OLTP 不需要 active-active multi-region write。</p>
<blockquote>
<p><strong>Scope warning</strong>：Standard Chartered / DraftKings 的 case 揭露其用 standard Aurora 達成韌性 + 性能（見 <a href="/blog/backend/01-database/vendors/aurora/storage-architecture/" data-link-title="Aurora Storage Architecture：quorum-based 分散式 log 與韌性即性能設計" data-link-desc="Aurora storage / compute 分離、6-way 跨 AZ replication、4-of-6 write / 3-of-6 read quorum、韌性投資自動 amortize 成 read 性能、DraftKings 6ms 寫 / &lt;1ms 讀 production reference">storage-architecture</a>）；「它們不需要 DSQL」是本文基於其 single-region 強一致需求的推論、非 case 明文比較 DSQL。引用為「standard Aurora 已足夠多數高一致 OLTP」的訊號、不當 DSQL 對比的 case fact。</p></blockquote>
<h2 id="升級門檻決策流程">升級門檻決策流程</h2>
<p>從需求判讀到路徑選擇的流程：</p>
<h4 id="step-1確認是不是-global-write-需求">Step 1：確認是不是 global write 需求</h4>
<p>寫入是否真的需要多 region 同時低延遲？還是只需要多 region 讀 + 單 region 寫？後者 standard Aurora（+ Global Database 讀副本）就解。</p>
<h4 id="step-2確認-single-writer-是否真的撞牆">Step 2：確認 single-writer 是否真的撞牆</h4>
<p>當前寫入量 vs 最大 instance class 上限、是否已嘗試過 read/write 分離、是否能用 application 層 sharding。撞牆才考慮 DSQL；沒撞牆是過早優化。</p>
<h4 id="step-3檢查相容性代價">Step 3：檢查相容性代價</h4>
<p>清點對 PG extension、長交易、特定 SQL 功能的依賴。依賴重 → DSQL 相容性子集會擋路、留 standard Aurora。</p>
<h4 id="step-4若決定跨走既有-ssot">Step 4：若決定跨，走既有 SSoT</h4>
<ul>
<li>「PG → DSQL 怎麼遷」（protocol drop-in + paradigm shift、transaction retry 處理、extension 缺位）→ <a href="/blog/backend/01-database/vendors/postgresql/migrate-to-aurora-dsql/" data-link-title="PostgreSQL → Aurora DSQL Migration：PG wire-compatible Distributed SQL 的 Paradigm Shift" data-link-desc="Aurora DSQL（2024-12 re:Invent preview / 2025-05 GA）是 AWS 推的 PG wire-compatible *active-active distributed SQL*、跟 self-managed PG / Aurora PG 不同 paradigm（OCC &#43; snapshot isolation &#43; multi-region strong consistency）。Migration 結構是 *protocol drop-in &#43; paradigm shift*：app SQL 不太改、但 transaction retry / extension 缺位 / 多 region 一致性需重設計。本文走 DSQL vs Aurora PG vs self-managed PG 三軸對比、為什麼遷的三條 driver（global write / operational zero-touch / region resiliency）、Type E phased plan、5 production 踩雷（transaction retry 沒處理 / extension 缺位 / sequence throughput 限制 / Aurora PG 直升 DSQL 不可行 / region failover semantic）、跟 PG → Aurora 跟 PG → CockroachDB 對比">migrate-to-aurora-dsql</a></li>
<li>「DSQL vs Spanner vs CockroachDB 哪個 distributed SQL」→ <a href="/blog/backend/01-database/vendors/cockroachdb/aurora-dsql-spanner-decision-tree/" data-link-title="CockroachDB vs Aurora DSQL vs Spanner：撞牆訊號分型 &#43; 七問題決策樹" data-link-desc="Distributed SQL 三選一決策樹。先用撞牆訊號分型識別 driver path（DoorDash 單主寫入撞牆 / Netflix Cassandra 缺口 / Hard Rock 合規驅動）、再走七問題（跨雲 / 雲商生態 / 風險預算 / PG 相容 / 管理負擔 / team size / vendor sizing barrier）。PostgreSQL 相容性 audit checklist 4 項、Spanner 100 pu sizing barrier、Hard Rock 「省 10-20 工程師」機會成本警示、Netflix Database Platform Team 規模">aurora-dsql-spanner-decision-tree</a></li>
</ul>
<p><strong>Rollback boundary</strong>：跨 paradigm 是高成本決策——DSQL 子集相容性與 OCC 交易模型改變了 application 契約，回退到 standard Aurora 不是改 connection string 就好。決策前用一個非關鍵 workload 試點、確認相容性與 retry 行為，再擴大。</p>
<h2 id="邊界與整合">邊界與整合</h2>
<h3 id="為什麼這是升級門檻而非遷移">為什麼這是「升級門檻」而非「遷移」</h3>
<p>standard Aurora → DSQL 不是版本升級、是 paradigm 切換。Aurora PG/MySQL 用得好好的，不代表「升級到 DSQL 會更好」——多數情況會更差（失去 extension、交易要改、相容性縮窄）。只有 workload 真的需要 active-active multi-region write 或撞到 single-writer 上限，跨過去才划算。這跟「PostgreSQL major version upgrade」（同 paradigm、向後相容）是完全不同性質的決策。</p>
<h3 id="sibling-與-cross-link">Sibling 與 cross-link</h3>
<ul>
<li><a href="/blog/backend/01-database/vendors/aurora/storage-architecture/" data-link-title="Aurora Storage Architecture：quorum-based 分散式 log 與韌性即性能設計" data-link-desc="Aurora storage / compute 分離、6-way 跨 AZ replication、4-of-6 write / 3-of-6 read quorum、韌性投資自動 amortize 成 read 性能、DraftKings 6ms 寫 / &lt;1ms 讀 production reference">storage-architecture</a> — standard Aurora 的 storage 分散但 compute single-writer 的結構上限根源</li>
<li><a href="/blog/backend/01-database/vendors/aurora/global-database-multi-region/" data-link-title="Aurora Global Database：跨 region async replication、&lt; 1 秒 lag 與合規 anti-recommendation" data-link-desc="Aurora Global Database 跨 region storage-level async replication、&lt; 1 秒 typical lag、planned vs unplanned failover RTO 數量級對比、Standard Chartered 合規禁止跨境複製為什麼讓 Global Database 變反指標">global-database-multi-region</a> — standard Aurora 的多 region 方案（非同步副本）、global write 需求前先確認這層夠不夠</li>
<li><a href="/blog/backend/01-database/vendors/postgresql/migrate-to-aurora-dsql/" data-link-title="PostgreSQL → Aurora DSQL Migration：PG wire-compatible Distributed SQL 的 Paradigm Shift" data-link-desc="Aurora DSQL（2024-12 re:Invent preview / 2025-05 GA）是 AWS 推的 PG wire-compatible *active-active distributed SQL*、跟 self-managed PG / Aurora PG 不同 paradigm（OCC &#43; snapshot isolation &#43; multi-region strong consistency）。Migration 結構是 *protocol drop-in &#43; paradigm shift*：app SQL 不太改、但 transaction retry / extension 缺位 / 多 region 一致性需重設計。本文走 DSQL vs Aurora PG vs self-managed PG 三軸對比、為什麼遷的三條 driver（global write / operational zero-touch / region resiliency）、Type E phased plan、5 production 踩雷（transaction retry 沒處理 / extension 缺位 / sequence throughput 限制 / Aurora PG 直升 DSQL 不可行 / region failover semantic）、跟 PG → Aurora 跟 PG → CockroachDB 對比">migrate-to-aurora-dsql</a> — 決定跨之後的遷移 playbook（SSoT）</li>
<li><a href="/blog/backend/01-database/vendors/cockroachdb/aurora-dsql-spanner-decision-tree/" data-link-title="CockroachDB vs Aurora DSQL vs Spanner：撞牆訊號分型 &#43; 七問題決策樹" data-link-desc="Distributed SQL 三選一決策樹。先用撞牆訊號分型識別 driver path（DoorDash 單主寫入撞牆 / Netflix Cassandra 缺口 / Hard Rock 合規驅動）、再走七問題（跨雲 / 雲商生態 / 風險預算 / PG 相容 / 管理負擔 / team size / vendor sizing barrier）。PostgreSQL 相容性 audit checklist 4 項、Spanner 100 pu sizing barrier、Hard Rock 「省 10-20 工程師」機會成本警示、Netflix Database Platform Team 規模">aurora-dsql-spanner-decision-tree</a> — 三方 distributed SQL 選型（SSoT）</li>
<li>替代路由：single-region 夠 → 留 standard Aurora；KV access pattern → <a href="/blog/backend/01-database/vendors/dynamodb/" data-link-title="DynamoDB" data-link-desc="AWS managed key-value、partition-based scaling、9000 萬 RPS sustained 實戰證據">DynamoDB</a></li>
<li>跟 <a href="/blog/backend/09-performance-capacity/cases/standard-chartered-aurora-banking/" data-link-title="9.C14 Standard Chartered：受監管銀行的 Aurora 4000 TPS 容量提升" data-link-desc="Standard Chartered 銀行遷移到 Aurora 後吞吐量提升 10 倍至 4000 TPS、跨 7 個受監管市場">Standard Chartered 9.C14</a> / <a href="/blog/backend/09-performance-capacity/cases/draftkings-aurora-financial-ledger/" data-link-title="9.C4 DraftKings：Aurora 撐 100 萬 ops/min 的體育博彩金融帳本" data-link-desc="DraftKings 用 Aurora MySQL 跑體育博彩金融帳本、Super Bowl 流量 &#43;50% 不影響延遲">DraftKings 9.C4</a> 互引：高一致 OLTP 在 standard Aurora 已足夠的訊號</li>
</ul>
]]></content:encoded></item><item><title>PostgreSQL → Aurora DSQL Migration：PG wire-compatible Distributed SQL 的 Paradigm Shift</title><link>https://tarrragon.github.io/blog/backend/01-database/vendors/postgresql/migrate-to-aurora-dsql/</link><pubDate>Tue, 19 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/01-database/vendors/postgresql/migrate-to-aurora-dsql/</guid><description>&lt;blockquote>
&lt;p>本文是跨 vendor &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/migration/" data-link-title="Migration" data-link-desc="說明系統如何把資料、流量或結構從舊狀態移到新狀態">migration&lt;/a> playbook、cross-link 到 &lt;a href="https://tarrragon.github.io/blog/backend/01-database/vendors/postgresql/" data-link-title="PostgreSQL" data-link-desc="多用途 OLTP 主流關聯式資料庫、MVCC、豐富 SQL 特性、是 Aurora / Cosmos DB / Spanner / CockroachDB / Aurora DSQL 的相容目標">PostgreSQL&lt;/a>（source）跟 &lt;a href="https://tarrragon.github.io/blog/backend/01-database/vendors/aurora/" data-link-title="AWS Aurora" data-link-desc="AWS managed PostgreSQL / MySQL、storage / compute 分離、&amp;#43;75% 效能改善的 production 證據">Aurora&lt;/a>（DSQL 也屬 Aurora family、但 paradigm 不同）。跟 &lt;a href="https://tarrragon.github.io/blog/backend/01-database/vendors/postgresql/migrate-to-aurora/" data-link-title="PostgreSQL → Aurora Migration：protocol 相容、operational 重設計" data-link-desc="Aurora 號稱 PostgreSQL-compatible 但 operational model 不同（storage decouple / cluster endpoint / instance class / 自家備份）；遷移流程是混合（protocol drop-in &amp;#43; operational phased）、5 個 production 踩雷（extension 不支援 / replication slot 不直通 / autovacuum 行為差 / IAM 認證強制 / cost model 換算）、跟 Patroni / read replica / DR 對位">migrate-to-aurora&lt;/a>（PG → Aurora PG、protocol drop-in + operational redesign）跟 &lt;a href="https://tarrragon.github.io/blog/backend/01-database/vendors/postgresql/migrate-to-cockroachdb/" data-link-title="PostgreSQL → CockroachDB：三維皆 High 的多重歸類 migration" data-link-desc="PostgreSQL → CockroachDB 是 Schema / Operational / Paradigm 三維皆 High 的 multi-axis migration、實證 [#127](/report/content-structure-by-max-diff-dimension/) 的「多重歸類跟 tie-breaking」規則；主結構走 Type E paradigm shift、Schema 差 &amp;#43; Operational redesign 抽出獨立段；涵蓋 transaction model 重設計、SQL dialect gap、5 個 production 踩雷">migrate-to-cockroachdb&lt;/a>（PG → CRDB、Type E paradigm shift）對照、本篇是 &lt;em>Aurora 內 PG → DSQL 的 paradigm shift&lt;/em>。每階段切換用 &lt;a href="https://tarrragon.github.io/blog/backend/knowledge-cards/migration-gate/" data-link-title="Migration Gate" data-link-desc="說明遷移流程何時可以進入下一階段或正式切換">migration gate&lt;/a> 把關。&lt;/p>&lt;/blockquote>
&lt;blockquote>
&lt;p>&lt;strong>時間錨點&lt;/strong>：Aurora DSQL 在 &lt;strong>2024-12 re:Invent preview&lt;/strong>、&lt;strong>2025-05-27 GA&lt;/strong>。本文 vendor claim 以 2025-2026 公開狀態為準、實際 migration 前請以 AWS docs 為準（feature 持續演進中）。&lt;/p>&lt;/blockquote>
&lt;h2 id="為什麼遷global-write--operational-zero-touch--region-resiliency-三條-driver">為什麼遷：Global Write / Operational Zero-touch / Region Resiliency 三條 driver&lt;/h2>
&lt;p>PG → DSQL 不是「自然演進」、是 &lt;em>application 需求超出 single-primary 模型&lt;/em> 時的 paradigm 換軌。三條典型 driver 各自對應一種 application 約束、不是「三選一」、而是「至少其中一條剛性、其他兩條是 bonus」：&lt;/p></description><content:encoded><![CDATA[<blockquote>
<p>本文是跨 vendor <a href="/blog/backend/knowledge-cards/migration/" data-link-title="Migration" data-link-desc="說明系統如何把資料、流量或結構從舊狀態移到新狀態">migration</a> playbook、cross-link 到 <a href="/blog/backend/01-database/vendors/postgresql/" data-link-title="PostgreSQL" data-link-desc="多用途 OLTP 主流關聯式資料庫、MVCC、豐富 SQL 特性、是 Aurora / Cosmos DB / Spanner / CockroachDB / Aurora DSQL 的相容目標">PostgreSQL</a>（source）跟 <a href="/blog/backend/01-database/vendors/aurora/" data-link-title="AWS Aurora" data-link-desc="AWS managed PostgreSQL / MySQL、storage / compute 分離、&#43;75% 效能改善的 production 證據">Aurora</a>（DSQL 也屬 Aurora family、但 paradigm 不同）。跟 <a href="/blog/backend/01-database/vendors/postgresql/migrate-to-aurora/" data-link-title="PostgreSQL → Aurora Migration：protocol 相容、operational 重設計" data-link-desc="Aurora 號稱 PostgreSQL-compatible 但 operational model 不同（storage decouple / cluster endpoint / instance class / 自家備份）；遷移流程是混合（protocol drop-in &#43; operational phased）、5 個 production 踩雷（extension 不支援 / replication slot 不直通 / autovacuum 行為差 / IAM 認證強制 / cost model 換算）、跟 Patroni / read replica / DR 對位">migrate-to-aurora</a>（PG → Aurora PG、protocol drop-in + operational redesign）跟 <a href="/blog/backend/01-database/vendors/postgresql/migrate-to-cockroachdb/" data-link-title="PostgreSQL → CockroachDB：三維皆 High 的多重歸類 migration" data-link-desc="PostgreSQL → CockroachDB 是 Schema / Operational / Paradigm 三維皆 High 的 multi-axis migration、實證 [#127](/report/content-structure-by-max-diff-dimension/) 的「多重歸類跟 tie-breaking」規則；主結構走 Type E paradigm shift、Schema 差 &#43; Operational redesign 抽出獨立段；涵蓋 transaction model 重設計、SQL dialect gap、5 個 production 踩雷">migrate-to-cockroachdb</a>（PG → CRDB、Type E paradigm shift）對照、本篇是 <em>Aurora 內 PG → DSQL 的 paradigm shift</em>。每階段切換用 <a href="/blog/backend/knowledge-cards/migration-gate/" data-link-title="Migration Gate" data-link-desc="說明遷移流程何時可以進入下一階段或正式切換">migration gate</a> 把關。</p></blockquote>
<blockquote>
<p><strong>時間錨點</strong>：Aurora DSQL 在 <strong>2024-12 re:Invent preview</strong>、<strong>2025-05-27 GA</strong>。本文 vendor claim 以 2025-2026 公開狀態為準、實際 migration 前請以 AWS docs 為準（feature 持續演進中）。</p></blockquote>
<h2 id="為什麼遷global-write--operational-zero-touch--region-resiliency-三條-driver">為什麼遷：Global Write / Operational Zero-touch / Region Resiliency 三條 driver</h2>
<p>PG → DSQL 不是「自然演進」、是 <em>application 需求超出 single-primary 模型</em> 時的 paradigm 換軌。三條典型 driver 各自對應一種 application 約束、不是「三選一」、而是「至少其中一條剛性、其他兩條是 bonus」：</p>
<table>
  <thead>
      <tr>
          <th>Driver</th>
          <th>觸發場景</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>Global write</strong></td>
          <td>Application 需要多 region active-active write（不是 Aurora PG 的 single-writer + read replica）</td>
      </tr>
      <tr>
          <td><strong>Operational zero-touch</strong></td>
          <td>不想管 Patroni / PgBouncer / autovacuum / failover / backup retention、Aurora PG 已減一半、DSQL 進一步零接觸</td>
      </tr>
      <tr>
          <td><strong>Region resiliency</strong></td>
          <td>整 region 失效時應用無感切換（Aurora PG 是 cross-region replica 異步、DSQL 是 strong consistency 多 region）</td>
      </tr>
  </tbody>
</table>
<p>反向 driver（DSQL → Aurora PG）也存在：</p>
<ul>
<li>需要 PG extension（pgvector / TimescaleDB / PostGIS / pg_repack）— DSQL 不支援</li>
<li>Cost：DSQL 比 Aurora PG 貴 2-5x（依 region 數量）</li>
<li>Single-region OLTP 不需 distributed transaction 的 overhead</li>
</ul>
<h2 id="結構protocol-drop-in--paradigm-shift">結構：Protocol Drop-in + Paradigm Shift</h2>
<p>DSQL 是 PG wire-compatible（用 <code>psql</code> 連得上）、但內部是 <em>distributed SQL engine</em>：</p>
<table>
  <thead>
      <tr>
          <th>維度</th>
          <th>self-managed PG</th>
          <th>Aurora PG</th>
          <th>Aurora DSQL</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Wire protocol</td>
          <td>PG</td>
          <td>PG</td>
          <td>PG（subset）</td>
      </tr>
      <tr>
          <td>Architecture</td>
          <td>Single primary</td>
          <td>Single primary + shared storage</td>
          <td><strong>Active-active distributed</strong></td>
      </tr>
      <tr>
          <td>Multi-region write</td>
          <td>不支援（async replica）</td>
          <td>不支援（async replica）</td>
          <td><strong>Strong consistency 多 region</strong></td>
      </tr>
      <tr>
          <td>Transaction model</td>
          <td>MVCC + snapshot isolation</td>
          <td>MVCC + snapshot isolation</td>
          <td><strong>OCC + strong snapshot isolation</strong></td>
      </tr>
      <tr>
          <td>Extension</td>
          <td>任意</td>
          <td>AWS whitelist</td>
          <td><strong>無 extension 支援</strong></td>
      </tr>
      <tr>
          <td>Operational</td>
          <td>全部自管</td>
          <td>AWS 管 storage / failover</td>
          <td>AWS 管全部、零接觸</td>
      </tr>
      <tr>
          <td>Failover</td>
          <td>Patroni 15-60s</td>
          <td>Aurora 30s</td>
          <td>N/A（永遠 active-active、無 failover 概念）</td>
      </tr>
      <tr>
          <td>Cost model</td>
          <td>Self-managed instance</td>
          <td>Instance hour + storage</td>
          <td>Per-DPU + multi-AZ replication</td>
      </tr>
  </tbody>
</table>
<p><strong>Paradigm shift 的核心</strong>：</p>
<ol>
<li><strong>Transaction semantic</strong>：DSQL 用 OCC（Optimistic Concurrency Control）+ strong snapshot isolation、跟 PG 預設 read committed / repeatable read snapshot 不同 — 同 row 有 concurrent write 時、commit 階段才偵測衝突 + abort、application 要 handle <code>40001</code> serialization_failure</li>
<li><strong>No extension</strong>：PostGIS / pgvector / TimescaleDB / pg_partman 都不能用、依賴這些 feature 的 application 要拆出去</li>
<li><strong>No connection pool stateful</strong>：DSQL 內建 connection pool、application 不能依賴 session state（temp table / prepared statement / advisory lock）</li>
</ol>
<h2 id="schema-gappg-對-dsql-限制">Schema gap：PG 對 DSQL 限制</h2>
<p>DSQL 是 PG-compatible <em>subset</em>、有幾類功能不支援：</p>
<table>
  <thead>
      <tr>
          <th>類別</th>
          <th>PG 支援</th>
          <th>DSQL 支援</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Extension</td>
          <td>是</td>
          <td>否（沒 <code>CREATE EXTENSION</code>）</td>
      </tr>
      <tr>
          <td>Foreign key constraint</td>
          <td>是</td>
          <td>否（application 維護 referential integrity）</td>
      </tr>
      <tr>
          <td>View / Materialized view</td>
          <td>是</td>
          <td>View 部分 / Materialized view 否</td>
      </tr>
      <tr>
          <td>JSON / JSONB</td>
          <td>是</td>
          <td>部分（無 GIN index 加速）</td>
      </tr>
      <tr>
          <td>Foreign data wrapper</td>
          <td>是</td>
          <td>否</td>
      </tr>
      <tr>
          <td>Stored procedure（PL/pgSQL）</td>
          <td>是</td>
          <td>部分（限制多）</td>
      </tr>
      <tr>
          <td>Trigger</td>
          <td>是</td>
          <td>部分</td>
      </tr>
      <tr>
          <td>LISTEN / NOTIFY</td>
          <td>是</td>
          <td>否</td>
      </tr>
      <tr>
          <td><code>SELECT ... FOR UPDATE</code></td>
          <td>是</td>
          <td>部分（DSQL OCC semantic）</td>
      </tr>
      <tr>
          <td>Sequence（serial / identity）</td>
          <td>是</td>
          <td>支援、但高吞吐有 coordination overhead</td>
      </tr>
      <tr>
          <td>Table partition</td>
          <td>是</td>
          <td>部分</td>
      </tr>
      <tr>
          <td>Logical replication slot</td>
          <td>是</td>
          <td>否</td>
      </tr>
  </tbody>
</table>
<p><strong>Migration 必做 schema audit</strong>：</p>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="c1">-- 找所有 extension 依賴
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="c1"></span><span class="k">SELECT</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">pg_extension</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="w"></span><span class="c1">-- 找 materialized view
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="c1"></span><span class="k">SELECT</span><span class="w"> </span><span class="n">schemaname</span><span class="p">,</span><span class="w"> </span><span class="n">matviewname</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">pg_matviews</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="w"></span><span class="c1">-- 找 sequence
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="c1"></span><span class="k">SELECT</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">pg_sequences</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="w"></span><span class="c1">-- 找 FDW
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="c1"></span><span class="k">SELECT</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">pg_foreign_server</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="w"></span><span class="c1">-- 找 trigger
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="c1"></span><span class="k">SELECT</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">pg_trigger</span><span class="w"> </span><span class="k">WHERE</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="n">tgisinternal</span><span class="p">;</span></span></span></code></pre></div><p>任何項目命中、都是 migration blocker。</p>
<h2 id="operational-redesign">Operational Redesign</h2>
<p>跟 self-managed PG 或 Aurora PG 比、DSQL operational model 大幅簡化但語意不同：</p>
<table>
  <thead>
      <tr>
          <th>Operational concept</th>
          <th>self-managed PG</th>
          <th>Aurora PG</th>
          <th>Aurora DSQL</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Storage</td>
          <td>Local / EBS</td>
          <td>Shared 6 副本</td>
          <td>Distributed log + replicated state</td>
      </tr>
      <tr>
          <td>HA</td>
          <td>Patroni</td>
          <td>Aurora failover</td>
          <td>永遠 HA（無 failover 概念）</td>
      </tr>
      <tr>
          <td>Backup</td>
          <td>pgBackRest / WAL-G</td>
          <td>內建 continuous</td>
          <td>內建 continuous（更深整合）</td>
      </tr>
      <tr>
          <td>Connection pool</td>
          <td>PgBouncer / PgCat</td>
          <td>RDS Proxy 推薦</td>
          <td>內建（無需配置）</td>
      </tr>
      <tr>
          <td>Major version upgrade</td>
          <td>手動 + 停機</td>
          <td>Aurora blue/green</td>
          <td>完全 transparent（AWS 升）</td>
      </tr>
      <tr>
          <td>Read replica</td>
          <td>Streaming replication</td>
          <td>Reader endpoint</td>
          <td>無分（每 region 都讀寫）</td>
      </tr>
      <tr>
          <td>Monitoring</td>
          <td>Prometheus / pg_stat_*</td>
          <td>CloudWatch + Performance Insights</td>
          <td>CloudWatch（簡化）</td>
      </tr>
      <tr>
          <td>預期 SRE FTE</td>
          <td>0.5-2</td>
          <td>0.2-0.5</td>
          <td>&lt; 0.1</td>
      </tr>
  </tbody>
</table>
<h2 id="migration-流程type-e-phased-plan">Migration 流程：Type E Phased Plan</h2>
<p>Type E paradigm shift 的 phased plan、跟 <a href="/blog/backend/01-database/vendors/postgresql/migrate-to-cockroachdb/" data-link-title="PostgreSQL → CockroachDB：三維皆 High 的多重歸類 migration" data-link-desc="PostgreSQL → CockroachDB 是 Schema / Operational / Paradigm 三維皆 High 的 multi-axis migration、實證 [#127](/report/content-structure-by-max-diff-dimension/) 的「多重歸類跟 tie-breaking」規則；主結構走 Type E paradigm shift、Schema 差 &#43; Operational redesign 抽出獨立段；涵蓋 transaction model 重設計、SQL dialect gap、5 個 production 踩雷">migrate-to-cockroachdb</a> 結構類似：</p>
<h3 id="phase-1schema--application-audit">Phase 1：Schema / Application Audit</h3>
<ul>
<li>跑 schema audit（extension / MV / FDW / sequence / trigger）</li>
<li>識別 application 哪些 query / transaction pattern 需重設計</li>
<li>估算 <em>能直接遷的 % vs 需重寫的 %</em>、典型 60-80% / 20-40%</li>
</ul>
<h3 id="phase-2application-改造不上-dsql先在-pg-跑">Phase 2：Application 改造（不上 DSQL、先在 PG 跑）</h3>
<ul>
<li>加 transaction retry middleware（攔截 <code>40001</code>、exponential backoff）</li>
<li>用 UUID 替代 serial / bigserial</li>
<li>移除依賴 LISTEN/NOTIFY 的功能（改 SQS / EventBridge）</li>
<li>移除 materialized view（改 application-side cache 或 incremental ETL）</li>
<li>Stored procedure 改 application code</li>
<li>在 PG 上跑 staging、確認新 application code 還對</li>
</ul>
<h3 id="phase-3dsql-cluster-建立--schema-遷">Phase 3：DSQL Cluster 建立 + Schema 遷</h3>
<ul>
<li>DSQL cluster create</li>
<li>DDL apply（subset of PG schema、無 extension）</li>
<li>DMS（Database Migration Service）initial load + ongoing replication</li>
<li>兩邊跑 shadow traffic、比對 query 結果</li>
</ul>
<h3 id="phase-4cutover">Phase 4：Cutover</h3>
<ul>
<li>Application 切 connection string 到 DSQL</li>
<li>保留 PG read-only 一週、出狀況 rollback</li>
<li>Monitor <code>40001</code> retry rate、scaling event 行為</li>
</ul>
<h3 id="phase-5多-region-拓展如適用">Phase 5：多 region 拓展（如適用）</h3>
<ul>
<li>加第二 region endpoint</li>
<li>Application 改 multi-region routing（latency-based）</li>
<li>Test region failure / network partition 行為</li>
</ul>
<h2 id="5-個-production-踩雷">5 個 Production 踩雷</h2>
<h3 id="case-1transaction-retry-沒處理">Case 1：Transaction Retry 沒處理</h3>
<p><strong>情境</strong>：PG 上「兩個 transaction 都 update 同 row」走 lock + wait；DSQL 同情境一個會收 <code>40001 serialization_failure</code>、application 沒 catch、user 看到 500 error。</p>
<p>修法：</p>
<ul>
<li>DAO 層加 retry middleware：catch <code>40001</code> + exponential backoff（jitter）</li>
<li>Retry 上限 3-5 次、超過回 4xx 給 user</li>
<li>Transaction 內不要做 side effect（API call / message send）、retry 會重做</li>
</ul>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="ln">1</span><span class="cl"><span class="k">def</span> <span class="nf">with_retry</span><span class="p">(</span><span class="n">fn</span><span class="p">,</span> <span class="n">max_attempts</span><span class="o">=</span><span class="mi">5</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">    <span class="k">for</span> <span class="n">attempt</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">max_attempts</span><span class="p">):</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl">        <span class="k">try</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">4</span><span class="cl">            <span class="k">return</span> <span class="n">fn</span><span class="p">()</span>
</span></span><span class="line"><span class="ln">5</span><span class="cl">        <span class="k">except</span> <span class="n">SerializationError</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">6</span><span class="cl">            <span class="k">if</span> <span class="n">attempt</span> <span class="o">==</span> <span class="n">max_attempts</span> <span class="o">-</span> <span class="mi">1</span><span class="p">:</span>
</span></span><span class="line"><span class="ln">7</span><span class="cl">                <span class="k">raise</span>
</span></span><span class="line"><span class="ln">8</span><span class="cl">            <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">((</span><span class="mi">2</span> <span class="o">**</span> <span class="n">attempt</span><span class="p">)</span> <span class="o">*</span> <span class="mf">0.05</span> <span class="o">+</span> <span class="n">random</span><span class="o">.</span><span class="n">random</span><span class="p">()</span> <span class="o">*</span> <span class="mf">0.05</span><span class="p">)</span></span></span></code></pre></div><h3 id="case-2extension-缺位feature-整段掉">Case 2：Extension 缺位、Feature 整段掉</h3>
<p><strong>情境</strong>：production PG 用 pgvector 做 RAG search、PostGIS 做 store locator、TimescaleDB 做 metrics — 切 DSQL 後三 feature 全沒。</p>
<p>修法：</p>
<ul>
<li>不要直接遷、評估 <em>which extension is load-bearing</em></li>
<li>pgvector → 外掛 Pinecone / Weaviate 或保留 PG 跑 vector workload</li>
<li>PostGIS → 保留 PG 跑 GIS workload</li>
<li>TimescaleDB → 切 Amazon Timestream 或保留 PG</li>
<li>DSQL 只放 <em>不依賴 extension</em> 的 transactional core</li>
</ul>
<p>實務常見拓撲：DSQL 跑 transactional core、附 PG（vector） + PG（GIS） + Timestream（metrics）。</p>
<h3 id="case-3sequence-高吞吐撞-coordination-overhead">Case 3：Sequence 高吞吐撞 Coordination Overhead</h3>
<p><strong>情境</strong>：<code>SERIAL</code> / <code>GENERATED AS IDENTITY</code> PK 在 DSQL 用、insert 量 1000+/s 時 sequence nextval 變成 bottleneck、insert latency 從 5ms 跳到 80-100ms+。</p>
<p>DSQL 有支援 sequence、但不是「local atomic counter」、是分散式 counter — 每次 nextval 需跨 region coordination 保證唯一性。低吞吐 OK、高吞吐撞牆。</p>
<p>修法：</p>
<ul>
<li>高吞吐表 PK 換 UUID v7（time-sortable、無 coordination）：<code>gen_random_uuid()</code> 或 application-side UUID v7 library</li>
<li>或 application-side ULID（time-sortable、12-byte 緊湊）</li>
<li>完全避免依賴「連續 integer PK」的 application 邏輯（reporting / paging 改用 <code>ORDER BY created_at, id</code>）</li>
</ul>





<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="ln">1</span><span class="cl"><span class="c1">-- 換 UUID PK
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="c1"></span><span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="n">orders</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="w">    </span><span class="n">id</span><span class="w"> </span><span class="n">UUID</span><span class="w"> </span><span class="k">PRIMARY</span><span class="w"> </span><span class="k">KEY</span><span class="w"> </span><span class="k">DEFAULT</span><span class="w"> </span><span class="n">gen_random_uuid</span><span class="p">(),</span><span class="w">
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="w">    </span><span class="p">...</span><span class="w">
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="w"></span><span class="p">);</span></span></span></code></pre></div><p>低吞吐表（settings / config）保留 sequence OK；high-volume transactional 表（orders / events）建議 UUID。</p>
<h3 id="case-4aurora-pg-直升-dsql-想當-in-place">Case 4：Aurora PG 直升 DSQL 想當 in-place</h3>
<p><strong>情境</strong>：team 以為「Aurora PG 跟 Aurora DSQL 都是 Aurora、應該能直升」、申請 cluster modify、發現完全是兩個 service。</p>
<p>修法：</p>
<ul>
<li>不是 in-place upgrade、是 full migration（DMS + cutover）</li>
<li>把 DSQL 當完全新的 cluster type、走 Phase 1-4 完整流程</li>
<li>Aurora PG → Aurora DSQL 不比 PG → CRDB 容易、wire-compatible 只解 application connect 問題、不解 schema / paradigm 差異</li>
</ul>
<h3 id="case-5region-failover-semantic">Case 5：Region Failover Semantic</h3>
<p><strong>情境</strong>：team 以為「DSQL multi-region 等於高可用」、設計時假設「整 region 掛還是能寫」、實測發現「網絡分割時 DSQL 走 quorum、可能 reject write」。</p>
<p>DSQL 是 strong consistency 多 region、CAP 取 CP（不是 AP）—  network partition 時部分 region 會拒絕 write、不是「永遠可寫」。</p>
<p>修法：</p>
<ul>
<li>設計 application 要 handle write reject（partition recovery 後 retry）</li>
<li>不要把 DSQL 當「永遠可寫」的 cache 或 queue 用</li>
<li>真要 AP 行為、用 DynamoDB（global table）</li>
</ul>
<h2 id="capacity-規劃">Capacity 規劃</h2>
<p>DSQL 計費跟 Aurora PG 差很多：</p>
<table>
  <thead>
      <tr>
          <th>計費項目</th>
          <th>Aurora PG</th>
          <th>Aurora DSQL</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Instance</td>
          <td>Per-instance hour</td>
          <td>無（serverless）</td>
      </tr>
      <tr>
          <td>Storage</td>
          <td>Per-GB-month</td>
          <td>Per-GB-month（多副本價）</td>
      </tr>
      <tr>
          <td>IO</td>
          <td>Per-million IO</td>
          <td>每 transaction 計費</td>
      </tr>
      <tr>
          <td>Backup</td>
          <td>Per-GB-month</td>
          <td>內建（無額外）</td>
      </tr>
      <tr>
          <td>Multi-region</td>
          <td>Cross-region replica（額外）</td>
          <td>每 region 全費 × N</td>
      </tr>
  </tbody>
</table>
<p>實務 cost：Aurora PG db.r6g.4xlarge multi-AZ 月 ~$2000 → DSQL 同 workload ~$5000-10000（依 region 數）。</p>
<p>何時 DSQL cost 划算：</p>
<ul>
<li>多 region active-active 需求剛性（不是 nice-to-have）</li>
<li>Operational FTE 節省超過 cost 差</li>
<li>Burst workload（DSQL 自動 scale、Aurora PG 預配置 idle 期浪費）</li>
</ul>
<h2 id="跟既有-migration-playbook-對比">跟既有 Migration Playbook 對比</h2>
<table>
  <thead>
      <tr>
          <th>Migration</th>
          <th>Type</th>
          <th>主結構</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="/blog/backend/01-database/vendors/postgresql/migrate-to-aurora/" data-link-title="PostgreSQL → Aurora Migration：protocol 相容、operational 重設計" data-link-desc="Aurora 號稱 PostgreSQL-compatible 但 operational model 不同（storage decouple / cluster endpoint / instance class / 自家備份）；遷移流程是混合（protocol drop-in &#43; operational phased）、5 個 production 踩雷（extension 不支援 / replication slot 不直通 / autovacuum 行為差 / IAM 認證強制 / cost model 換算）、跟 Patroni / read replica / DR 對位">→ Aurora PG</a></td>
          <td>C</td>
          <td>Protocol drop-in + operational redesign</td>
      </tr>
      <tr>
          <td><a href="/blog/backend/01-database/vendors/postgresql/migrate-to-cockroachdb/" data-link-title="PostgreSQL → CockroachDB：三維皆 High 的多重歸類 migration" data-link-desc="PostgreSQL → CockroachDB 是 Schema / Operational / Paradigm 三維皆 High 的 multi-axis migration、實證 [#127](/report/content-structure-by-max-diff-dimension/) 的「多重歸類跟 tie-breaking」規則；主結構走 Type E paradigm shift、Schema 差 &#43; Operational redesign 抽出獨立段；涵蓋 transaction model 重設計、SQL dialect gap、5 個 production 踩雷">→ CockroachDB</a></td>
          <td>E</td>
          <td>Paradigm shift（distributed SQL）</td>
      </tr>
      <tr>
          <td>→ Aurora DSQL（本篇）</td>
          <td>E</td>
          <td>Paradigm shift（PG-compatible distributed）</td>
      </tr>
  </tbody>
</table>
<p><strong>Aurora DSQL vs CockroachDB 選擇</strong>：</p>
<table>
  <thead>
      <tr>
          <th>維度</th>
          <th>Aurora DSQL</th>
          <th>CockroachDB</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>PG compatibility</td>
          <td>Wire-compatible 較完整</td>
          <td>高、但有差異</td>
      </tr>
      <tr>
          <td>Vendor lock-in</td>
          <td>AWS only</td>
          <td>跨雲 / on-prem</td>
      </tr>
      <tr>
          <td>Cost</td>
          <td>AWS pricing</td>
          <td>自管或 CockroachDB Cloud</td>
      </tr>
      <tr>
          <td>Multi-region 模型</td>
          <td>Strong consistency 內建</td>
          <td>可配置（regional / global table）</td>
      </tr>
      <tr>
          <td>Extension</td>
          <td>完全沒</td>
          <td>部分（CDC / changefeed）</td>
      </tr>
      <tr>
          <td>Operational</td>
          <td>Zero-touch</td>
          <td>自管或 managed</td>
      </tr>
  </tbody>
</table>
<p>選 DSQL：已綁 AWS、不想管基礎設施、需 PG semantic。
選 CRDB：跨雲、有自管 SRE、需要 fine-grained control。</p>
<h2 id="相關連結">相關連結</h2>
<ul>
<li><a href="/blog/backend/01-database/vendors/postgresql/migrate-to-aurora/" data-link-title="PostgreSQL → Aurora Migration：protocol 相容、operational 重設計" data-link-desc="Aurora 號稱 PostgreSQL-compatible 但 operational model 不同（storage decouple / cluster endpoint / instance class / 自家備份）；遷移流程是混合（protocol drop-in &#43; operational phased）、5 個 production 踩雷（extension 不支援 / replication slot 不直通 / autovacuum 行為差 / IAM 認證強制 / cost model 換算）、跟 Patroni / read replica / DR 對位">migrate-to-aurora</a>：Aurora PG 對比（Type C）</li>
<li><a href="/blog/backend/01-database/vendors/postgresql/migrate-to-cockroachdb/" data-link-title="PostgreSQL → CockroachDB：三維皆 High 的多重歸類 migration" data-link-desc="PostgreSQL → CockroachDB 是 Schema / Operational / Paradigm 三維皆 High 的 multi-axis migration、實證 [#127](/report/content-structure-by-max-diff-dimension/) 的「多重歸類跟 tie-breaking」規則；主結構走 Type E paradigm shift、Schema 差 &#43; Operational redesign 抽出獨立段；涵蓋 transaction model 重設計、SQL dialect gap、5 個 production 踩雷">migrate-to-cockroachdb</a>：CRDB 對比（Type E）</li>
<li><a href="/blog/backend/01-database/vendors/postgresql/extension-ecosystem/" data-link-title="PostgreSQL Extension Ecosystem：把 PG 變成 vector DB / time-series / sharded 的 plugin 生態" data-link-desc="PG 的 extension 機制不只是 plugin、是 *結構性產品線擴張* — pgvector 讓 PG 變 vector DB、TimescaleDB 變 time-series、Citus 變 sharded、PostGIS 變 GIS。本文走 PG extension lifecycle、6 個 production-critical extension（pg_stat_statements / pg_partman / pg_repack / pgvector / TimescaleDB / PostGIS）、5 production 踩雷（extension version 跟 PG version 對齊 / managed PG 限制 / upgrade order / shared_preload_libraries 衝突 / extension 跟 logical replication 互動）、cloud vendor 對 extension 的限制">extension-ecosystem</a>：DSQL 不支援的 extension</li>
<li><a href="/blog/backend/01-database/vendors/postgresql/connection-scaling/" data-link-title="PostgreSQL Connection Scaling：process-per-connection model 跟為什麼 pooler 是必裝" data-link-desc="PG 每個 client connection fork 一個 backend process（不是 thread）、RAM 成本 5-15MB/connection、context switch 跟 fork() cost 在 100&#43; connection 後線性放大、所以 pooler 不是 *optional optimization* 而是 *production prerequisite*。本文走 process-per-connection model 跟 MySQL thread-per-connection 對比、max_connections &#43; shared_buffers &#43; work_mem 三 GUC 互動、application-side pool vs middleware pool vs RDS Proxy 三層選擇、5 production 踩雷（connection storm / fork() cost 在 burst 流量 / shared_buffers 跟 connection 數壓縮 / double-pool 配置錯誤 / max_connections 設太大反而慢）、跟 PgBouncer config 互補不重複">connection-scaling</a>：DSQL 內建 pool 跟 PgBouncer 對比</li>
</ul>
<h2 id="下一步">下一步</h2>
<ul>
<li>看 <a href="/blog/backend/01-database/vendors/aurora/" data-link-title="AWS Aurora" data-link-desc="AWS managed PostgreSQL / MySQL、storage / compute 分離、&#43;75% 效能改善的 production 證據">Aurora overview</a> 認識 Aurora family</li>
<li>看 <a href="/blog/backend/01-database/vendors/postgresql/migrate-to-cockroachdb/" data-link-title="PostgreSQL → CockroachDB：三維皆 High 的多重歸類 migration" data-link-desc="PostgreSQL → CockroachDB 是 Schema / Operational / Paradigm 三維皆 High 的 multi-axis migration、實證 [#127](/report/content-structure-by-max-diff-dimension/) 的「多重歸類跟 tie-breaking」規則；主結構走 Type E paradigm shift、Schema 差 &#43; Operational redesign 抽出獨立段；涵蓋 transaction model 重設計、SQL dialect gap、5 個 production 踩雷">migrate-to-cockroachdb</a> 對比另一個 Type E migration</li>
<li>回 <a href="/blog/backend/01-database/vendors/postgresql/" data-link-title="PostgreSQL" data-link-desc="多用途 OLTP 主流關聯式資料庫、MVCC、豐富 SQL 特性、是 Aurora / Cosmos DB / Spanner / CockroachDB / Aurora DSQL 的相容目標">PostgreSQL overview</a> 看全圖</li>
</ul>
]]></content:encoded></item><item><title>CockroachDB vs Aurora DSQL vs Spanner：撞牆訊號分型 + 七問題決策樹</title><link>https://tarrragon.github.io/blog/backend/01-database/vendors/cockroachdb/aurora-dsql-spanner-decision-tree/</link><pubDate>Wed, 27 May 2026 00:00:00 +0000</pubDate><guid>https://tarrragon.github.io/blog/backend/01-database/vendors/cockroachdb/aurora-dsql-spanner-decision-tree/</guid><description>&lt;blockquote>
&lt;p>本文是 DB4 distributed SQL 選型的 &lt;em>entry point&lt;/em> deep article — 讀者進來時還沒決定哪個 vendor、甚至還沒釐清「我是不是該換 distributed SQL」。本文先用 &lt;em>撞牆訊號分型&lt;/em> 幫讀者識別自己屬哪條 driver path、再進三軸 vendor 對比、最後落到 team size + sizing 邊界檢查。配合 &lt;a href="https://tarrragon.github.io/blog/backend/01-database/vendors/cockroachdb/" data-link-title="CockroachDB" data-link-desc="分散式 SQL、PostgreSQL 相容、跨區強一致、Spanner 的開源 / 跨雲替代">CockroachDB vendor overview&lt;/a> + &lt;a href="https://tarrragon.github.io/blog/backend/01-database/global-distributed-oltp/" data-link-title="1.11 全球分散式 OLTP" data-link-desc="Spanner / Aurora DSQL / Cosmos DB multi-region write / CockroachDB / TiDB 的全球一致性取捨">1.11 全球分散式 OLTP&lt;/a> 閱讀。寫作參照 &lt;a href="https://tarrragon.github.io/blog/posts/vendor-%E6%B7%B1%E5%BA%A6%E6%8A%80%E8%A1%93%E6%96%87%E7%AB%A0%E6%96%B9%E6%B3%95%E8%AB%96%E7%9A%84%E6%BC%94%E5%8C%96%E7%B4%80%E9%8C%84%E5%90%8C-vendor-%E7%B3%BB%E5%88%97%E7%9A%84%E9%96%8B%E5%A0%B4%E8%BC%AA%E6%9B%BF%E9%A9%97%E8%AD%89/" data-link-title="Vendor 深度技術文章方法論的演化紀錄：同 vendor 系列的開場輪替驗證" data-link-desc="vendor overview 飽和後要寫單一功能深度文章、需要選題與結構依據時回來。這套方法論的驗證來源與 cadence variant 在高風險場景（同 vendor sub-tool 系列）的實證。">vendor deep article methodology&lt;/a>。&lt;/p>&lt;/blockquote>
&lt;hr>
&lt;h2 id="為什麼先講-driver-path不直接比-vendor">為什麼先講 driver path、不直接比 vendor&lt;/h2>
&lt;p>團隊評估「全球分散式 OLTP 三選一」時最常見的源頭錯誤：先比 vendor、再回頭問「我為什麼要 distributed SQL」。三家 vendor 文件都說「跨 region 強一致 SQL」、看不出實際取捨；做錯選擇後遷移成本極高。&lt;/p>
&lt;p>正確順序應該反過來：先識別 &lt;em>自己為什麼要評估 distributed SQL&lt;/em>、再進 vendor 比較。三條 driver path 各自的訊號、適配 vendor、決策路徑都不同 — 不識別 driver path 直接比 vendor 是源頭錯誤。&lt;/p>
&lt;p>讀者進來最常問的問題（多數會問錯順序）：&lt;/p>
&lt;ul>
&lt;li>我是不是真該換 distributed SQL、還是 Aurora / Cloud SQL 還能撐？&lt;/li>
&lt;li>Spanner 在 Google 跑了 10 年、CockroachDB 跟 DSQL 比較新、成熟度差多少？&lt;/li>
&lt;li>我有 PostgreSQL 應用、三家相容性差在哪？&lt;/li>
&lt;li>跨雲是硬需求還是被 fear 推的？&lt;/li>
&lt;li>DSQL 2024 才 GA、production 風險多大？&lt;/li>
&lt;li>我團隊 50 人能不能養 self-managed CockroachDB？&lt;/li>
&lt;li>Spanner 100 pu 起跳對我中小 PG workload 划算嗎？&lt;/li>
&lt;/ul>
&lt;p>7 題本文都會回答、但先回答「你是哪條 driver path」這個前置問題 0。&lt;/p>
&lt;h3 id="三條-driver-path-的-case-anchor">三條 driver path 的 case anchor&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/backend/09-performance-capacity/cases/doordash-cockroachdb-orders-platform/" data-link-title="9.C39 DoorDash：Aurora Postgres 寫入瓶頸 → CockroachDB 多主寫入" data-link-desc="DoorDash 從 Aurora Postgres 遷到 CockroachDB、解 1.6 M QPS 單主寫入瓶頸、外送平台爆量壓力下重做 OLTP 拓樸">9.C39 DoorDash&lt;/a>：Aurora Postgres 1.636 M QPS single-primary 撞牆 → 換 multi-primary、PostgreSQL wire 相容降低遷移阻力（F4.1 / F4.2 / F4.4）&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/backend/09-performance-capacity/cases/netflix-cockroachdb-multi-region-fleet/" data-link-title="9.C40 Netflix：380&amp;#43; CockroachDB cluster 的 multi-active 拓樸艦隊" data-link-desc="Netflix 把 Cassandra 不夠用的 transactional workload 移到 CockroachDB、380&amp;#43; cluster / 60&amp;#43; 跨 region、含 Open Connect、studio cloud drive、gaming control plane">9.C40 Netflix&lt;/a>：Cassandra eventual consistency 撐不住 transactional → 補 distributed SQL、self-managed 380+ cluster + Database Platform Team（F4.6 / F4.9）&lt;/li>
&lt;li>&lt;a href="https://tarrragon.github.io/blog/backend/09-performance-capacity/cases/hard-rock-digital-cockroachdb-sports-betting/" data-link-title="9.C41 Hard Rock Digital：CockroachDB on AWS Outposts、Wire Act 合規 &amp;#43; 跨州單一邏輯 DB" data-link-desc="Hard Rock Digital 用 CockroachDB 跨 AWS Outposts &amp;#43; US-East-1、Wire Act 強制資料留州、單一邏輯 DB 解多州 sportsbook、100 node 32 vCPU 撐 Super Bowl">9.C41 Hard Rock Digital&lt;/a>：Wire Act 合規驅動 + 50 人 tech team + Outposts 混合部署（F4.10 / F4.14）&lt;/li>
&lt;/ul>
&lt;p>對照 &lt;a href="https://tarrragon.github.io/blog/backend/09-performance-capacity/cases/spanner-planetary-scale-database-gcp/" data-link-title="9.C10 Cloud Spanner：每秒 10 億請求的全球一致性資料庫" data-link-desc="Google Cloud Spanner 內部峰值 10 億 req/sec、跨地區強一致 — 全球分散式 OLTP 容量參考">9.C10 Spanner planetary scale&lt;/a> 提供 Spanner ground truth（含 sizing barrier、F3.16）、&lt;a href="https://tarrragon.github.io/blog/backend/09-performance-capacity/cases/standard-chartered-aurora-banking/" data-link-title="9.C14 Standard Chartered：受監管銀行的 Aurora 4000 TPS 容量提升" data-link-desc="Standard Chartered 銀行遷移到 Aurora 後吞吐量提升 10 倍至 4000 TPS、跨 7 個受監管市場">9.C14 Standard Chartered&lt;/a> 提供 Aurora 受監管金融的另一條路徑、&lt;a href="https://tarrragon.github.io/blog/backend/09-performance-capacity/cases/draftkings-aurora-financial-ledger/" data-link-title="9.C4 DraftKings：Aurora 撐 100 萬 ops/min 的體育博彩金融帳本" data-link-desc="DraftKings 用 Aurora MySQL 跑體育博彩金融帳本、Super Bowl 流量 &amp;#43;50% 不影響延遲">9.C4 DraftKings Aurora financial ledger&lt;/a> 提供 Aurora 內 business sharding 路徑（不換引擎）。&lt;/p></description><content:encoded><![CDATA[<blockquote>
<p>本文是 DB4 distributed SQL 選型的 <em>entry point</em> deep article — 讀者進來時還沒決定哪個 vendor、甚至還沒釐清「我是不是該換 distributed SQL」。本文先用 <em>撞牆訊號分型</em> 幫讀者識別自己屬哪條 driver path、再進三軸 vendor 對比、最後落到 team size + sizing 邊界檢查。配合 <a href="/blog/backend/01-database/vendors/cockroachdb/" data-link-title="CockroachDB" data-link-desc="分散式 SQL、PostgreSQL 相容、跨區強一致、Spanner 的開源 / 跨雲替代">CockroachDB vendor overview</a> + <a href="/blog/backend/01-database/global-distributed-oltp/" data-link-title="1.11 全球分散式 OLTP" data-link-desc="Spanner / Aurora DSQL / Cosmos DB multi-region write / CockroachDB / TiDB 的全球一致性取捨">1.11 全球分散式 OLTP</a> 閱讀。寫作參照 <a href="/blog/posts/vendor-%E6%B7%B1%E5%BA%A6%E6%8A%80%E8%A1%93%E6%96%87%E7%AB%A0%E6%96%B9%E6%B3%95%E8%AB%96%E7%9A%84%E6%BC%94%E5%8C%96%E7%B4%80%E9%8C%84%E5%90%8C-vendor-%E7%B3%BB%E5%88%97%E7%9A%84%E9%96%8B%E5%A0%B4%E8%BC%AA%E6%9B%BF%E9%A9%97%E8%AD%89/" data-link-title="Vendor 深度技術文章方法論的演化紀錄：同 vendor 系列的開場輪替驗證" data-link-desc="vendor overview 飽和後要寫單一功能深度文章、需要選題與結構依據時回來。這套方法論的驗證來源與 cadence variant 在高風險場景（同 vendor sub-tool 系列）的實證。">vendor deep article methodology</a>。</p></blockquote>
<hr>
<h2 id="為什麼先講-driver-path不直接比-vendor">為什麼先講 driver path、不直接比 vendor</h2>
<p>團隊評估「全球分散式 OLTP 三選一」時最常見的源頭錯誤：先比 vendor、再回頭問「我為什麼要 distributed SQL」。三家 vendor 文件都說「跨 region 強一致 SQL」、看不出實際取捨；做錯選擇後遷移成本極高。</p>
<p>正確順序應該反過來：先識別 <em>自己為什麼要評估 distributed SQL</em>、再進 vendor 比較。三條 driver path 各自的訊號、適配 vendor、決策路徑都不同 — 不識別 driver path 直接比 vendor 是源頭錯誤。</p>
<p>讀者進來最常問的問題（多數會問錯順序）：</p>
<ul>
<li>我是不是真該換 distributed SQL、還是 Aurora / Cloud SQL 還能撐？</li>
<li>Spanner 在 Google 跑了 10 年、CockroachDB 跟 DSQL 比較新、成熟度差多少？</li>
<li>我有 PostgreSQL 應用、三家相容性差在哪？</li>
<li>跨雲是硬需求還是被 fear 推的？</li>
<li>DSQL 2024 才 GA、production 風險多大？</li>
<li>我團隊 50 人能不能養 self-managed CockroachDB？</li>
<li>Spanner 100 pu 起跳對我中小 PG workload 划算嗎？</li>
</ul>
<p>7 題本文都會回答、但先回答「你是哪條 driver path」這個前置問題 0。</p>
<h3 id="三條-driver-path-的-case-anchor">三條 driver path 的 case anchor</h3>
<ul>
<li><a href="/blog/backend/09-performance-capacity/cases/doordash-cockroachdb-orders-platform/" data-link-title="9.C39 DoorDash：Aurora Postgres 寫入瓶頸 → CockroachDB 多主寫入" data-link-desc="DoorDash 從 Aurora Postgres 遷到 CockroachDB、解 1.6 M QPS 單主寫入瓶頸、外送平台爆量壓力下重做 OLTP 拓樸">9.C39 DoorDash</a>：Aurora Postgres 1.636 M QPS single-primary 撞牆 → 換 multi-primary、PostgreSQL wire 相容降低遷移阻力（F4.1 / F4.2 / F4.4）</li>
<li><a href="/blog/backend/09-performance-capacity/cases/netflix-cockroachdb-multi-region-fleet/" data-link-title="9.C40 Netflix：380&#43; CockroachDB cluster 的 multi-active 拓樸艦隊" data-link-desc="Netflix 把 Cassandra 不夠用的 transactional workload 移到 CockroachDB、380&#43; cluster / 60&#43; 跨 region、含 Open Connect、studio cloud drive、gaming control plane">9.C40 Netflix</a>：Cassandra eventual consistency 撐不住 transactional → 補 distributed SQL、self-managed 380+ cluster + Database Platform Team（F4.6 / F4.9）</li>
<li><a href="/blog/backend/09-performance-capacity/cases/hard-rock-digital-cockroachdb-sports-betting/" data-link-title="9.C41 Hard Rock Digital：CockroachDB on AWS Outposts、Wire Act 合規 &#43; 跨州單一邏輯 DB" data-link-desc="Hard Rock Digital 用 CockroachDB 跨 AWS Outposts &#43; US-East-1、Wire Act 強制資料留州、單一邏輯 DB 解多州 sportsbook、100 node 32 vCPU 撐 Super Bowl">9.C41 Hard Rock Digital</a>：Wire Act 合規驅動 + 50 人 tech team + Outposts 混合部署（F4.10 / F4.14）</li>
</ul>
<p>對照 <a href="/blog/backend/09-performance-capacity/cases/spanner-planetary-scale-database-gcp/" data-link-title="9.C10 Cloud Spanner：每秒 10 億請求的全球一致性資料庫" data-link-desc="Google Cloud Spanner 內部峰值 10 億 req/sec、跨地區強一致 — 全球分散式 OLTP 容量參考">9.C10 Spanner planetary scale</a> 提供 Spanner ground truth（含 sizing barrier、F3.16）、<a href="/blog/backend/09-performance-capacity/cases/standard-chartered-aurora-banking/" data-link-title="9.C14 Standard Chartered：受監管銀行的 Aurora 4000 TPS 容量提升" data-link-desc="Standard Chartered 銀行遷移到 Aurora 後吞吐量提升 10 倍至 4000 TPS、跨 7 個受監管市場">9.C14 Standard Chartered</a> 提供 Aurora 受監管金融的另一條路徑、<a href="/blog/backend/09-performance-capacity/cases/draftkings-aurora-financial-ledger/" data-link-title="9.C4 DraftKings：Aurora 撐 100 萬 ops/min 的體育博彩金融帳本" data-link-desc="DraftKings 用 Aurora MySQL 跑體育博彩金融帳本、Super Bowl 流量 &#43;50% 不影響延遲">9.C4 DraftKings Aurora financial ledger</a> 提供 Aurora 內 business sharding 路徑（不換引擎）。</p>
<h2 id="撞牆訊號分型你的-driver-path-是哪一條前置問題-0f4-frame-1">撞牆訊號分型：你的 driver path 是哪一條（前置問題 0、F4 Frame 1）</h2>
<p>讀者進來前先回答：你 <em>為什麼</em> 要評估 distributed SQL？三條 driver path 各自的訊號、適配 vendor、決策路徑都不同。</p>
<h3 id="path-a--single-primary-寫入撞牆9c39-doordash-路徑f42--f46">Path A — single-primary 寫入撞牆（9.C39 DoorDash 路徑、F4.2 + F4.6）</h3>
<p>訊號：</p>
<ul>
<li>寫入量持續成長、Aurora / RDS / Cloud SQL primary CPU + WAL flush rate 接近上限</li>
<li>轉折點 <em>不是 IOPS、是 primary CPU + WAL flush rate</em>（F4.2、DoorDash 策略段 1）</li>
<li>已嘗試 vertical scale primary、撞 instance ceiling</li>
</ul>
<p>DoorDash concrete reference：2020-04-17 高峰 &gt; 1.636 M QPS、multi-hour outage（觀察段表格）。<strong>Scope warning（F4.1、case 自帶警示）</strong>：1.636 M QPS 是 <em>Aurora 撞牆的痛點</em> — 不是「CockroachDB throughput claim」、case 沒揭露遷移後單一 CockroachDB cluster 的峰值、只說「跑更多 cluster、alert volume 反而下降」。</p>
<p>適配 vendor：CockroachDB / Aurora DSQL / Spanner 都解、選擇看其他軸。</p>
<h3 id="path-b--eventual-consistency-缺口9c40-netflix-路徑f46">Path B — eventual consistency 缺口（9.C40 Netflix 路徑、F4.6）</h3>
<p>訊號：原本用 Cassandra / Riak / DynamoDB eventual consistency、遇到 <em>5 條件並存</em> 需求：</p>
<ol>
<li>multi-active topology（多 region 都可寫）</li>
<li>global consistent secondary index（跨 region 一致的二級索引）</li>
<li>global transaction（跨 row / 跨 region 的 ACID）</li>
<li>open source</li>
<li>SQL</li>
</ol>
<p>Cassandra 在 transactional 場景下 <em>湊不齊</em> 這五項。Netflix 2019 評估後選 CockroachDB（5 條件 case 直接列出、判讀段 1）。具體場景：Studio Cloud Drive（強一致 metadata + 全球可寫）、Open Connect 控制平面、Spinnaker（持續交付）、Maestro（ML / 資料 workflow）、Gaming 控制平面。</p>
<p>適配 vendor：CockroachDB（open source + SQL 兩條件硬卡）、Spanner（若 GCP-only 可放鬆 open source 要求）。</p>
<h3 id="path-c--合規驅動的地理邊界--跨-boundary-業務邏輯需求9c41-hard-rock-路徑f410">Path C — 合規驅動的地理邊界 + 跨 boundary 業務邏輯需求（9.C41 Hard Rock 路徑、F4.10）</h3>
<p>訊號：</p>
<ul>
<li>法規要求資料留某地理邊界（Wire Act 跨州、GDPR 跨國、各州博彩牌照）</li>
<li><em>同時</em> 業務邏輯需要跨 boundary（跨州統一帳戶 / 跨州 reporting / 欺詐偵測）</li>
</ul>
<p>Hard Rock concrete reference：跨 8 州（AZ / IN / TN / FL / OH / IL / NJ / VA）+ AWS Outposts + 邏輯一個 cluster（觀察段表格）。詳細 schema 配置見 <a href="../locality-aware-schema/">locality-aware schema</a>。</p>
<p>適配 vendor：CockroachDB（locality + placement + Outposts）、Spanner（GCP region 內 placement、無 Outposts 等效）、Aurora DSQL 跨 region 強一致但 Outpost 部署現階段未完整覆蓋。</p>
<h3 id="不該換-distributed-sql-的訊號">不該換 distributed SQL 的訊號</h3>
<ul>
<li>single-region OLTP 已足夠</li>
<li>寫入量未撞 single-primary 天花板（Aurora db.r6g.16xlarge 還沒滿）</li>
<li>無跨 region 業務需求</li>
<li>無跨 boundary 合規需求</li>
</ul>
<p>→ PostgreSQL / Aurora 足夠、distributed SQL overhead（寫入 2-5x latency、ops 複雜度）不划算。對應 <a href="/blog/backend/09-performance-capacity/cases/draftkings-aurora-financial-ledger/" data-link-title="9.C4 DraftKings：Aurora 撐 100 萬 ops/min 的體育博彩金融帳本" data-link-desc="DraftKings 用 Aurora MySQL 跑體育博彩金融帳本、Super Bowl 流量 &#43;50% 不影響延遲">9.C4 DraftKings</a> 走 Aurora + application sharding 的路徑、不換引擎也能解單主寫入瓶頸。</p>
<blockquote>
<p><strong>數字口徑</strong>：本段「2-5x latency」屬通用工程估算（Raft / Paxos round trip 跟 single-leader replication 的 latency ratio）、case 未直接揭露對照數字、實際值依拓樸 / 寫入大小 / 一致性層次而異、應該以自家 benchmark 驗證。</p></blockquote>
<h2 id="核心機制三軸-vendor-對比">核心機制：三軸 vendor 對比</h2>
<p>完成 driver path 識別後、進三軸 vendor 對比。</p>
<h3 id="軸-1--部署-topology">軸 1 — 部署 topology</h3>
<table>
  <thead>
      <tr>
          <th>Vendor</th>
          <th>部署</th>
          <th>何時是硬條件</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>CockroachDB</td>
          <td>cross-cloud + on-prem + Cockroach Cloud</td>
          <td>跨雲 / on-prem hybrid 必要時</td>
      </tr>
      <tr>
          <td>Spanner</td>
          <td>GCP-only</td>
          <td>不適合非 GCP 環境</td>
      </tr>
      <tr>
          <td>Aurora DSQL</td>
          <td>AWS-only</td>
          <td>不適合非 AWS 環境</td>
      </tr>
  </tbody>
</table>
<p>Path C 場景（Hard Rock Outposts hybrid）強制走 CockroachDB — 另兩家不提供等效部署。</p>
<h3 id="軸-2--managed-成熟度">軸 2 — Managed 成熟度</h3>
<p><strong>Scope warning（來源分層）</strong>：3 case 都沒揭露成熟度比對、本軸依 case + vendor 公開文件 + 外部知識合成：</p>
<ul>
<li><strong>Spanner</strong>：10+ 年 Google 內部 + 外部 GA（依 9.C10 case + Google research paper、屬 vendor 公開文件 + dogfood frame）</li>
<li><strong>CockroachDB</strong>：自管 + Cockroach Cloud（managed 較新、依 Cockroach Labs 公告）</li>
<li><strong>Aurora DSQL</strong>：2024-05 GA（依 AWS 公告）</li>
</ul>
<p>引用紀律：「Spanner 10+ 年」是 vendor 公開 + Google dogfood 的合成、不是 case 直接揭露的 production stability 數字。Aurora DSQL「2024-05 GA」屬 AWS 公開公告、production case ground truth 還在累積。引用時要明示來源層次。</p>
<h3 id="軸-3--sql-相容性">軸 3 — SQL 相容性</h3>
<table>
  <thead>
      <tr>
          <th>Vendor</th>
          <th>SQL</th>
          <th>相容程度</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>CockroachDB</td>
          <td>PostgreSQL wire protocol</td>
          <td><em>protocol-level</em> 相容、SQL 行為要 audit</td>
      </tr>
      <tr>
          <td>Spanner</td>
          <td>GoogleSQL + 部分 PostgreSQL 方言</td>
          <td>GoogleSQL native、PG 方言是子集</td>
      </tr>
      <tr>
          <td>Aurora DSQL</td>
          <td>PostgreSQL（AWS managed control plane）</td>
          <td>PostgreSQL-compatible、AWS 操作模型</td>
      </tr>
  </tbody>
</table>
<h3 id="postgresql-相容性-audit-checklist-4-項f44doordash-揭露">PostgreSQL 相容性 audit checklist 4 項（F4.4、DoorDash 揭露）</h3>
<p>DoorDash case 揭露 PG wire <em>protocol-level</em> 相容、SQL 行為「仍要驗證」。把這個警語展開成 audit checklist：</p>
<ol>
<li><strong>Serializable default</strong>：CockroachDB default SERIALIZABLE、PG default READ COMMITTED → application transaction 行為差異（細節見 <a href="../transaction-retry-pattern/">transaction retry pattern</a>）。Aurora DSQL 預設行為要看 AWS 公告。</li>
<li><strong>Retry semantics</strong>：CockroachDB 發 <code>40001 serialization_failure</code>、application 必須包 retry loop。PG / Aurora 預設不需要、application 沒 retry middleware。Aurora DSQL 比照 CockroachDB 模型、需要 retry loop。</li>
<li><strong>Partial index</strong>：CockroachDB 支援程度與 PG 有差異、application 用到的 partial index 要逐一驗證。Spanner GoogleSQL 跟 PG 行為不同。</li>
<li><strong>其他 SQL 行為</strong>：sequence、auto-increment、stored procedure、custom function、extension 等都需 case-by-case audit。</li>
</ol>
<p>引用紀律：DoorDash 揭露的是「PG wire protocol-level 相容、SQL 行為要 audit」這個 fact、本章把 audit 內容展開成 4 項屬通用工程議題、不是 DoorDash case 直接揭露。</p>
<h3 id="consensus-機制差">Consensus 機制差</h3>
<table>
  <thead>
      <tr>
          <th>Vendor</th>
          <th>共識</th>
          <th>硬體依賴</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>CockroachDB</td>
          <td><a href="/blog/backend/knowledge-cards/hybrid-logical-clock/" data-link-title="Hybrid Logical Clock" data-link-desc="用 physical wall clock &#43; monotonic logical counter 給每個事件 timestamp、靠軟體 max-offset 保證跨節點時鐘差不超過上限、超過 panic 保護一致性">Hybrid Logical Clock</a> + Raft</td>
          <td>純軟體 + NTP</td>
      </tr>
      <tr>
          <td>Spanner</td>
          <td>TrueTime + Paxos</td>
          <td>GPS + atomic clock</td>
      </tr>
      <tr>
          <td>Aurora DSQL</td>
          <td>類 Spanner 概念、AWS 專屬</td>
          <td>AWS timing infra（未完全公開）</td>
      </tr>
  </tbody>
</table>
<p>三家共識機制的差異直接決定 <a href="/blog/backend/knowledge-cards/external-consistency/" data-link-title="External Consistency" data-link-desc="交易可見順序與外部真實時間順序一致的強一致性語意">external consistency</a> 的實作路徑：Spanner 用 TrueTime + commit-wait 撐 external consistency；CockroachDB 用 HLC + max-offset 撐 linearizability、不保證 external consistency；Aurora DSQL 走類 Spanner 路徑但細節未完全公開。三家 multi-region 配置都吃 <a href="/blog/backend/knowledge-cards/cross-region-quorum/" data-link-title="Cross-Region Quorum" data-link-desc="multi-region distributed SQL 強制 voting replica 跨 region、commit 等多 region quorum ack、跨洲 RTT 物理硬限">Cross-Region Quorum</a> 的物理 latency tax。詳細機制見 <a href="../hlc-raft-consensus/">HLC + Raft consensus</a>。</p>
<h3 id="pricing-model-差">Pricing model 差</h3>
<ul>
<li><strong>CockroachDB self-managed</strong>：node × resource、cluster 至少 3 node</li>
<li><strong>Cockroach Cloud / Spanner / DSQL</strong>：consumption-based（read / write / storage / network）</li>
</ul>
<h3 id="sizing-barrier-邊界f3169c10-spanner-case-揭露">Sizing barrier 邊界（F3.16、9.C10 Spanner case 揭露）</h3>
<p>Spanner 100 processing unit 起跳是 <em>最小 footprint</em> — 對中小 PostgreSQL workload 是 cost 邊界：</p>
<ul>
<li>workload 月寫入若只夠 PG db.m6g.large 級別、付 Spanner 100 pu 起跳 cost 不對</li>
<li>CockroachDB 最小 3 node、storage / compute 線性 — 中小 workload 較友善</li>
<li>Aurora DSQL consumption-based 無 minimum、中小 workload 最友善（但 production case 累積較少）</li>
</ul>
<p>判讀：sizing barrier 是 <em>vendor 強制最小 footprint</em>、不是「啟動成本」— 即使 workload 縮小、minimum 不會降。中小 PG workload 直接套 Spanner = 付不必要的 minimum cost。</p>
<p>對應 <a href="/blog/backend/knowledge-cards/distributed-sql/" data-link-title="Distributed SQL" data-link-desc="把 SQL 與交易語意延伸到多節點與多區域的資料庫形態">distributed SQL 卡</a>、<a href="/blog/backend/knowledge-cards/quorum/" data-link-title="Quorum" data-link-desc="分散式系統以多數節點同意作為提交或讀取有效性的門檻">quorum 卡</a>、<a href="/blog/backend/knowledge-cards/vendor-lock-in/" data-link-title="Vendor Lock-In" data-link-desc="說明採用供應商產品後，其 API 與格式滲入程式碼造成的退出成本">vendor lock-in 卡</a>。</p>
<h2 id="決策樹七問題">決策樹：七問題</h2>
<p>前置問題 0 在 <em>撞牆訊號分型</em> 段已回答（你的 driver path 是 A / B / C 哪一條）。以下進三家 vendor 對比的七個問題。</p>
<h3 id="問題-1是否硬需求跨雲--on-prem">問題 1：是否硬需求跨雲 / on-prem？</h3>
<ul>
<li><strong>Yes</strong> → CockroachDB（唯一選項；對應 9.C40 Netflix 跨 AWS region、9.C41 Hard Rock AWS Outposts 混合）</li>
<li><strong>No</strong> → 進問題 2</li>
</ul>
<p>跨雲是 <em>硬需求</em> 而不是 <em>fear-driven</em> 訊號：</p>
<ul>
<li>真硬需求：法規明文跨雲、acquisition 後多雲整合、vendor risk 政策強制</li>
<li>fear-driven：「萬一 AWS 全球 outage」（多數公司實際走 single-cloud、跨雲 portability premium 卻沒實際 multi-cloud 部署）</li>
</ul>
<blockquote>
<p><strong>數字口徑</strong>：本段「多數公司 single-cloud」屬通用工程估算、case 未揭露明確比例、實際分佈依產業 / 監管 / 規模而異。判斷自己是否需要跨雲時、看具體規範跟 risk 條款、不直接套通用比例。</p></blockquote>
<h3 id="問題-2已在-aws-還是-gcp-還是中立">問題 2：已在 AWS 還是 GCP 還是中立？</h3>
<ul>
<li><strong>AWS 深</strong> → Aurora DSQL（操作模型對齊、PostgreSQL 相容）</li>
<li><strong>GCP 深</strong> → Spanner（10 年成熟、Google 內部驗證）</li>
<li><strong>中立 / 多雲</strong> → CockroachDB（可 portable）</li>
</ul>
<p>雲商生態深度判讀：IAM / VPC / monitoring / cost mgmt 已深度整合 AWS → Aurora DSQL 整合阻力低；同樣道理 GCP → Spanner。</p>
<h3 id="問題-3production-風險預算">問題 3：production 風險預算？</h3>
<ul>
<li><strong>低</strong>（金融 / 醫療）→ Spanner（最成熟）或 CockroachDB（&gt;5 年外部 production case）</li>
<li><strong>中</strong> → 三者皆可</li>
<li><strong>高</strong>（願意當 early adopter）→ Aurora DSQL（2024 GA）</li>
</ul>
<p>風險預算對應的不是「會不會掛」、是「邊界 case 文件成熟度 + production troubleshooting case 量」。Aurora DSQL 2024 GA、production case 累積中、邊界 case 仍在被發現。</p>
<h3 id="問題-4postgresql-相容性是-hard-requirement">問題 4：PostgreSQL 相容性是 hard requirement？</h3>
<ul>
<li><strong>Yes</strong>（既有 application）→ CockroachDB 或 Aurora DSQL（兩者都做 PG 相容、但走 audit checklist 驗證 SQL 行為）</li>
<li><strong>No</strong> → Spanner（GoogleSQL 也可）</li>
</ul>
<p>PG hard requirement 訊號：application 用 PostgreSQL-specific feature（partial index、JSONB operator、PostGIS、PG extension 生態）、ORM / driver 深度綁 PostgreSQL wire。</p>
<h3 id="問題-5管理負擔誰承擔">問題 5：管理負擔誰承擔？</h3>
<ul>
<li><strong>自管</strong> → CockroachDB（唯一可自管）</li>
<li><strong>Managed</strong> → 都行、依雲商生態</li>
</ul>
<p>自管 vs managed 不只是「省人月」、是「邊界 case 出現時誰修」— managed 的 vendor 負責、自管的自己負責。</p>
<h3 id="問題-6team-size-是否撐得起-self-managedf4149c41-hard-rock--9c40-netflix-揭露">問題 6：team size 是否撐得起 self-managed（F4.14、9.C41 Hard Rock + 9.C40 Netflix 揭露）</h3>
<p>distributed SQL 的 ops 槓桿來自系統內建 Raft / placement 把「DBA 養單區、跨區 sync 養運維」工作量壓進系統內。</p>
<p>Hard Rock 50 人 tech team 估「若用 PostgreSQL 需多加 10-20 工程師」（觀察段表格 + 策略段 4）。<strong>Case 自帶警示</strong>：「省了 10-20 工程師」是 <em>機會成本</em>（沒招那麼多 DBA）、<em>不是</em> 節省支出（已 hire 後解雇）。引用必須明示口徑：</p>
<ul>
<li>正確：「distributed SQL 對小團隊的 ops 槓桿 = 不必招那麼多 DBA」</li>
<li>錯誤：「上 CockroachDB 可裁員」、「節省人月支出」</li>
</ul>
<p>Self-managed 規模化的另一極：Netflix 養 380+ cluster 需要 <em>專屬 Database Platform Team</em>（含 backup / upgrade / incident response / capacity review、F4.9）。沒這量級團隊直接 self-host 大規模 cluster 是 ops 自殺、Cockroach Cloud 才是合理路徑。判讀訊號：「self-managed cluster 數量 vs 平台團隊規模」轉折點 case 沒講具體閾值、引用時不可宣稱閾值、但方向清楚：</p>
<ul>
<li>team size 小（&lt; 100 人 tech team、無專屬 DB platform team）→ Cockroach Cloud / Spanner / DSQL（managed）優先</li>
<li>team size 大 + 有專屬 DB platform team → self-managed CockroachDB 可考慮</li>
<li>team size 中等但要 self-host 大規模 cluster → 評估專屬 platform team 投資後再決定</li>
</ul>
<h3 id="問題-7sizing-是否撐得起-vendor-minimumf316">問題 7：sizing 是否撐得起 vendor minimum（F3.16）</h3>
<ul>
<li>Spanner 100 processing unit 起跳對中小 PG workload 是成本門檻、月寫入 &lt; 某 baseline 時付 Spanner 起跳費不划算</li>
<li>中小 workload 但需 multi-region 強一致 → CockroachDB 3 node 起 / Aurora DSQL consumption-based 較友善</li>
<li>大 workload（已過 single-primary 撞牆訊號）→ 三家皆可、進問題 1-6 再篩</li>
</ul>
<h2 id="cluster-boundary-顆粒per-app-cluster-vs-邏輯一個-clustercockroachdb-cluster-boundary-ssot">Cluster boundary 顆粒：per-app cluster vs 邏輯一個 cluster（CockroachDB cluster boundary SSoT）</h2>
<blockquote>
<p><strong>位置標</strong>：本段是 _module-outline.md Section G「CockroachDB cluster boundary 顆粒」的 SSoT 主寫段、是 <em>已選 CockroachDB 後</em> 的拓樸決策（跟前面七問題 vendor 選擇分流）。其他 vendor cluster boundary 議題不在本段重複展開 — Aurora fleet 治理（business sharding / 200 cluster 模式）見 <a href="../../aurora/read-replica-scaling/">aurora/read-replica-scaling</a>、MongoDB blast radius 切多 cluster（Toyota 20 DB 模式）見 <a href="../../mongodb/shard-key-selection/">mongodb/shard-key-selection</a>。</p></blockquote>
<p>選完 vendor 還有一個正交的拓樸決策：CockroachDB cluster 的「顆粒」要切多細。一個微服務一個 cluster（per-app）、還是多個微服務共用一個邏輯 cluster（shared / 邏輯一個 cluster）。這條軸的判讀獨立於跨雲 / 風險預算 / 管理負擔等七問題、是 <em>cluster 拓樸</em> 議題、不是 vendor 選擇議題。判讀核心是 <a href="/blog/backend/knowledge-cards/blast-radius/" data-link-title="Blast Radius" data-link-desc="說明事故影響面如何估算與隔離">blast radius</a> 的取捨 — 是把故障半徑限縮在單服務（per-app）、還是接受邏輯 cluster 內事故跨業務影響但換 transactional cross-domain 能力（邏輯一個 cluster）。本段是 CockroachDB cluster boundary 顆粒的主寫位置、其他 sibling 文章（<a href="../hlc-raft-consensus/">hlc-raft-consensus</a>、<a href="../survival-goals/">survival-goals</a>、<a href="../locality-aware-schema/">locality-aware-schema</a>）cross-link 不重複展開。</p>
<h3 id="per-app-clusternetflix-380-路徑f47-揭露">Per-app cluster（Netflix 380+ 路徑、F4.7 揭露）</h3>
<p>每個微服務 / 每個業務邊界各自獨立 cluster。Netflix 揭露的具體形貌：380+ cluster、每個 cluster 規模小（屬「artery of small DBs」哲學、不是巨型 DB）、每個服務 own 自己的 schema 跟容量。</p>
<p>判讀訊號：</p>
<ul>
<li>服務之間資料 <em>硬隔離</em>（compliance / blast radius / 不同 SLA tier）— 共用 cluster 一旦 schema migration / hot range 出事、影響面跨服務</li>
<li>跨服務 query 需求低（沒有 cross-domain JOIN 場景）</li>
<li>容量規劃可以 per-cluster（每個服務自己估、不需共池）</li>
<li>有專屬 Database Platform Team 養 cluster lifecycle（backup / upgrade / incident response / capacity review、F4.9）— ops surface area 隨 cluster 數 <em>線性成長</em></li>
</ul>
<p>代價：ops surface area 大、每個 cluster 都要獨立 upgrade / monitoring / capacity review。沒這量級平台團隊直接 self-host 380 cluster 是 ops 自殺。</p>
<h3 id="邏輯一個-clusterhard-rock-路徑f410-揭露">邏輯一個 cluster（Hard Rock 路徑、F4.10 揭露）</h3>
<p>業務邏輯上是 <em>一個</em> CockroachDB cluster、物理上跨多地理 placement（locality + replication zone 把 range 釘到特定 region / AZ / Outpost）。Hard Rock 揭露的具體形貌：跨 8 州 + AWS Outposts、邏輯一個 cluster、跨州統一帳戶 / 跨州 reporting / 欺詐偵測在同一 cluster 內做 transactional query。</p>
<p>判讀訊號：</p>
<ul>
<li>跨服務 / 跨地理需要 <em>transactional</em> query（跨州統一帳戶、跨業務統合 reporting）— 拆獨立 cluster 會破壞業務邏輯</li>
<li>合規顆粒 <em>細</em> 到 region / 州 / AZ、但 <em>不要求</em> 完全隔離 cluster（Wire Act 要求州內運算、但允許跨州 application 邏輯）</li>
<li>Team size 中小（Hard Rock 50 人 tech team）、ops surface area 集中比攤平好管</li>
<li>容量規劃集中、跨服務資源共享（不同服務的 range 可以 colocate 同 cluster）</li>
</ul>
<p>代價：cluster 內複雜度高（要設計 placement / locality / replication zone 把 range 釘對地方）、blast radius 是 <em>整個邏輯 cluster</em>、cluster 級事故影響跨業務。</p>
<h3 id="兩條路徑的判讀軸">兩條路徑的判讀軸</h3>
<table>
  <thead>
      <tr>
          <th>判讀軸</th>
          <th>Per-app cluster（Netflix）</th>
          <th>邏輯一個 cluster（Hard Rock）</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>服務隔離度</td>
          <td>硬隔離（不同 SLA / compliance tier）</td>
          <td>弱隔離（同業務域、共用 placement 策略）</td>
      </tr>
      <tr>
          <td>跨服務 query 需求</td>
          <td>低</td>
          <td>高（transactional cross-domain）</td>
      </tr>
      <tr>
          <td>Blast radius</td>
          <td>限縮在單服務</td>
          <td>整個邏輯 cluster</td>
      </tr>
      <tr>
          <td>Ops surface area</td>
          <td>線性成長（每 cluster 獨立 lifecycle）</td>
          <td>集中但複雜度高（cluster 內 placement）</td>
      </tr>
      <tr>
          <td>容量規劃顆粒</td>
          <td>Per-cluster 獨立估</td>
          <td>集中估、跨服務共池</td>
      </tr>
      <tr>
          <td>平台團隊要求</td>
          <td>高（cluster 數越多越剛性）</td>
          <td>中（cluster 數少但 placement 複雜度高）</td>
      </tr>
  </tbody>
</table>
<p>判讀順序：先問「跨服務 query 需要 transactional 嗎」— Yes 偏邏輯一個 cluster、No 進下一條；再問「服務之間 SLA / compliance 是否硬隔離」— Yes 偏 per-app、No 看 team / ops 槓桿。</p>
<h3 id="跟-aurora-fleet-治理的本質差異">跟 Aurora fleet 治理的本質差異</h3>
<p>Aurora <a href="../../aurora/read-replica-scaling/">fleet 治理 SSoT</a>（read-replica-scaling 邊界段）展開的是 <em>Aurora cluster 之間</em> 怎麼拆（business sharding / blast radius / read fanout），cluster 是 single-primary 抽象、拆 cluster 是 <em>繞過</em> single-primary 上限。</p>
<p>CockroachDB cluster boundary 的問題不一樣 — CockroachDB 本身就是 distributed、單 cluster 內可橫向擴展、cluster boundary 是 <em>業務 / 合規 / blast radius 邊界</em>、不是繞 single-primary。</p>
<table>
  <thead>
      <tr>
          <th>軸</th>
          <th>Aurora fleet</th>
          <th>CockroachDB cluster boundary</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>拆 cluster 動機</td>
          <td>繞過 single-primary 寫入上限</td>
          <td>隔離 blast radius / 合規邊界 / 平台分權</td>
      </tr>
      <tr>
          <td>單 cluster 上限</td>
          <td>寫入 capacity（single-primary）</td>
          <td>範圍大（distributed、Raft 內擴）</td>
      </tr>
      <tr>
          <td>跨 cluster query</td>
          <td>應用層拼（無 transactional 保證）</td>
          <td>一樣應用層拼（除非邏輯一個 cluster）</td>
      </tr>
      <tr>
          <td>典型形貌</td>
          <td>DraftKings 200 cluster（business sharding）</td>
          <td>Netflix 380+（per-app）/ Hard Rock 1（logical）</td>
      </tr>
  </tbody>
</table>
<p>兩條路徑的 <em>拆與不拆</em> 動機本質不同。Aurora 拆是 <em>被迫</em>（單 cluster 撐不住）、CockroachDB 拆是 <em>選擇</em>（單 cluster 撐得住、拆是為了治理）。</p>
<h3 id="跨-vendor-路徑對照">跨 vendor 路徑對照</h3>
<ul>
<li><strong>Aurora fleet</strong>（DraftKings 200 cluster）— business sharding 繞 single-primary 上限、每 cluster 仍可多 service、平均負載低（<a href="/blog/backend/09-performance-capacity/cases/draftkings-aurora-financial-ledger/" data-link-title="9.C4 DraftKings：Aurora 撐 100 萬 ops/min 的體育博彩金融帳本" data-link-desc="DraftKings 用 Aurora MySQL 跑體育博彩金融帳本、Super Bowl 流量 &#43;50% 不影響延遲">9.C4 case</a> 揭露單 cluster ~80 ops/sec、200 cluster 加總 17K ops/sec）</li>
<li><strong>CockroachDB per-app</strong>（Netflix 380+）— 微服務級拆 cluster、artery of small DBs、需要專屬 Database Platform Team；單 cluster 內 <a href="/blog/backend/knowledge-cards/range-sharding/" data-link-title="Range Sharding" data-link-desc="分散式 SQL 把 key space 切成可自動 split / merge 的 range、每個 range 自己的 consensus group、application 透明">Range Sharding</a> + <a href="/blog/backend/knowledge-cards/leaseholder/" data-link-title="Leaseholder" data-link-desc="分散式 SQL 每個 range 在任一時間點的 read / write entry point、通常等於 Raft leader、承擔該 range 的 coordination">Leaseholder</a> 負責內部 scaling</li>
<li><strong>CockroachDB 邏輯一個</strong>（Hard Rock）— 跨地理單一 cluster、locality + placement 撐合規 + transactional 跨域、本地化讀靠 <a href="/blog/backend/knowledge-cards/follower-read/" data-link-title="Follower Read" data-link-desc="分散式 SQL 從 non-voting replica 讀 closed timestamp 之前的資料、不參與 Raft commit、低 latency 但 read-after-write 場景仍可能 stale">Follower Read</a> 降低跨 region cost</li>
<li><strong>CockroachDB fleet per-jurisdiction</strong>（Standard Chartered）— 每監管市場一個 cluster、合規 <em>禁止</em> 跨市場資料流動時的 forced pattern、跟 Hard Rock 對照（合規顆粒粗到要拆 vs 細到能用 placement）</li>
</ul>
<p>進階閱讀：合規驅動的 cluster boundary 選擇見 <a href="../locality-aware-schema/">locality-aware-schema</a>；單 cluster 容量規劃見 <a href="../hlc-raft-consensus/">hlc-raft-consensus</a> 容量與觀測段。</p>
<h2 id="失敗模式常見錯配">失敗模式：常見錯配</h2>
<h3 id="過度-fear-aws--gcp-lock-in">過度 fear AWS / GCP lock-in</h3>
<p>承接 <em>問題 1：是否硬需求跨雲</em> 段的 fear-driven 訊號（多數場景單雲、跨雲是想像中需求）— 把 fear 當硬需求選 CockroachDB，付 portability premium（自管 ops + Cockroach Cloud 較新）卻沒實際 multi-cloud 部署，結果付的是 lock-in 保險、實際沒用上。</p>
<p>判讀：跨雲訊號要 <em>具體場景</em>（acquisition 後整合 / 法規明文 / vendor risk 政策強制）、不是 fear。</p>
<h3 id="低估-dsql-成熟度風險">低估 DSQL 成熟度風險</h3>
<p>2024-05 GA、production case 少、邊界 case 文件不全 — early adopter 才適合。production 風險預算低的場景（金融 / 醫療 / 合規嚴格）不應該選最新 GA 的服務。</p>
<h3 id="spanner-假設-postgresql-全相容">Spanner 假設 PostgreSQL 全相容</h3>
<p>Spanner PostgreSQL interface 是 <em>子集</em>、部分 PostgreSQL feature 不支援。應用 migration 仍需 audit、不可直接 lift-and-shift。</p>
<h3 id="self-managed-cockroachdb-低估-ops-cost9c40-netflix-concrete-referencef49">Self-managed CockroachDB 低估 ops cost（9.C40 Netflix concrete reference、F4.9）</h3>
<p>Raft / backup / upgrade / monitoring 自管比 PostgreSQL 複雜、DBA bandwidth 沒到位變 disaster。Netflix 養 380+ cluster 需要 <em>專屬 Database Platform Team</em> — 含 backup、upgrade、incident response、capacity review。</p>
<p>判讀訊號：「self-managed cluster 數量 vs 平台團隊規模」轉折點 case 沒講具體閾值、引用時不可宣稱閾值、但方向清楚 — 小規模 self-managed 不需要、大規模一定需要、之間有 grey zone 要實際評估團隊能力。</p>
<h3 id="用-distributed-sql-解-single-region-oltp">用 distributed SQL 解 single-region OLTP</h3>
<p>90% 場景 PostgreSQL / Aurora 夠用、distributed SQL overhead 是 2-5x latency（Raft round trip 額外成本）。沒撞 single-primary 寫入上限的情況下、上 distributed SQL 是付不必要的 latency premium。</p>
<h3 id="合規邊界誤判">合規邊界誤判</h3>
<p>受監管市場可能 <em>不能</em> 用任何跨境 distributed SQL（Standard Chartered 模式）、要拆每市場獨立 cluster。反過來、合規顆粒小（跨州 vs 跨國）+ 跨 boundary 業務邏輯需求高（跨州統一帳戶）時、Standard Chartered fleet 拓樸不適合、需走 Hard Rock locality + placement 路徑（細節見 <a href="../locality-aware-schema/">locality-aware schema</a>）。</p>
<h3 id="sizing-barrier-誤判f316">Sizing barrier 誤判（F3.16）</h3>
<p>中小 PG workload 直接套 Spanner 100 pu 起跳、付的是不必要的 minimum cost。中小規模的硬一致 multi-region workload、CockroachDB 3 node / Aurora DSQL consumption-based 更划算。</p>
<h3 id="team-size-誤判f414">Team size 誤判（F4.14）</h3>
<p>把「省 10-20 工程師」當已 hire 後可裁員的節省支出、實際是 <em>機會成本</em>（沒招那麼多 DBA）。上 CockroachDB 不代表可裁掉現有 DBA — 現有 DBA 反而要轉型成 distributed SQL 運維。</p>
<h2 id="容量與觀測">容量與觀測</h2>
<h3 id="三家共同-metric">三家共同 metric</h3>
<ul>
<li>write QPS</li>
<li>cross-region latency p99</li>
<li>storage growth</li>
<li>replica lag（CockroachDB Raft / Spanner Paxos / DSQL replica）</li>
</ul>
<h3 id="觀測黑箱程度">觀測黑箱程度</h3>
<ul>
<li><strong>CockroachDB Console</strong>：暴露 Raft / range / leaseholder 細節、observability 細</li>
<li><strong>Spanner / DSQL</strong>：managed、metric 經 GCP Cloud Monitoring / AWS CloudWatch、observability 黑箱程度高 — 邊界 case troubleshooting 仰賴 vendor support</li>
</ul>
<h3 id="容量公式">容量公式</h3>
<p>write QPS × replication factor × cross-region latency = required node / capacity。中小 workload 撞 vendor minimum 才是真實 cost 下界。</p>
<h3 id="cost-signal">Cost signal</h3>
<p>三家定價模式不同、cross-region traffic 對 cost 影響都大：</p>
<ul>
<li>CockroachDB self-managed：node × resource、可控但要自運維</li>
<li>Spanner：100 pu minimum + consumption、適合穩定 workload、中小 burst 不划算</li>
<li>Aurora DSQL：consumption-based、burst 友善、長期穩定 workload 累計可能比 Spanner 高</li>
</ul>
<h3 id="回路徑">回路徑</h3>
<ul>
<li><a href="/blog/backend/09-performance-capacity/" data-link-title="模組九：效能工程與容量規劃" data-link-desc="把『目前配置能撐多少、要加多少機器』變成可量化、可驗證、可改進的工程流程">9.6 容量規劃模型</a></li>
<li><a href="/blog/backend/01-database/global-distributed-oltp/" data-link-title="1.11 全球分散式 OLTP" data-link-desc="Spanner / Aurora DSQL / Cosmos DB multi-region write / CockroachDB / TiDB 的全球一致性取捨">1.11 全球分散式 OLTP</a> 完整對比</li>
</ul>
<h2 id="邊界與整合">邊界與整合</h2>
<h3 id="sibling-deep-articles">Sibling deep articles</h3>
<ul>
<li><a href="../hlc-raft-consensus/">HLC + Raft consensus</a>（軟體時鐘 vs TrueTime）</li>
<li><a href="../locality-aware-schema/">locality-aware schema</a>（locality model 對比）</li>
<li><a href="../survival-goals/">survival goals</a>（HA model 對比）</li>
<li><a href="../transaction-retry-pattern/">transaction retry pattern</a>（application contract 重塑）</li>
</ul>
<h3 id="sibling-跨-vendor">Sibling 跨 vendor</h3>
<ul>
<li><a href="/blog/backend/01-database/vendors/aurora/" data-link-title="AWS Aurora" data-link-desc="AWS managed PostgreSQL / MySQL、storage / compute 分離、&#43;75% 效能改善的 production 證據">Aurora vendor overview</a>（async cross-region、不是 distributed SQL）</li>
<li><a href="/blog/backend/01-database/vendors/spanner/" data-link-title="Google Cloud Spanner" data-link-desc="全球分散式 strong-consistency OLTP、TrueTime API、線性擴展到 10 億 req/sec">Spanner vendor overview</a> 對照頁</li>
<li><a href="/blog/backend/01-database/vendors/postgresql/" data-link-title="PostgreSQL" data-link-desc="多用途 OLTP 主流關聯式資料庫、MVCC、豐富 SQL 特性、是 Aurora / Cosmos DB / Spanner / CockroachDB / Aurora DSQL 的相容目標">PostgreSQL vendor overview</a>（單區 OLTP fallback）</li>
</ul>
<h3 id="migration-playbook">Migration playbook</h3>
<ul>
<li><a href="/blog/backend/01-database/vendors/postgresql/migrate-to-cockroachdb/" data-link-title="PostgreSQL → CockroachDB：三維皆 High 的多重歸類 migration" data-link-desc="PostgreSQL → CockroachDB 是 Schema / Operational / Paradigm 三維皆 High 的 multi-axis migration、實證 [#127](/report/content-structure-by-max-diff-dimension/) 的「多重歸類跟 tie-breaking」規則；主結構走 Type E paradigm shift、Schema 差 &#43; Operational redesign 抽出獨立段；涵蓋 transaction model 重設計、SQL dialect gap、5 個 production 踩雷">PG → CockroachDB</a></li>
<li><a href="/blog/backend/01-database/vendors/postgresql/migrate-to-aurora-dsql/" data-link-title="PostgreSQL → Aurora DSQL Migration：PG wire-compatible Distributed SQL 的 Paradigm Shift" data-link-desc="Aurora DSQL（2024-12 re:Invent preview / 2025-05 GA）是 AWS 推的 PG wire-compatible *active-active distributed SQL*、跟 self-managed PG / Aurora PG 不同 paradigm（OCC &#43; snapshot isolation &#43; multi-region strong consistency）。Migration 結構是 *protocol drop-in &#43; paradigm shift*：app SQL 不太改、但 transaction retry / extension 缺位 / 多 region 一致性需重設計。本文走 DSQL vs Aurora PG vs self-managed PG 三軸對比、為什麼遷的三條 driver（global write / operational zero-touch / region resiliency）、Type E phased plan、5 production 踩雷（transaction retry 沒處理 / extension 缺位 / sequence throughput 限制 / Aurora PG 直升 DSQL 不可行 / region failover semantic）、跟 PG → Aurora 跟 PG → CockroachDB 對比">PG → Aurora DSQL</a></li>
</ul>
<h3 id="1x-章節互引">1.x 章節互引</h3>
<ul>
<li><a href="/blog/backend/01-database/global-distributed-oltp/" data-link-title="1.11 全球分散式 OLTP" data-link-desc="Spanner / Aurora DSQL / Cosmos DB multi-region write / CockroachDB / TiDB 的全球一致性取捨">1.11 全球分散式 OLTP</a> 上游</li>
<li><a href="/blog/backend/knowledge-cards/vendor-lock-in/" data-link-title="Vendor Lock-In" data-link-desc="說明採用供應商產品後，其 API 與格式滲入程式碼造成的退出成本">vendor lock-in 卡</a></li>
<li><a href="/blog/backend/knowledge-cards/distributed-sql/" data-link-title="Distributed SQL" data-link-desc="把 SQL 與交易語意延伸到多節點與多區域的資料庫形態">distributed SQL 卡</a></li>
</ul>
<h3 id="何時不用本文">何時不用本文</h3>
<ul>
<li>single-region OLTP 已夠（90% 場景）→ 用 PostgreSQL / Aurora、不必走 distributed SQL</li>
<li>無 multi-region requirement、無跨 boundary 合規需求 → 同上</li>
<li>workload 規模未撞 single-primary 寫入上限 → 走 Aurora vertical scale + read replica 即可</li>
</ul>
<h2 id="相關連結">相關連結</h2>
<ul>
<li><a href="/blog/backend/01-database/vendors/cockroachdb/" data-link-title="CockroachDB" data-link-desc="分散式 SQL、PostgreSQL 相容、跨區強一致、Spanner 的開源 / 跨雲替代">CockroachDB vendor overview</a></li>
<li><a href="/blog/backend/09-performance-capacity/cases/doordash-cockroachdb-orders-platform/" data-link-title="9.C39 DoorDash：Aurora Postgres 寫入瓶頸 → CockroachDB 多主寫入" data-link-desc="DoorDash 從 Aurora Postgres 遷到 CockroachDB、解 1.6 M QPS 單主寫入瓶頸、外送平台爆量壓力下重做 OLTP 拓樸">9.C39 DoorDash</a>（Path A — single-primary 寫入撞牆）</li>
<li><a href="/blog/backend/09-performance-capacity/cases/netflix-cockroachdb-multi-region-fleet/" data-link-title="9.C40 Netflix：380&#43; CockroachDB cluster 的 multi-active 拓樸艦隊" data-link-desc="Netflix 把 Cassandra 不夠用的 transactional workload 移到 CockroachDB、380&#43; cluster / 60&#43; 跨 region、含 Open Connect、studio cloud drive、gaming control plane">9.C40 Netflix</a>（Path B — Cassandra 缺口、Database Platform Team）</li>
<li><a href="/blog/backend/09-performance-capacity/cases/hard-rock-digital-cockroachdb-sports-betting/" data-link-title="9.C41 Hard Rock Digital：CockroachDB on AWS Outposts、Wire Act 合規 &#43; 跨州單一邏輯 DB" data-link-desc="Hard Rock Digital 用 CockroachDB 跨 AWS Outposts &#43; US-East-1、Wire Act 強制資料留州、單一邏輯 DB 解多州 sportsbook、100 node 32 vCPU 撐 Super Bowl">9.C41 Hard Rock Digital</a>（Path C — 合規驅動 + team size 槓桿）</li>
<li><a href="/blog/backend/09-performance-capacity/cases/spanner-planetary-scale-database-gcp/" data-link-title="9.C10 Cloud Spanner：每秒 10 億請求的全球一致性資料庫" data-link-desc="Google Cloud Spanner 內部峰值 10 億 req/sec、跨地區強一致 — 全球分散式 OLTP 容量參考">9.C10 Spanner planetary scale</a>（Spanner ground truth + sizing barrier）</li>
<li><a href="/blog/backend/09-performance-capacity/cases/standard-chartered-aurora-banking/" data-link-title="9.C14 Standard Chartered：受監管銀行的 Aurora 4000 TPS 容量提升" data-link-desc="Standard Chartered 銀行遷移到 Aurora 後吞吐量提升 10 倍至 4000 TPS、跨 7 個受監管市場">9.C14 Standard Chartered</a>（合規邊界 anti-recommendation）</li>
<li><a href="/blog/backend/09-performance-capacity/cases/draftkings-aurora-financial-ledger/" data-link-title="9.C4 DraftKings：Aurora 撐 100 萬 ops/min 的體育博彩金融帳本" data-link-desc="DraftKings 用 Aurora MySQL 跑體育博彩金融帳本、Super Bowl 流量 &#43;50% 不影響延遲">9.C4 DraftKings</a>（Aurora sharding 不換引擎路徑）</li>
<li><a href="/blog/backend/01-database/global-distributed-oltp/" data-link-title="1.11 全球分散式 OLTP" data-link-desc="Spanner / Aurora DSQL / Cosmos DB multi-region write / CockroachDB / TiDB 的全球一致性取捨">1.11 全球分散式 OLTP</a></li>
<li><a href="/blog/backend/knowledge-cards/distributed-sql/" data-link-title="Distributed SQL" data-link-desc="把 SQL 與交易語意延伸到多節點與多區域的資料庫形態">distributed SQL 卡</a> / <a href="/blog/backend/knowledge-cards/vendor-lock-in/" data-link-title="Vendor Lock-In" data-link-desc="說明採用供應商產品後，其 API 與格式滲入程式碼造成的退出成本">vendor lock-in 卡</a> / <a href="/blog/backend/knowledge-cards/quorum/" data-link-title="Quorum" data-link-desc="分散式系統以多數節點同意作為提交或讀取有效性的門檻">quorum 卡</a></li>
<li>官方：<a href="https://www.cockroachlabs.com/docs/">Cockroach Labs Documentation</a> / <a href="https://cloud.google.com/spanner/docs">Spanner Documentation</a> / <a href="https://docs.aws.amazon.com/aurora-dsql/">Aurora DSQL Documentation</a></li>
</ul>
]]></content:encoded></item></channel></rss>