π DynamoDB Global Tables
As apps grow globally, users far from your table's Region face higher latency.
π‘ Global Tables solve this by replicating your table across multiple Regions β users read/write to the nearest copy, and all copies stay in sync.
π― What You'll Learn
What Global Tables are
How they improve performance
How data replicates across Regions
What active-active replication means
What to know for the exam
π― Exam Tip
β Replicates data across multiple AWS Regions
β Gives users low-latency read/write access worldwide
β Replication is active-active β write to any participating Region
β No implementation/config details needed for the exam
π§ Core Idea
If your table lives only in US East (N. Virginia) (us-east-1), European users pay extra latency reaching across the ocean β even on AWS's fast network.
Global Tables fix this by keeping synchronized copies in multiple Regions. Add a replica in Europe (Paris) (eu-west-3) and:
North America β reads/writes to US East
Europe β reads/writes to Paris
Both get low latency by hitting their nearest Region
AWS keeps every Region in sync automatically β a change in one Region replicates to all others.
π Example
<meta charset="utf-8">
<!-- DynamoDB Global Tables: nearest-region read/write + automatic 2-way replication. Self-contained, drop into codeveda.dev. -->
<div class="infographic-globaltables">
<header class="gt-head">
<div class="gt-controls">
<button class="gt-btn gt-play" type="button" aria-label="Play">
<svg class="icon-play" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="6 3 20 12 6 21 6 3"/></svg>
<svg class="icon-pause" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="6" y="4" width="4" height="16" rx="1"/><rect x="14" y="4" width="4" height="16" rx="1"/></svg>
<span class="gt-btn-label">Play</span>
</button>
<button class="gt-btn gt-restart" type="button" aria-label="Restart">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 12a9 9 0 1 0 3-6.7"/><path d="M3 4v5h5"/></svg>
</button>
</div>
<p class="gt-status" aria-live="polite"> </p>
</header>
<div class="gt-canvas">
<svg viewBox="0 0 1000 480" xmlns="http://www.w3.org/2000/svg" class="gt-svg">
<defs>
<marker id="gt-arrow" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse">
<path d="M0,0 L10,5 L0,10 z" class="arrow-fill"/>
</marker>
</defs>
<!-- ===== NA users -> us-east-1 ===== -->
<g class="cf-node" data-part="na-users" tabindex="0" role="button" aria-label="North America users">
<g transform="translate(230,50)">
<g class="node-icon node-icon--ink" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none">
<path d="M-15,20 v-4 a9,9 0 0 1 9,-9 h5 a9,9 0 0 1 9,9 v4"/><circle cx="-3" cy="-5" r="7.5"/>
<path d="M11,20 v-4 a9,8.7 0 0 0 -6,-8.4"/><path d="M4,-11.8 a9,8.7 0 0 1 0,15.6"/>
</g>
</g>
</g>
<text x="230" y="20" text-anchor="middle" class="node-label node-label--caption">North America</text>
<line id="gt-line-na" x1="230" y1="80" x2="230" y2="148" class="connector-line solid" marker-end="url(#gt-arrow)"/>
<text x="248" y="105" class="edge-label edge-label--step">read/write</text>
<text x="248" y="122" class="edge-label edge-label--hit">low latency</text>
<!-- ===== EU users -> eu-west-3 ===== -->
<g class="cf-node" data-part="eu-users" tabindex="0" role="button" aria-label="Europe users">
<g transform="translate(770,50)">
<g class="node-icon node-icon--ink" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none">
<path d="M-15,20 v-4 a9,9 0 0 1 9,-9 h5 a9,9 0 0 1 9,9 v4"/><circle cx="-3" cy="-5" r="7.5"/>
<path d="M11,20 v-4 a9,8.7 0 0 0 -6,-8.4"/><path d="M4,-11.8 a9,8.7 0 0 1 0,15.6"/>
</g>
</g>
</g>
<text x="770" y="20" text-anchor="middle" class="node-label node-label--caption">Europe</text>
<line id="gt-line-eu" x1="770" y1="80" x2="770" y2="148" class="connector-line solid" marker-end="url(#gt-arrow)"/>
<text x="708" y="105" text-anchor="end" class="edge-label edge-label--step">read/write</text>
<text x="708" y="122" text-anchor="end" class="edge-label edge-label--hit">low latency</text>
<!-- motion paths -->
<path id="gt-path-na" d="M230,82 L230,146" fill="none" stroke="none"/>
<path id="gt-path-eu" d="M770,82 L770,146" fill="none" stroke="none"/>
<path id="gt-path-us2eu" d="M322,292 L678,292" fill="none" stroke="none"/>
<path id="gt-path-eu2us" d="M678,312 L322,312" fill="none" stroke="none"/>
<!-- ===== US region ===== -->
<g class="cf-node" data-part="us-region" tabindex="0" role="button" aria-label="N. Virginia us-east-1 region">
<rect x="40" y="155" width="420" height="285" rx="6" class="region-outer"/>
<g transform="translate(58,172)">
<g stroke="var(--accent)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none"><path d="M-6,15 s1,-1 4,-1 5,2 8,2 4,-1 4,-1v-12s-1,1-4,1-5,-2-8,-2-4,1-4,1z"/><line x1="-6" y1="22" x2="-6" y2="1"/></g>
</g>
<text x="80" y="181" class="node-label node-label--region">N. Virginia (us-east-1)</text>
<rect x="70" y="200" width="360" height="215" rx="4" class="region-inner"/>
<rect id="gt-ddb-icon-us" x="88" y="214" width="34" height="34" rx="7" class="ddb-tile"/>
<g transform="translate(105,231)">
<g stroke="var(--paper)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none">
<ellipse cx="0" cy="-8" rx="9.5" ry="3.6"/><path d="M-9.5,-8 V8 A9.5,3.6 0 0 0 9.5,8 V-8"/><path d="M-9.5,0 A9.5,3.6 0 0 0 9.5,0"/>
</g>
</g>
<text x="134" y="235" class="node-label node-label--sm">DynamoDB</text>
<g id="gt-table-us" class="table-icon" transform="translate(250,305)">
<g class="node-icon node-icon--purple" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" fill="none">
<rect x="-32" y="-32" width="64" height="64" rx="6"/>
<line x1="-32" y1="-13" x2="32" y2="-13"/>
<line x1="-32" y1="6" x2="32" y2="6"/>
<line x1="-6" y1="-32" x2="-6" y2="32"/>
</g>
</g>
<text x="250" y="368" text-anchor="middle" class="node-label node-label--table">Global Table</text>
</g>
<!-- ===== EU region ===== -->
<g class="cf-node" data-part="eu-region" tabindex="0" role="button" aria-label="Paris eu-west-3 region">
<rect x="540" y="155" width="420" height="285" rx="6" class="region-outer"/>
<g transform="translate(558,172)">
<g stroke="var(--accent)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none"><path d="M-6,15 s1,-1 4,-1 5,2 8,2 4,-1 4,-1v-12s-1,1-4,1-5,-2-8,-2-4,1-4,1z"/><line x1="-6" y1="22" x2="-6" y2="1"/></g>
</g>
<text x="580" y="181" class="node-label node-label--region">Paris (eu-west-3)</text>
<rect x="570" y="200" width="360" height="215" rx="4" class="region-inner"/>
<rect id="gt-ddb-icon-eu" x="588" y="214" width="34" height="34" rx="7" class="ddb-tile"/>
<g transform="translate(605,231)">
<g stroke="var(--paper)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none">
<ellipse cx="0" cy="-8" rx="9.5" ry="3.6"/><path d="M-9.5,-8 V8 A9.5,3.6 0 0 0 9.5,8 V-8"/><path d="M-9.5,0 A9.5,3.6 0 0 0 9.5,0"/>
</g>
</g>
<text x="634" y="235" class="node-label node-label--sm">DynamoDB</text>
<g id="gt-table-eu" class="table-icon" transform="translate(750,305)">
<g class="node-icon node-icon--purple" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round" fill="none">
<rect x="-32" y="-32" width="64" height="64" rx="6"/>
<line x1="-32" y1="-13" x2="32" y2="-13"/>
<line x1="-32" y1="6" x2="32" y2="6"/>
<line x1="-6" y1="-32" x2="-6" y2="32"/>
</g>
</g>
<text x="750" y="368" text-anchor="middle" class="node-label node-label--table">Global Table</text>
</g>
<!-- ===== replication arrows ===== -->
<line id="gt-line-us2eu" x1="322" y1="292" x2="674" y2="292" class="connector-line dashed" marker-end="url(#gt-arrow)"/>
<line id="gt-line-eu2us" x1="678" y1="312" x2="326" y2="312" class="connector-line dashed" marker-end="url(#gt-arrow)"/>
<text x="500" y="270" text-anchor="middle" class="edge-label edge-label--repl">2-way replication</text>
<text x="500" y="345" text-anchor="middle" class="edge-label edge-label--repl-sm">synced automatically</text>
<!-- badges -->
<g id="gt-badge-us" class="sync-badge" opacity="0">
<rect x="182" y="330" width="136" height="26" rx="13" class="sync-pill"/>
<text x="250" y="347" text-anchor="middle" class="sync-text">Write received</text>
</g>
<g id="gt-badge-eu" class="sync-badge" opacity="0">
<rect x="682" y="330" width="136" height="26" rx="13" class="sync-pill"/>
<text x="750" y="347" text-anchor="middle" class="sync-text">Write received</text>
</g>
<g id="gt-badge-repl-us2eu" class="repl-badge" opacity="0">
<rect x="418" y="278" width="164" height="24" rx="12" class="repl-pill"/>
<text x="500" y="294" text-anchor="middle" class="repl-text">Replicating to Paris</text>
</g>
<g id="gt-badge-repl-eu2us" class="repl-badge" opacity="0">
<rect x="386" y="320" width="228" height="24" rx="12" class="repl-pill"/>
<text x="500" y="336" text-anchor="middle" class="repl-text">Replicating to N. Virginia</text>
</g>
<!-- pulses -->
<circle r="7" class="cf-pulse" id="gt-pulse-na" opacity="0"><animateMotion id="gt-motion-na" dur="0.6s" begin="indefinite" fill="freeze" calcMode="linear"><mpath href="#gt-path-na"/></animateMotion></circle>
<circle r="7" class="cf-pulse" id="gt-pulse-eu" opacity="0"><animateMotion id="gt-motion-eu" dur="0.6s" begin="indefinite" fill="freeze" calcMode="linear"><mpath href="#gt-path-eu"/></animateMotion></circle>
<circle r="7" class="cf-pulse cf-pulse--repl" id="gt-pulse-us2eu" opacity="0"><animateMotion id="gt-motion-us2eu" dur="1.1s" begin="indefinite" fill="freeze" calcMode="linear"><mpath href="#gt-path-us2eu"/></animateMotion></circle>
<circle r="7" class="cf-pulse cf-pulse--repl" id="gt-pulse-eu2us" opacity="0"><animateMotion id="gt-motion-eu2us" dur="1.1s" begin="indefinite" fill="freeze" calcMode="linear"><mpath href="#gt-path-eu2us"/></animateMotion></circle>
</svg>
</div>
</div>
<style>
.infographic-globaltables {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--purple: #5b21d6;
--line: #ddd6c9;
--region-line:#8aa8d6;
--success: #1e8e5a;
--success-soft:#e2f4ea;
--display-font: 'Fraunces', Georgia, serif;
--body-font: 'Inter', -apple-system, sans-serif;
box-sizing: border-box;
max-width: 960px;
margin: 0 auto;
font-family: var(--body-font);
color: var(--ink);
background: var(--paper);
}
.infographic-globaltables[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1c1c22;
--accent: #5b8def;
--accent-soft:#202942;
--purple: #b18bff;
--line: #2c313d;
--region-line:#4c6b9c;
--success: #4caf7d;
--success-soft:#1c332a;
}
.infographic-globaltables * { box-sizing: border-box; }
.infographic-globaltables .gt-head { text-align: center; padding: 0.5rem clamp(1rem, 4vw, 2rem) 0.25rem; }
.infographic-globaltables .gt-controls { display: inline-flex; align-items: center; gap: 0.6rem; }
.infographic-globaltables .gt-btn {
display: inline-flex; align-items: center; gap: 0.45rem;
background: var(--accent); color: var(--paper); border: none; border-radius: 999px;
padding: 0.55rem 1.1rem; font-family: inherit; font-size: 0.88rem; font-weight: 600;
cursor: pointer; transition: opacity 0.15s;
}
.infographic-globaltables .gt-btn:hover { opacity: 0.88; }
.infographic-globaltables .gt-restart { background: var(--paper-alt); color: var(--ink); border: 1px solid var(--line); padding: 0.55rem 0.7rem; }
.infographic-globaltables .gt-btn svg { width: 15px; height: 15px; }
.infographic-globaltables .icon-pause { display: none; }
.infographic-globaltables .gt-play.is-playing .icon-play { display: none; }
.infographic-globaltables .gt-play.is-playing .icon-pause { display: inline-block; }
.infographic-globaltables .gt-status { margin: 0.6rem 0 0; font-size: 0.85rem; font-weight: 600; color: var(--ink-soft); min-height: 1.2em; }
.infographic-globaltables .gt-canvas { padding: 0 clamp(0.75rem, 3vw, 2rem) 1rem; }
.infographic-globaltables .gt-svg { width: 100%; height: auto; display: block; overflow: visible; }
.infographic-globaltables .connector-line { stroke: var(--ink-soft); stroke-width: 1.5; fill: none; }
.infographic-globaltables .connector-line.dashed { stroke: var(--region-line); stroke-dasharray: 5 4; }
.infographic-globaltables .arrow-fill { fill: var(--ink-soft); }
.infographic-globaltables .connector-line.is-flowing { stroke: var(--accent); stroke-width: 2.5; }
.infographic-globaltables .connector-line.dashed.is-flowing { stroke: var(--accent); stroke-width: 2.5; stroke-dasharray: 6 4; animation: gt-flow 0.6s linear infinite; }
@keyframes gt-flow { to { stroke-dashoffset: -20; } }
.infographic-globaltables .edge-label { font-size: 12.5px; fill: var(--ink-soft); font-family: var(--body-font); font-weight: 600; }
.infographic-globaltables .edge-label--step { fill: var(--ink-soft); }
.infographic-globaltables .edge-label--hit { fill: var(--success); font-weight: 600; }
.infographic-globaltables .edge-label--repl { fill: var(--ink); font-size: 14px; }
.infographic-globaltables .edge-label--repl-sm { fill: var(--ink-soft); font-weight: 500; font-size: 12px; }
.infographic-globaltables .cf-node { cursor: pointer; outline: none; }
.infographic-globaltables .gt-svg.has-active .cf-node:not(.is-active) { opacity: 0.5; }
.infographic-globaltables .region-outer { fill: none; stroke: var(--region-line); stroke-width: 1.5; stroke-dasharray: 3 3; }
.infographic-globaltables .region-inner { fill: var(--paper-alt); stroke: var(--ink-soft); stroke-width: 1.25; stroke-dasharray: 3 3; opacity: 0.6; }
.infographic-globaltables .cf-node.is-active .region-outer { stroke: var(--accent); stroke-width: 2; }
.infographic-globaltables .ddb-tile { fill: var(--purple); }
.infographic-globaltables .node-icon--ink { color: var(--ink); }
.infographic-globaltables .node-icon--purple { color: var(--purple); }
.infographic-globaltables .table-icon.is-active .node-icon--purple { color: var(--success); }
.infographic-globaltables .table-icon.is-active { filter: drop-shadow(0 0 0 transparent); }
.infographic-globaltables .table-icon.is-active rect:first-child { fill: var(--success-soft); }
.infographic-globaltables .sync-badge, .infographic-globaltables .repl-badge { transition: opacity 0.2s; }
.infographic-globaltables .sync-pill { fill: var(--success); }
.infographic-globaltables .sync-text { fill: var(--paper); font-family: var(--body-font); font-size: 12px; font-weight: 700; }
.infographic-globaltables .repl-pill { fill: var(--accent); }
.infographic-globaltables .repl-text { fill: var(--paper); font-family: var(--body-font); font-size: 11.5px; font-weight: 700; }
.infographic-globaltables .cf-pulse { fill: var(--accent); transition: opacity 0.2s; }
.infographic-globaltables .cf-pulse--repl { fill: var(--accent); }
.infographic-globaltables .node-label { font-family: var(--display-font); font-size: 15px; font-weight: 500; fill: var(--ink); }
.infographic-globaltables .node-label--caption { font-size: 13px; fill: var(--ink-soft); font-weight: 600; font-family: var(--body-font); }
.infographic-globaltables .node-label--region { font-size: 14px; font-weight: 700; fill: var(--accent); font-family: var(--body-font); }
.infographic-globaltables .node-label--sm { font-size: 13px; font-weight: 700; fill: var(--ink); font-family: var(--body-font); }
.infographic-globaltables .node-label--table { font-size: 16px; font-weight: 600; }
@media (max-width: 640px) {
.infographic-globaltables .edge-label { font-size: 11px; }
}
@media (prefers-reduced-motion: reduce) {
.infographic-globaltables * { transition-duration: 0.001ms !important; animation-duration: 0.001ms !important; }
}
</style>
<script>
(function () {
var wrapper = document.currentScript.closest('.infographic-globaltables')
|| document.querySelector('.infographic-globaltables');
var bodyAttr = document.body.getAttribute('data-darkmode');
var dark;
if (bodyAttr === 'true') { dark = true; }
else if (bodyAttr === 'false') { dark = false; }
else {
var match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
var reducedMotion = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
var svg = wrapper.querySelector('.gt-svg');
var nodes = wrapper.querySelectorAll('.cf-node');
var playBtn = wrapper.querySelector('.gt-play');
var playLabel = wrapper.querySelector('.gt-btn-label');
var restartBtn = wrapper.querySelector('.gt-restart');
var statusEl = wrapper.querySelector('.gt-status');
var usRegion = wrapper.querySelector('.cf-node[data-part="us-region"]');
var euRegion = wrapper.querySelector('.cf-node[data-part="eu-region"]');
var naUsers = wrapper.querySelector('.cf-node[data-part="na-users"]');
var euUsers = wrapper.querySelector('.cf-node[data-part="eu-users"]');
var tableUs = wrapper.querySelector('#gt-table-us');
var tableEu = wrapper.querySelector('#gt-table-eu');
var lineNa = wrapper.querySelector('#gt-line-na');
var lineEu = wrapper.querySelector('#gt-line-eu');
var lineUs2Eu = wrapper.querySelector('#gt-line-us2eu');
var lineEu2Us = wrapper.querySelector('#gt-line-eu2us');
var badgeUs = wrapper.querySelector('#gt-badge-us');
var badgeEu = wrapper.querySelector('#gt-badge-eu');
var badgeReplUs2Eu = wrapper.querySelector('#gt-badge-repl-us2eu');
var badgeReplEu2Us = wrapper.querySelector('#gt-badge-repl-eu2us');
var pulses = {
na: wrapper.querySelector('#gt-pulse-na'),
eu: wrapper.querySelector('#gt-pulse-eu'),
us2eu: wrapper.querySelector('#gt-pulse-us2eu'),
eu2us: wrapper.querySelector('#gt-pulse-eu2us')
};
var motions = {
na: wrapper.querySelector('#gt-motion-na'),
eu: wrapper.querySelector('#gt-motion-eu'),
us2eu: wrapper.querySelector('#gt-motion-us2eu'),
eu2us: wrapper.querySelector('#gt-motion-eu2us')
};
function setActive(parts) {
var list = parts ? (Array.isArray(parts) ? parts : [parts]) : [];
nodes.forEach(function (n) {
n.classList.toggle('is-active', list.indexOf(n.dataset.part) !== -1);
});
svg.classList.toggle('has-active', list.length > 0);
}
function fire(key, dur) {
motions[key].setAttribute('dur', (dur / 1000) + 's');
pulses[key].setAttribute('opacity', reducedMotion ? '0' : '1');
try { motions[key].beginElement(); } catch (e) {}
}
function hide(key) { pulses[key].setAttribute('opacity', '0'); }
function setStatus(text) { statusEl.textContent = text; }
function showBadge(el) { el.setAttribute('opacity', '1'); }
function hideBadge(el) { el.setAttribute('opacity', '0'); }
function toggleNode(node) {
var wasActive = node.classList.contains('is-active');
setActive(wasActive ? null : node.dataset.part);
}
nodes.forEach(function (node) {
node.addEventListener('click', function () { toggleNode(node); });
node.addEventListener('keydown', function (e) {
if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); toggleNode(node); }
});
node.setAttribute('tabindex', node.getAttribute('tabindex') || '0');
});
function resetVisuals() {
setActive(null);
lineNa.classList.remove('is-flowing');
lineEu.classList.remove('is-flowing');
lineUs2Eu.classList.remove('is-flowing');
lineEu2Us.classList.remove('is-flowing');
tableUs.classList.remove('is-active');
tableEu.classList.remove('is-active');
[badgeUs, badgeEu, badgeReplUs2Eu, badgeReplEu2Us].forEach(hideBadge);
Object.keys(pulses).forEach(hide);
}
var speed = reducedMotion ? 0.35 : 1;
var writeDur = 550 * speed;
var writeHold = 500 * speed;
var replDur = 1000 * speed;
var replHold = 550 * speed;
var betweenPhases = 500 * speed;
var gap = 150 * speed;
var timers = [];
var playing = false;
function after(ms, fn) { timers.push(setTimeout(fn, ms)); }
function clearTimers() { timers.forEach(clearTimeout); timers = []; }
function runCycle() {
if (!playing) return;
var t = 0;
// Phase 1: North America writes to us-east-1
after(t, function () {
setStatus('North America \u2192 reads/writes to US East');
setActive(['na-users', 'us-region']);
lineNa.classList.add('is-flowing');
fire('na', writeDur);
});
t += writeDur;
after(t, function () {
lineNa.classList.remove('is-flowing');
hide('na');
tableUs.classList.add('is-active');
showBadge(badgeUs);
});
t += writeHold;
after(t, function () { hideBadge(badgeUs); });
t += gap;
// Phase 2: replicate US -> EU
after(t, function () {
setStatus('Change in N. Virginia replicates to Paris automatically');
setActive(['us-region', 'eu-region']);
lineUs2Eu.classList.add('is-flowing');
showBadge(badgeReplUs2Eu);
fire('us2eu', replDur);
});
t += replDur;
after(t, function () {
lineUs2Eu.classList.remove('is-flowing');
hide('us2eu');
hideBadge(badgeReplUs2Eu);
tableEu.classList.add('is-active');
});
t += replHold;
after(t, function () {
tableUs.classList.remove('is-active');
tableEu.classList.remove('is-active');
setActive(null);
});
t += betweenPhases;
// Phase 3: Europe writes to eu-west-3
after(t, function () {
setStatus('Europe \u2192 reads/writes to Paris');
setActive(['eu-users', 'eu-region']);
lineEu.classList.add('is-flowing');
fire('eu', writeDur);
});
t += writeDur;
after(t, function () {
lineEu.classList.remove('is-flowing');
hide('eu');
tableEu.classList.add('is-active');
showBadge(badgeEu);
});
t += writeHold;
after(t, function () { hideBadge(badgeEu); });
t += gap;
// Phase 4: replicate EU -> US
after(t, function () {
setStatus('Change in Paris replicates to N. Virginia automatically');
setActive(['eu-region', 'us-region']);
lineEu2Us.classList.add('is-flowing');
showBadge(badgeReplEu2Us);
fire('eu2us', replDur);
});
t += replDur;
after(t, function () {
lineEu2Us.classList.remove('is-flowing');
hide('eu2us');
hideBadge(badgeReplEu2Us);
tableUs.classList.add('is-active');
});
t += replHold;
after(t, function () {
tableUs.classList.remove('is-active');
tableEu.classList.remove('is-active');
setActive(null);
setStatus('Both Regions stay in sync \u2014 everyone gets low latency');
});
t += betweenPhases + 700 * speed;
after(t, function () { if (playing) runCycle(); });
}
function play() {
if (playing) return;
playing = true;
playBtn.classList.add('is-playing');
playLabel.textContent = 'Pause';
runCycle();
}
function pause() {
playing = false;
clearTimers();
playBtn.classList.remove('is-playing');
playLabel.textContent = 'Play';
}
function restart() {
clearTimers();
resetVisuals();
setStatus('\u00A0');
if (playing) { runCycle(); }
}
playBtn.addEventListener('click', function () {
if (playing) { pause(); } else { play(); }
});
restartBtn.addEventListener('click', restart);
})();
</script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Fraunces:wght@500;600&family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">π Active-Active Replication
Every participating Region can both read and write β not just one primary Region accepting writes.
Example: a US update replicates to Paris; a later Paris write replicates back to US East. Every Region stays active, keeping global apps fast everywhere.
π Multiple Regions
Not limited to two β a table can replicate across up to 10 Regions, giving users worldwide a nearby copy while AWS keeps everything synchronized.
π Summary
Global Tables replicate across multiple AWS Regions
Users get low-latency access to the nearest copy
Data syncs automatically across all Regions
Every Region supports read and write β active-active replication
π― Exam takeaway: Global Tables = low-latency global access via active-active multi-Region replication