<!-- CANARY: REQ=REQ-DOCS-001; FEATURE="Docs"; ASPECT=Documentation; STATUS=TESTED; OWNER=docs; UPDATED=2026-01-15 -->
<h2 id="multi-datacenter-deployment-and-replication" class="position-relative d-flex align-items-center group">
<span>Multi-Datacenter Deployment and Replication</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="multi-datacenter-deployment-and-replication"
aria-haspopup="dialog"
aria-label="Share link: Multi-Datacenter Deployment and Replication">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h2><div id="headingShareModal" class="heading-share-modal" role="dialog" aria-modal="true" aria-labelledby="headingShareTitle" hidden>
<div class="hsm-dialog" role="document">
<div class="hsm-header">
<h2 id="headingShareTitle" class="h6 mb-0 fw-bold">Share this section</h2>
<button type="button" class="hsm-close" aria-label="Close">
<i class="fa-solid fa-xmark"></i>
</button>
</div>
<div class="hsm-body">
<label for="headingShareInput" class="form-label small text-muted mb-1 text-uppercase fw-bold" style="font-size: 0.7rem; letter-spacing: 0.5px;">Permalink</label>
<div class="input-group mb-4 hsm-url-group">
<input id="headingShareInput" type="text" class="form-control font-monospace" readonly aria-readonly="true" style="font-size: 0.85rem;" />
<button class="btn btn-primary hsm-copy" type="button" aria-label="Copy" title="Copy">
<i class="fa-duotone fa-clipboard" aria-hidden="true"></i>
</button>
</div>
<div class="small fw-bold mb-2 text-muted text-uppercase" style="font-size: 0.7rem; letter-spacing: 0.5px;">Share via</div>
<div class="hsm-share-grid">
<a id="share-twitter" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-twitter me-2"></i>Twitter
</a>
<a id="share-linkedin" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-linkedin me-2"></i>LinkedIn
</a>
<a id="share-facebook" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-facebook me-2"></i>Facebook
</a>
</div>
</div>
</div>
</div>
<style>
.heading-share-modal {
position: fixed;
inset: 0;
display: flex;
justify-content: center;
align-items: center;
background: rgba(0, 0, 0, 0.6);
z-index: 1050;
padding: 1rem;
backdrop-filter: blur(4px);
-webkit-backdrop-filter: blur(4px);
}
.heading-share-modal[hidden] { display: none !important; }
.hsm-dialog {
max-width: 420px;
width: 100%;
background: var(--bs-body-bg, #fff);
color: var(--bs-body-color, #212529);
border: 1px solid var(--bs-border-color, rgba(0,0,0,0.1));
border-radius: 1rem;
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
overflow: hidden;
animation: hsm-fade-in 0.2s ease-out;
}
@keyframes hsm-fade-in {
from { opacity: 0; transform: scale(0.95); }
to { opacity: 1; transform: scale(1); }
}
[data-bs-theme="dark"] .hsm-dialog {
background: #1e293b;
border-color: rgba(255,255,255,0.1);
color: #f8f9fa;
}
.hsm-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 1.5rem;
border-bottom: 1px solid var(--bs-border-color, rgba(0,0,0,0.1));
background: rgba(0,0,0,0.02);
}
[data-bs-theme="dark"] .hsm-header {
background: rgba(255,255,255,0.02);
border-color: rgba(255,255,255,0.1);
}
.hsm-close {
background: transparent;
border: none;
color: inherit;
opacity: 0.5;
padding: 0.25rem 0.5rem;
border-radius: 0.25rem;
font-size: 1.2rem;
line-height: 1;
transition: opacity 0.2s;
}
.hsm-close:hover {
opacity: 1;
}
.hsm-body {
padding: 1.5rem;
}
.hsm-url-group {
display: flex !important;
align-items: stretch;
}
.hsm-url-group .form-control {
flex: 1;
min-width: 0;
margin: 0;
background: var(--bs-secondary-bg, #f8f9fa);
border-color: var(--bs-border-color, #dee2e6);
border-top-right-radius: 0;
border-bottom-right-radius: 0;
height: 42px;
}
.hsm-url-group .btn {
flex: 0 0 auto;
margin: 0;
margin-left: -1px;
border-top-left-radius: 0;
border-bottom-left-radius: 0;
height: 42px;
display: flex;
align-items: center;
justify-content: center;
padding: 0 1.25rem;
z-index: 2;
}
[data-bs-theme="dark"] .hsm-url-group .form-control {
background: #0f172a;
border-color: #334155;
color: #e2e8f0;
}
.hsm-share-grid {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.hsm-share-grid .btn {
display: flex;
align-items: center;
justify-content: center;
font-size: 0.9rem;
padding: 0.6rem;
border-color: var(--bs-border-color);
width: 100%;
}
[data-bs-theme="dark"] .hsm-share-grid .btn {
color: #e2e8f0;
border-color: #475569;
}
[data-bs-theme="dark"] .hsm-share-grid .btn:hover {
background: #334155;
border-color: #cbd5e1;
}
</style>
<script>
(function(){
const modal = document.getElementById('headingShareModal');
if(!modal) return;
const input = modal.querySelector('#headingShareInput');
const copyBtn = modal.querySelector('.hsm-copy');
const twitter = modal.querySelector('#share-twitter');
const linkedin = modal.querySelector('#share-linkedin');
const facebook = modal.querySelector('#share-facebook');
const closeBtn = modal.querySelector('.hsm-close');
let lastFocus=null;
let trapBound=false;
function buildUrl(id){ return window.location.origin + window.location.pathname + '#' + id; }
function isOpen(){ return !modal.hasAttribute('hidden'); }
function hydrate(id){
const url=buildUrl(id);
input.value=url;
const enc=encodeURIComponent(url);
const text=encodeURIComponent(document.title);
if(twitter) twitter.href=`https://twitter.com/intent/tweet?url=${enc}&text=${text}`;
if(linkedin) linkedin.href=`https://www.linkedin.com/sharing/share-offsite/?url=${enc}`;
if(facebook) facebook.href=`https://www.facebook.com/sharer/sharer.php?u=${enc}`;
}
function openModal(id){
lastFocus=document.activeElement;
hydrate(id);
if(!isOpen()){
modal.removeAttribute('hidden');
}
requestAnimationFrame(()=>{ input.focus(); });
trapFocus();
}
function closeModal(){
if(!isOpen()) return;
modal.setAttribute('hidden','');
if(lastFocus && typeof lastFocus.focus==='function') lastFocus.focus();
}
function copyCurrent(){
try{ navigator.clipboard.writeText(input.value).then(()=>feedback(true),()=>fallback()); }
catch(e){ fallback(); }
}
function fallback(){ input.select(); try{ document.execCommand('copy'); feedback(true);}catch(e){ feedback(false);} }
function feedback(ok){ if(!copyBtn) return; const icon=copyBtn.querySelector('i'); if(!icon) return; const prev=copyBtn.getAttribute('data-prev')||icon.className; if(!copyBtn.getAttribute('data-prev')) copyBtn.setAttribute('data-prev',prev); icon.className= ok ? 'fa-duotone fa-clipboard-check':'fa-duotone fa-circle-exclamation'; setTimeout(()=>{ icon.className=prev; },1800); }
function handleShareClick(e){ e.preventDefault(); const btn=e.currentTarget; const id=btn.getAttribute('data-share-target'); if(id) openModal(id); }
function bindShareButtons(){
document.querySelectorAll('.h-share').forEach(btn=>{
if(!btn.dataset.hShareBound){ btn.addEventListener('click', handleShareClick); btn.dataset.hShareBound='1'; }
});
}
bindShareButtons();
if(document.readyState==='loading'){
document.addEventListener('DOMContentLoaded', bindShareButtons);
} else {
requestAnimationFrame(bindShareButtons);
}
document.addEventListener('click', function(e){
const shareBtn=e.target.closest && e.target.closest('.h-share');
if(shareBtn && !shareBtn.dataset.hShareBound){ handleShareClick.call(shareBtn, e); }
}, true);
document.addEventListener('click', e=>{
if(e.target===modal) closeModal();
if(e.target.closest && e.target.closest('.hsm-close')){ e.preventDefault(); closeModal(); }
if(copyBtn && (e.target===copyBtn || (e.target.closest && e.target.closest('.hsm-copy')))) { e.preventDefault(); copyCurrent(); }
});
document.addEventListener('keydown', e=>{ if(e.key==='Escape' && isOpen()) closeModal(); });
function trapFocus(){
if(trapBound) return;
trapBound=true;
modal.addEventListener('keydown', f=>{ if(f.key==='Tab' && isOpen()){ const focusable=[...modal.querySelectorAll('a[href],button,input,textarea,select,[tabindex]:not([tabindex="-1"])')].filter(el=>!el.hasAttribute('disabled')); if(!focusable.length) return; const first=focusable[0]; const last=focusable[focusable.length-1]; if(f.shiftKey && document.activeElement===first){ f.preventDefault(); last.focus(); } else if(!f.shiftKey && document.activeElement===last){ f.preventDefault(); first.focus(); } } });
}
if(closeBtn) closeBtn.addEventListener('click', e=>{ e.preventDefault(); closeModal(); });
})();
</script><p>Deploy Geode across multiple datacenters for high availability, disaster recovery, and global data distribution.</p>
<h3 id="overview" class="position-relative d-flex align-items-center group">
<span>Overview</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="overview"
aria-haspopup="dialog"
aria-label="Share link: Overview">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Geode supports several multi-datacenter deployment patterns:</p>
<ol>
<li><strong>Federation</strong> - Distributed query coordination across shards</li>
<li><strong>CDC Replication</strong> - Change Data Capture for asynchronous replication</li>
<li><strong>Active-Active</strong> - Multiple writeable datacenters</li>
<li><strong>Active-Passive</strong> - Primary datacenter with standby replicas</li>
<li><strong>Disaster Recovery</strong> - Backup datacenter for failover</li>
</ol>
<h4 id="key-features" class="position-relative d-flex align-items-center group">
<span>Key Features</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="key-features"
aria-haspopup="dialog"
aria-label="Share link: Key Features">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ul>
<li><strong>High Availability (HA)</strong>: Automatic failover and redundancy</li>
<li><strong>Geographic Distribution</strong>: Deploy close to users for low latency</li>
<li><strong>Disaster Recovery</strong>: Survive datacenter failures</li>
<li><strong>Horizontal Scaling</strong>: Distribute workload across regions</li>
<li><strong>Consistency Models</strong>: Eventual, quorum, or strong consistency</li>
</ul>
<h3 id="architecture-patterns" class="position-relative d-flex align-items-center group">
<span>Architecture Patterns</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="architecture-patterns"
aria-haspopup="dialog"
aria-label="Share link: Architecture Patterns">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="pattern-1-federation-query-distribution" class="position-relative d-flex align-items-center group">
<span>Pattern 1: Federation (Query Distribution)</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="pattern-1-federation-query-distribution"
aria-haspopup="dialog"
aria-label="Share link: Pattern 1: Federation (Query Distribution)">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Use Case</strong>: Horizontal scaling within or across datacenters</p>
<p>Federation distributes queries across multiple shards without data replication. Each shard contains a subset of data.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">┌─────────────────────────────────────────────────┐
</span></span><span class="line"><span class="cl">│ Query Coordinator │
</span></span><span class="line"><span class="cl">│ (Distributed Query Engine) │
</span></span><span class="line"><span class="cl">└──────┬──────────┬──────────┬──────────┬─────────┘
</span></span><span class="line"><span class="cl"> │ │ │ │
</span></span><span class="line"><span class="cl"> ┌──▼──┐ ┌──▼──┐ ┌──▼──┐ ┌──▼──┐
</span></span><span class="line"><span class="cl"> │Shard│ │Shard│ │Shard│ │Shard│
</span></span><span class="line"><span class="cl"> │ 1 │ │ 2 │ │ 3 │ │ 4 │
</span></span><span class="line"><span class="cl"> └─────┘ └─────┘ └─────┘ └─────┘
</span></span><span class="line"><span class="cl"> DC-East DC-East DC-West DC-West
</span></span></code></pre></div><p><strong>Characteristics</strong>:</p>
<ul>
<li>Data partitioned across shards</li>
<li>Queries distributed and results merged</li>
<li>No replication (each record exists once)</li>
<li>Best for read-heavy workloads</li>
</ul>
<p><strong>Configuration</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">federation</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">coordinator</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">shards</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">id</span><span class="p">:</span><span class="w"> </span><span class="s1">'shard1-east'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">endpoint</span><span class="p">:</span><span class="w"> </span><span class="s1">'shard1.us-east.internal:3141'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">weight</span><span class="p">:</span><span class="w"> </span><span class="m">1.0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">datacenter</span><span class="p">:</span><span class="w"> </span><span class="s1">'us-east-1'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">id</span><span class="p">:</span><span class="w"> </span><span class="s1">'shard2-east'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">endpoint</span><span class="p">:</span><span class="w"> </span><span class="s1">'shard2.us-east.internal:3141'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">weight</span><span class="p">:</span><span class="w"> </span><span class="m">1.0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">datacenter</span><span class="p">:</span><span class="w"> </span><span class="s1">'us-east-1'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">id</span><span class="p">:</span><span class="w"> </span><span class="s1">'shard3-west'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">endpoint</span><span class="p">:</span><span class="w"> </span><span class="s1">'shard3.us-west.internal:3141'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">weight</span><span class="p">:</span><span class="w"> </span><span class="m">1.0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">datacenter</span><span class="p">:</span><span class="w"> </span><span class="s1">'us-west-2'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">id</span><span class="p">:</span><span class="w"> </span><span class="s1">'shard4-west'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">endpoint</span><span class="p">:</span><span class="w"> </span><span class="s1">'shard4.us-west.internal:3141'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">weight</span><span class="p">:</span><span class="w"> </span><span class="m">1.0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">datacenter</span><span class="p">:</span><span class="w"> </span><span class="s1">'us-west-2'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">query</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">timeout</span><span class="p">:</span><span class="w"> </span><span class="s1">'30s'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max_concurrent</span><span class="p">:</span><span class="w"> </span><span class="m">100</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">retry_attempts</span><span class="p">:</span><span class="w"> </span><span class="m">3</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">retry_delay</span><span class="p">:</span><span class="w"> </span><span class="s1">'1s'</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="pattern-2-active-passive-disaster-recovery" class="position-relative d-flex align-items-center group">
<span>Pattern 2: Active-Passive (Disaster Recovery)</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="pattern-2-active-passive-disaster-recovery"
aria-haspopup="dialog"
aria-label="Share link: Pattern 2: Active-Passive (Disaster Recovery)">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Use Case</strong>: Production + disaster recovery standby</p>
<p>Primary datacenter handles all traffic. Secondary datacenter replicates via CDC for failover.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">┌──────────────────────┐ ┌──────────────────────┐
</span></span><span class="line"><span class="cl">│ Primary DC │ │ Secondary DC │
</span></span><span class="line"><span class="cl">│ (Active) │ │ (Passive/Standby) │
</span></span><span class="line"><span class="cl">│ │ │ │
</span></span><span class="line"><span class="cl">│ ┌────────────┐ │ CDC │ ┌────────────┐ │
</span></span><span class="line"><span class="cl">│ │ Geode ├──────┼─────────►│ │ Geode │ │
</span></span><span class="line"><span class="cl">│ │ Primary │ │ Stream │ │ Replica │ │
</span></span><span class="line"><span class="cl">│ └────────────┘ │ │ └────────────┘ │
</span></span><span class="line"><span class="cl">│ │ │ │
</span></span><span class="line"><span class="cl">│ Writes + Reads │ │ Reads Only │
</span></span><span class="line"><span class="cl">└──────────────────────┘ └──────────────────────┘
</span></span><span class="line"><span class="cl"> us-east-1 us-west-2
</span></span></code></pre></div><p><strong>Characteristics</strong>:</p>
<ul>
<li>One writable primary datacenter</li>
<li>Asynchronous replication to standby</li>
<li>Manual or automatic failover</li>
<li>Best for disaster recovery</li>
</ul>
<p><strong>Configuration</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Primary datacenter (us-east-1)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">cdc</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sinks</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="s1">'kafka'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">config</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">brokers</span><span class="p">:</span><span class="w"> </span><span class="s1">'kafka.us-east.internal:9092'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">topic</span><span class="p">:</span><span class="w"> </span><span class="s1">'geode-changes'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">compression</span><span class="p">:</span><span class="w"> </span><span class="s1">'zstd'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">acks</span><span class="p">:</span><span class="w"> </span><span class="s1">'all'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">retention_period_ms</span><span class="p">:</span><span class="w"> </span><span class="m">604800000</span><span class="w"> </span><span class="c"># 7 days</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">batch_size</span><span class="p">:</span><span class="w"> </span><span class="m">1000</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">flush_interval_ms</span><span class="p">:</span><span class="w"> </span><span class="m">1000</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># Secondary datacenter (us-west-2) - CDC consumer</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">cdc_consumer</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">source</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="s1">'kafka'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">brokers</span><span class="p">:</span><span class="w"> </span><span class="s1">'kafka.us-east.internal:9092'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">topic</span><span class="p">:</span><span class="w"> </span><span class="s1">'geode-changes'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">group_id</span><span class="p">:</span><span class="w"> </span><span class="s1">'geode-replica-us-west'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">apply_mode</span><span class="p">:</span><span class="w"> </span><span class="s1">'async'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">batch_size</span><span class="p">:</span><span class="w"> </span><span class="m">1000</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">conflict_resolution</span><span class="p">:</span><span class="w"> </span><span class="s1">'source_wins'</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="pattern-3-active-active-multi-master" class="position-relative d-flex align-items-center group">
<span>Pattern 3: Active-Active (Multi-Master)</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="pattern-3-active-active-multi-master"
aria-haspopup="dialog"
aria-label="Share link: Pattern 3: Active-Active (Multi-Master)">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Use Case</strong>: Multiple writable datacenters for global distribution</p>
<p>Both datacenters accept writes. Bidirectional CDC keeps them synchronized.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">┌──────────────────────┐ ┌──────────────────────┐
</span></span><span class="line"><span class="cl">│ Datacenter 1 │◄────────►│ Datacenter 2 │
</span></span><span class="line"><span class="cl">│ (Active) │ CDC │ (Active) │
</span></span><span class="line"><span class="cl">│ │ Sync │ │
</span></span><span class="line"><span class="cl">│ ┌────────────┐ │ │ ┌────────────┐ │
</span></span><span class="line"><span class="cl">│ │ Geode │◄─────┼─────────►│ │ Geode │ │
</span></span><span class="line"><span class="cl">│ │ Primary │ │ │ │ Primary │ │
</span></span><span class="line"><span class="cl">│ └────────────┘ │ │ └────────────┘ │
</span></span><span class="line"><span class="cl">│ │ │ │
</span></span><span class="line"><span class="cl">│ Writes + Reads │ │ Writes + Reads │
</span></span><span class="line"><span class="cl">└──────────────────────┘ └──────────────────────┘
</span></span><span class="line"><span class="cl"> us-east-1 eu-west-1
</span></span></code></pre></div><p><strong>Characteristics</strong>:</p>
<ul>
<li>Both datacenters accept writes</li>
<li>Bidirectional asynchronous replication</li>
<li>Conflict resolution required</li>
<li>Best for global low-latency writes</li>
</ul>
<p><strong>Configuration</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Datacenter 1 (us-east-1)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">cdc</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sinks</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="s1">'kafka'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">config</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">brokers</span><span class="p">:</span><span class="w"> </span><span class="s1">'kafka-global.internal:9092'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">topic</span><span class="p">:</span><span class="w"> </span><span class="s1">'geode-changes-dc1'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">cdc_consumer</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">source</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="s1">'kafka'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">brokers</span><span class="p">:</span><span class="w"> </span><span class="s1">'kafka-global.internal:9092'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">topic</span><span class="p">:</span><span class="w"> </span><span class="s1">'geode-changes-dc2'</span><span class="w"> </span><span class="c"># Consume from DC2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">conflict_resolution</span><span class="p">:</span><span class="w"> </span><span class="s1">'last_write_wins'</span><span class="w"> </span><span class="c"># or 'custom'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># Datacenter 2 (eu-west-1)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">cdc</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sinks</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="s1">'kafka'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">config</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">brokers</span><span class="p">:</span><span class="w"> </span><span class="s1">'kafka-global.internal:9092'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">topic</span><span class="p">:</span><span class="w"> </span><span class="s1">'geode-changes-dc2'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">cdc_consumer</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">source</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="s1">'kafka'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">brokers</span><span class="p">:</span><span class="w"> </span><span class="s1">'kafka-global.internal:9092'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">topic</span><span class="p">:</span><span class="w"> </span><span class="s1">'geode-changes-dc1'</span><span class="w"> </span><span class="c"># Consume from DC1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">conflict_resolution</span><span class="p">:</span><span class="w"> </span><span class="s1">'last_write_wins'</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="pattern-4-hybrid-federation--replication" class="position-relative d-flex align-items-center group">
<span>Pattern 4: Hybrid (Federation + Replication)</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="pattern-4-hybrid-federation--replication"
aria-haspopup="dialog"
aria-label="Share link: Pattern 4: Hybrid (Federation &#43; Replication)">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Use Case</strong>: Regional sharding with local replication</p>
<p>Combine federation for query distribution with replication for high availability.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Region: US-EAST Region: US-WEST
</span></span><span class="line"><span class="cl">┌──────────────────┐ ┌──────────────────┐
</span></span><span class="line"><span class="cl">│ Coordinator │◄─────────────►│ Coordinator │
</span></span><span class="line"><span class="cl">│ │ Federation │ │
</span></span><span class="line"><span class="cl">│ ┌────┐ ┌────┐ │ │ ┌────┐ ┌────┐ │
</span></span><span class="line"><span class="cl">│ │Shd1│ │Rep1│ │ │ │Shd2│ │Rep2│ │
</span></span><span class="line"><span class="cl">│ └────┘ └────┘ │ │ └────┘ └────┘ │
</span></span><span class="line"><span class="cl">│ ▲ ▲ │ │ ▲ ▲ │
</span></span><span class="line"><span class="cl">│ └───CDC─┘ │ │ └───CDC─┘ │
</span></span><span class="line"><span class="cl">└──────────────────┘ └──────────────────┘
</span></span></code></pre></div><p><strong>Characteristics</strong>:</p>
<ul>
<li>Data partitioned by region (sharding)</li>
<li>Local replication for HA within region</li>
<li>Cross-region federation for global queries</li>
<li>Best for global scale + high availability</li>
</ul>
<h3 id="deployment-guide" class="position-relative d-flex align-items-center group">
<span>Deployment Guide</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="deployment-guide"
aria-haspopup="dialog"
aria-label="Share link: Deployment Guide">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="prerequisites" class="position-relative d-flex align-items-center group">
<span>Prerequisites</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="prerequisites"
aria-haspopup="dialog"
aria-label="Share link: Prerequisites">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ul>
<li><strong>Network</strong>: Cross-datacenter connectivity (VPN or dedicated links)</li>
<li><strong>Latency</strong>: <100ms between datacenters (recommended)</li>
<li><strong>Bandwidth</strong>: 100 Mbps+ for CDC replication</li>
<li><strong>Storage</strong>: Sufficient capacity for replication lag</li>
<li><strong>Monitoring</strong>: Cross-datacenter monitoring setup</li>
</ul>
<h4 id="step-1-network-setup" class="position-relative d-flex align-items-center group">
<span>Step 1: Network Setup</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="step-1-network-setup"
aria-haspopup="dialog"
aria-label="Share link: Step 1: Network Setup">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4>
<h5 id="configure-cross-datacenter-connectivity" class="position-relative d-flex align-items-center group">
<span>Configure Cross-Datacenter Connectivity</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="configure-cross-datacenter-connectivity"
aria-haspopup="dialog"
aria-label="Share link: Configure Cross-Datacenter Connectivity">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h5><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Example: WireGuard VPN between datacenters</span>
</span></span><span class="line"><span class="cl"><span class="c1"># On DC1 (us-east-1)</span>
</span></span><span class="line"><span class="cl">wg genkey <span class="p">|</span> tee dc1-private.key <span class="p">|</span> wg pubkey > dc1-public.key
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># /etc/wireguard/wg0.conf</span>
</span></span><span class="line"><span class="cl"><span class="o">[</span>Interface<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">Address</span> <span class="o">=</span> 10.0.1.1/24
</span></span><span class="line"><span class="cl"><span class="nv">PrivateKey</span> <span class="o">=</span> <dc1-private-key>
</span></span><span class="line"><span class="cl"><span class="nv">ListenPort</span> <span class="o">=</span> <span class="m">51820</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>Peer<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">PublicKey</span> <span class="o">=</span> <dc2-public-key>
</span></span><span class="line"><span class="cl"><span class="nv">Endpoint</span> <span class="o">=</span> dc2-public-ip:51820
</span></span><span class="line"><span class="cl"><span class="nv">AllowedIPs</span> <span class="o">=</span> 10.0.2.0/24
</span></span><span class="line"><span class="cl"><span class="nv">PersistentKeepalive</span> <span class="o">=</span> <span class="m">25</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Start WireGuard</span>
</span></span><span class="line"><span class="cl">wg-quick up wg0
</span></span></code></pre></div>
<h5 id="verify-connectivity" class="position-relative d-flex align-items-center group">
<span>Verify Connectivity</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="verify-connectivity"
aria-haspopup="dialog"
aria-label="Share link: Verify Connectivity">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h5><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># From DC1, ping DC2</span>
</span></span><span class="line"><span class="cl">ping -c <span class="m">5</span> 10.0.2.1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Test latency</span>
</span></span><span class="line"><span class="cl">ping -c <span class="m">100</span> 10.0.2.1 <span class="p">|</span> tail -1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Test bandwidth</span>
</span></span><span class="line"><span class="cl">iperf3 -s <span class="c1"># On DC2</span>
</span></span><span class="line"><span class="cl">iperf3 -c 10.0.2.1 -t <span class="m">30</span> <span class="c1"># On DC1</span>
</span></span></code></pre></div>
<h4 id="step-2-deploy-federation-query-distribution" class="position-relative d-flex align-items-center group">
<span>Step 2: Deploy Federation (Query Distribution)</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="step-2-deploy-federation-query-distribution"
aria-haspopup="dialog"
aria-label="Share link: Step 2: Deploy Federation (Query Distribution)">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4>
<h5 id="deploy-coordinator-node" class="position-relative d-flex align-items-center group">
<span>Deploy Coordinator Node</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="deploy-coordinator-node"
aria-haspopup="dialog"
aria-label="Share link: Deploy Coordinator Node">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h5><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># On coordinator node (DC1)</span>
</span></span><span class="line"><span class="cl">cat > /etc/geode/geode.yaml <span class="s"><<EOF
</span></span></span><span class="line"><span class="cl"><span class="s">server:
</span></span></span><span class="line"><span class="cl"><span class="s"> listen: '0.0.0.0:3141'
</span></span></span><span class="line"><span class="cl"><span class="s"> data_dir: '/var/lib/geode/coordinator'
</span></span></span><span class="line"><span class="cl"><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s">federation:
</span></span></span><span class="line"><span class="cl"><span class="s"> enabled: true
</span></span></span><span class="line"><span class="cl"><span class="s"> coordinator: true
</span></span></span><span class="line"><span class="cl"><span class="s"> shards:
</span></span></span><span class="line"><span class="cl"><span class="s"> - id: 'shard1-dc1'
</span></span></span><span class="line"><span class="cl"><span class="s"> endpoint: 'geode-shard1.dc1.internal:3141'
</span></span></span><span class="line"><span class="cl"><span class="s"> weight: 1.0
</span></span></span><span class="line"><span class="cl"><span class="s"> datacenter: 'us-east-1'
</span></span></span><span class="line"><span class="cl"><span class="s"> - id: 'shard2-dc1'
</span></span></span><span class="line"><span class="cl"><span class="s"> endpoint: 'geode-shard2.dc1.internal:3141'
</span></span></span><span class="line"><span class="cl"><span class="s"> weight: 1.0
</span></span></span><span class="line"><span class="cl"><span class="s"> datacenter: 'us-east-1'
</span></span></span><span class="line"><span class="cl"><span class="s"> - id: 'shard1-dc2'
</span></span></span><span class="line"><span class="cl"><span class="s"> endpoint: 'geode-shard1.dc2.internal:3141'
</span></span></span><span class="line"><span class="cl"><span class="s"> weight: 1.0
</span></span></span><span class="line"><span class="cl"><span class="s"> datacenter: 'us-west-2'
</span></span></span><span class="line"><span class="cl"><span class="s"> - id: 'shard2-dc2'
</span></span></span><span class="line"><span class="cl"><span class="s"> endpoint: 'geode-shard2.dc2.internal:3141'
</span></span></span><span class="line"><span class="cl"><span class="s"> weight: 1.0
</span></span></span><span class="line"><span class="cl"><span class="s"> datacenter: 'us-west-2'
</span></span></span><span class="line"><span class="cl"><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s"> query:
</span></span></span><span class="line"><span class="cl"><span class="s"> timeout: '30s'
</span></span></span><span class="line"><span class="cl"><span class="s"> max_concurrent: 100
</span></span></span><span class="line"><span class="cl"><span class="s"> retry_attempts: 3
</span></span></span><span class="line"><span class="cl"><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s">logging:
</span></span></span><span class="line"><span class="cl"><span class="s"> level: 'info'
</span></span></span><span class="line"><span class="cl"><span class="s"> format: 'json'
</span></span></span><span class="line"><span class="cl"><span class="s">EOF</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Start coordinator</span>
</span></span><span class="line"><span class="cl">geode serve --config /etc/geode/geode.yaml
</span></span></code></pre></div>
<h5 id="deploy-shard-nodes" class="position-relative d-flex align-items-center group">
<span>Deploy Shard Nodes</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="deploy-shard-nodes"
aria-haspopup="dialog"
aria-label="Share link: Deploy Shard Nodes">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h5><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># On each shard node</span>
</span></span><span class="line"><span class="cl">cat > /etc/geode/geode.yaml <span class="s"><<EOF
</span></span></span><span class="line"><span class="cl"><span class="s">server:
</span></span></span><span class="line"><span class="cl"><span class="s"> listen: '0.0.0.0:3141'
</span></span></span><span class="line"><span class="cl"><span class="s"> data_dir: '/var/lib/geode/shard1'
</span></span></span><span class="line"><span class="cl"><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s">federation:
</span></span></span><span class="line"><span class="cl"><span class="s"> enabled: true
</span></span></span><span class="line"><span class="cl"><span class="s"> coordinator: false # This is a shard, not coordinator
</span></span></span><span class="line"><span class="cl"><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s">storage:
</span></span></span><span class="line"><span class="cl"><span class="s"> page_cache_size: '8GB'
</span></span></span><span class="line"><span class="cl"><span class="s"> wal_sync_interval: '100ms'
</span></span></span><span class="line"><span class="cl"><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s">logging:
</span></span></span><span class="line"><span class="cl"><span class="s"> level: 'info'
</span></span></span><span class="line"><span class="cl"><span class="s"> format: 'json'
</span></span></span><span class="line"><span class="cl"><span class="s">EOF</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Start shard</span>
</span></span><span class="line"><span class="cl">geode serve --config /etc/geode/geode.yaml
</span></span></code></pre></div>
<h5 id="verify-federation" class="position-relative d-flex align-items-center group">
<span>Verify Federation</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="verify-federation"
aria-haspopup="dialog"
aria-label="Share link: Verify Federation">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h5><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Connect</span><span class="w"> </span><span class="py">to</span><span class="w"> </span><span class="py">coordinator</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">geode</span><span class="w"> </span><span class="py">shell</span><span class="w"> </span><span class="err">--</span><span class="py">server</span><span class="w"> </span><span class="py">geode</span><span class="err">-</span><span class="py">coordinator</span><span class="err">.</span><span class="py">dc1</span><span class="err">.</span><span class="py">internal</span><span class="p">:</span><span class="nc">3141</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Run</span><span class="w"> </span><span class="py">distributed</span><span class="w"> </span><span class="kd">query</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">n</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">n</span><span class="err">.</span><span class="py">age</span><span class="w"> </span><span class="err">></span><span class="w"> </span><span class="py">30</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">count</span><span class="p">(</span><span class="py">n</span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Check</span><span class="w"> </span><span class="kd">query</span><span class="w"> </span><span class="nc">distribution</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">EXPLAIN</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">n</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">n</span><span class="err">.</span><span class="py">age</span><span class="w"> </span><span class="err">></span><span class="w"> </span><span class="py">30</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">count</span><span class="p">(</span><span class="py">n</span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Should</span><span class="w"> </span><span class="py">show</span><span class="w"> </span><span class="py">shards</span><span class="w"> </span><span class="py">involved</span><span class="w"> </span><span class="py">in</span><span class="w"> </span><span class="kd">query</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="step-3-deploy-cdc-replication" class="position-relative d-flex align-items-center group">
<span>Step 3: Deploy CDC Replication</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="step-3-deploy-cdc-replication"
aria-haspopup="dialog"
aria-label="Share link: Step 3: Deploy CDC Replication">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4>
<h5 id="setup-kafka-for-cdc-stream" class="position-relative d-flex align-items-center group">
<span>Setup Kafka for CDC Stream</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="setup-kafka-for-cdc-stream"
aria-haspopup="dialog"
aria-label="Share link: Setup Kafka for CDC Stream">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h5><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Deploy Kafka cluster (cross-datacenter accessible)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># kafka-dc1.internal, kafka-dc2.internal</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Create CDC topic</span>
</span></span><span class="line"><span class="cl">kafka-topics --create <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --bootstrap-server kafka-dc1.internal:9092 <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --topic geode-cdc-events <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --partitions <span class="m">12</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --replication-factor <span class="m">3</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --config retention.ms<span class="o">=</span><span class="m">604800000</span> <span class="c1"># 7 days</span>
</span></span></code></pre></div>
<h5 id="configure-primary-for-cdc" class="position-relative d-flex align-items-center group">
<span>Configure Primary for CDC</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="configure-primary-for-cdc"
aria-haspopup="dialog"
aria-label="Share link: Configure Primary for CDC">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h5><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Primary datacenter (us-east-1)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># /etc/geode/geode.yaml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">cdc</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sinks</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="s1">'kafka'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">config</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">brokers</span><span class="p">:</span><span class="w"> </span><span class="s1">'kafka-dc1.internal:9092,kafka-dc2.internal:9092'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">topic</span><span class="p">:</span><span class="w"> </span><span class="s1">'geode-cdc-events'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">compression</span><span class="p">:</span><span class="w"> </span><span class="s1">'zstd'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">batch_size</span><span class="p">:</span><span class="w"> </span><span class="m">16384</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">linger_ms</span><span class="p">:</span><span class="w"> </span><span class="m">100</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">acks</span><span class="p">:</span><span class="w"> </span><span class="s1">'all'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">retention_period_ms</span><span class="p">:</span><span class="w"> </span><span class="m">604800000</span><span class="w"> </span><span class="c"># 7 days</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">batch_size</span><span class="p">:</span><span class="w"> </span><span class="m">1000</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">flush_interval_ms</span><span class="p">:</span><span class="w"> </span><span class="m">1000</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Adaptive batching for high throughput</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">adaptive_flush</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">min_batch_size</span><span class="p">:</span><span class="w"> </span><span class="m">256</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max_batch_size</span><span class="p">:</span><span class="w"> </span><span class="m">32000</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Backpressure management</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">adaptive_backpressure</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">backpressure_high_pct</span><span class="p">:</span><span class="w"> </span><span class="m">0.85</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">backpressure_low_pct</span><span class="p">:</span><span class="w"> </span><span class="m">0.30</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Filtering (optional)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">include_before_image</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">include_metadata</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span></code></pre></div>
<h5 id="configure-replica-for-cdc-consumption" class="position-relative d-flex align-items-center group">
<span>Configure Replica for CDC Consumption</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="configure-replica-for-cdc-consumption"
aria-haspopup="dialog"
aria-label="Share link: Configure Replica for CDC Consumption">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h5><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Replica datacenter (us-west-2)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># /etc/geode/geode.yaml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">cdc_consumer</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">source</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="s1">'kafka'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">brokers</span><span class="p">:</span><span class="w"> </span><span class="s1">'kafka-dc1.internal:9092,kafka-dc2.internal:9092'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">topic</span><span class="p">:</span><span class="w"> </span><span class="s1">'geode-cdc-events'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">group_id</span><span class="p">:</span><span class="w"> </span><span class="s1">'geode-replica-dc2'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">auto_offset_reset</span><span class="p">:</span><span class="w"> </span><span class="s1">'earliest'</span><span class="w"> </span><span class="c"># or 'latest' for new data only</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">apply_mode</span><span class="p">:</span><span class="w"> </span><span class="s1">'async'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">batch_size</span><span class="p">:</span><span class="w"> </span><span class="m">1000</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">workers</span><span class="p">:</span><span class="w"> </span><span class="m">4</span><span class="w"> </span><span class="c"># Parallel consumers</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Conflict resolution</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">conflict_resolution</span><span class="p">:</span><span class="w"> </span><span class="s1">'source_wins'</span><span class="w"> </span><span class="c"># or 'timestamp', 'custom'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Resume on failure</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">checkpoint_interval_ms</span><span class="p">:</span><span class="w"> </span><span class="m">5000</span><span class="w">
</span></span></span></code></pre></div>
<h5 id="verify-cdc-replication" class="position-relative d-flex align-items-center group">
<span>Verify CDC Replication</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="verify-cdc-replication"
aria-haspopup="dialog"
aria-label="Share link: Verify CDC Replication">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h5><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># On primary</span>
</span></span><span class="line"><span class="cl">geode shell --server geode-primary.dc1.internal:3141
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Create</span><span class="w"> </span><span class="py">test</span><span class="w"> </span><span class="py">data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">GRAPH</span><span class="w"> </span><span class="py">TestReplication</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">USE</span><span class="w"> </span><span class="py">TestReplication</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(:</span><span class="nc">Person</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="s">"Alice"</span><span class="p">,</span><span class="w"> </span><span class="nc">timestamp</span><span class="p">:</span><span class="w"> </span><span class="nc">timestamp</span><span class="p">()})</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Wait 5-10 seconds for replication</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># On replica</span>
</span></span><span class="line"><span class="cl">geode shell --server geode-replica.dc2.internal:3141
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">USE</span><span class="w"> </span><span class="py">TestReplication</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Person</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="s">"Alice"</span><span class="p">})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">timestamp</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Should</span><span class="w"> </span><span class="py">return</span><span class="w"> </span><span class="py">Alice</span><span class="w"> </span><span class="py">with</span><span class="w"> </span><span class="py">timestamp</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="step-4-configure-high-availability" class="position-relative d-flex align-items-center group">
<span>Step 4: Configure High Availability</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="step-4-configure-high-availability"
aria-haspopup="dialog"
aria-label="Share link: Step 4: Configure High Availability">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4>
<h5 id="enable-cluster-heartbeats" class="position-relative d-flex align-items-center group">
<span>Enable Cluster Heartbeats</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="enable-cluster-heartbeats"
aria-haspopup="dialog"
aria-label="Share link: Enable Cluster Heartbeats">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h5><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># On all nodes</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">cluster</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">heartbeat_interval</span><span class="p">:</span><span class="w"> </span><span class="s1">'5s'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">election_timeout</span><span class="p">:</span><span class="w"> </span><span class="s1">'30s'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">replication_factor</span><span class="p">:</span><span class="w"> </span><span class="m">3</span><span class="w"> </span><span class="c"># Number of replicas</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Consistency settings</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">consistency_level</span><span class="p">:</span><span class="w"> </span><span class="s1">'quorum'</span><span class="w"> </span><span class="c"># or 'eventual', 'strong'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">read_preference</span><span class="p">:</span><span class="w"> </span><span class="s1">'primary_preferred'</span><span class="w"> </span><span class="c"># or 'primary', 'secondary', 'nearest'</span><span class="w">
</span></span></span></code></pre></div>
<h5 id="deploy-load-balancer" class="position-relative d-flex align-items-center group">
<span>Deploy Load Balancer</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="deploy-load-balancer"
aria-haspopup="dialog"
aria-label="Share link: Deploy Load Balancer">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h5><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nginx" data-lang="nginx"><span class="line"><span class="cl"><span class="c1"># HAProxy configuration for Geode
</span></span></span><span class="line"><span class="cl"><span class="c1"># /etc/haproxy/haproxy.cfg
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="k">global</span>
</span></span><span class="line"><span class="cl"> <span class="s">daemon</span>
</span></span><span class="line"><span class="cl"> <span class="s">maxconn</span> <span class="mi">10000</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="s">defaults</span>
</span></span><span class="line"><span class="cl"> <span class="s">mode</span> <span class="s">tcp</span>
</span></span><span class="line"><span class="cl"> <span class="s">timeout</span> <span class="s">connect</span> <span class="s">5000ms</span>
</span></span><span class="line"><span class="cl"> <span class="s">timeout</span> <span class="s">client</span> <span class="s">50000ms</span>
</span></span><span class="line"><span class="cl"> <span class="s">timeout</span> <span class="s">server</span> <span class="s">50000ms</span>
</span></span><span class="line"><span class="cl"> <span class="s">balance</span> <span class="s">roundrobin</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="s">frontend</span> <span class="s">geode_frontend</span>
</span></span><span class="line"><span class="cl"> <span class="s">bind</span> <span class="s">*:3141</span>
</span></span><span class="line"><span class="cl"> <span class="s">default_backend</span> <span class="s">geode_coordinators</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="s">backend</span> <span class="s">geode_coordinators</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Health checks
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="s">option</span> <span class="s">tcp-check</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Coordinators in DC1
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="s">server</span> <span class="s">coord1-dc1</span> <span class="n">geode-coord1.dc1.internal</span><span class="p">:</span><span class="mi">3141</span> <span class="s">check</span> <span class="s">inter</span> <span class="mi">2000</span> <span class="s">rise</span> <span class="mi">2</span> <span class="s">fall</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl"> <span class="s">server</span> <span class="s">coord2-dc1</span> <span class="n">geode-coord2.dc1.internal</span><span class="p">:</span><span class="mi">3141</span> <span class="s">check</span> <span class="s">inter</span> <span class="mi">2000</span> <span class="s">rise</span> <span class="mi">2</span> <span class="s">fall</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Coordinators in DC2 (backup)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="s">server</span> <span class="s">coord1-dc2</span> <span class="n">geode-coord1.dc2.internal</span><span class="p">:</span><span class="mi">3141</span> <span class="s">check</span> <span class="s">inter</span> <span class="mi">2000</span> <span class="s">rise</span> <span class="mi">2</span> <span class="s">fall</span> <span class="mi">3</span> <span class="s">backup</span>
</span></span></code></pre></div>
<h5 id="test-failover" class="position-relative d-flex align-items-center group">
<span>Test Failover</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="test-failover"
aria-haspopup="dialog"
aria-label="Share link: Test Failover">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h5><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Simulate primary coordinator failure</span>
</span></span><span class="line"><span class="cl">ssh geode-coord1.dc1.internal <span class="s2">"systemctl stop geode"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Verify failover (should connect to coord2)</span>
</span></span><span class="line"><span class="cl">geode shell --server geode-lb.internal:3141
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">RETURN</span><span class="w"> </span><span class="py">1</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">health_check</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Should</span><span class="w"> </span><span class="py">succeed</span><span class="w"> </span><span class="py">via</span><span class="w"> </span><span class="py">backup</span><span class="w"> </span><span class="py">coordinator</span><span class="w">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Restore primary</span>
</span></span><span class="line"><span class="cl">ssh geode-coord1.dc1.internal <span class="s2">"systemctl start geode"</span>
</span></span></code></pre></div>
<h3 id="disaster-recovery-procedures" class="position-relative d-flex align-items-center group">
<span>Disaster Recovery Procedures</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="disaster-recovery-procedures"
aria-haspopup="dialog"
aria-label="Share link: Disaster Recovery Procedures">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="scenario-1-primary-datacenter-failure" class="position-relative d-flex align-items-center group">
<span>Scenario 1: Primary Datacenter Failure</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="scenario-1-primary-datacenter-failure"
aria-haspopup="dialog"
aria-label="Share link: Scenario 1: Primary Datacenter Failure">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4>
<h5 id="automatic-failover-active-passive" class="position-relative d-flex align-items-center group">
<span>Automatic Failover (Active-Passive)</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="automatic-failover-active-passive"
aria-haspopup="dialog"
aria-label="Share link: Automatic Failover (Active-Passive)">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h5><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 1. Detect primary failure</span>
</span></span><span class="line"><span class="cl">curl -f https://geode-primary.dc1.internal:3141/health <span class="o">||</span> <span class="nb">echo</span> <span class="s2">"Primary down"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. Promote replica to primary</span>
</span></span><span class="line"><span class="cl">ssh geode-replica.dc2.internal
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Stop CDC consumer</span>
</span></span><span class="line"><span class="cl">systemctl stop geode-cdc-consumer
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Reconfigure as primary</span>
</span></span><span class="line"><span class="cl">cat > /etc/geode/geode.yaml <span class="s"><<EOF
</span></span></span><span class="line"><span class="cl"><span class="s">server:
</span></span></span><span class="line"><span class="cl"><span class="s"> listen: '0.0.0.0:3141'
</span></span></span><span class="line"><span class="cl"><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s"># Enable CDC producer (was consumer)
</span></span></span><span class="line"><span class="cl"><span class="s">cdc:
</span></span></span><span class="line"><span class="cl"><span class="s"> enabled: true
</span></span></span><span class="line"><span class="cl"><span class="s"> sinks:
</span></span></span><span class="line"><span class="cl"><span class="s"> - type: 'kafka'
</span></span></span><span class="line"><span class="cl"><span class="s"> config:
</span></span></span><span class="line"><span class="cl"><span class="s"> brokers: 'kafka-dc2.internal:9092'
</span></span></span><span class="line"><span class="cl"><span class="s"> topic: 'geode-cdc-events'
</span></span></span><span class="line"><span class="cl"><span class="s">EOF</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Restart as primary</span>
</span></span><span class="line"><span class="cl">systemctl restart geode
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3. Update DNS/load balancer</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Point geode.example.com -> geode-replica.dc2.internal</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 4. Verify new primary</span>
</span></span><span class="line"><span class="cl">geode shell --server geode-replica.dc2.internal:3141
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">CREATE</span><span class="w"> </span><span class="p">(:</span><span class="nc">FailoverTest</span><span class="w"> </span><span class="p">{</span><span class="py">timestamp</span><span class="p">:</span><span class="w"> </span><span class="nc">timestamp</span><span class="p">()})</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Should</span><span class="w"> </span><span class="py">succeed</span><span class="w">
</span></span></span></code></pre></div>
<h5 id="restore-primary-datacenter" class="position-relative d-flex align-items-center group">
<span>Restore Primary Datacenter</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="restore-primary-datacenter"
aria-haspopup="dialog"
aria-label="Share link: Restore Primary Datacenter">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h5><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 1. Restore primary infrastructure</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Network, power, hardware, etc.</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. Restore from backup</span>
</span></span><span class="line"><span class="cl">geode restore <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --source s3://geode-backups/latest <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --data-dir /var/lib/geode
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3. Catch up with CDC</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Reconfigure as replica (reverse roles)</span>
</span></span><span class="line"><span class="cl">cat > /etc/geode/geode.yaml <span class="s"><<EOF
</span></span></span><span class="line"><span class="cl"><span class="s">cdc_consumer:
</span></span></span><span class="line"><span class="cl"><span class="s"> enabled: true
</span></span></span><span class="line"><span class="cl"><span class="s"> source:
</span></span></span><span class="line"><span class="cl"><span class="s"> type: 'kafka'
</span></span></span><span class="line"><span class="cl"><span class="s"> topic: 'geode-cdc-events'
</span></span></span><span class="line"><span class="cl"><span class="s"> auto_offset_reset: 'latest' # Only new changes
</span></span></span><span class="line"><span class="cl"><span class="s">EOF</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">systemctl start geode
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 4. Verify replication lag</span>
</span></span><span class="line"><span class="cl">geode-admin replication-status
</span></span><span class="line"><span class="cl"><span class="c1"># Wait for lag: 0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 5. Failback (reverse roles again)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Promote DC1 to primary, demote DC2 to replica</span>
</span></span></code></pre></div>
<h4 id="scenario-2-network-partition-split-brain" class="position-relative d-flex align-items-center group">
<span>Scenario 2: Network Partition (Split Brain)</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="scenario-2-network-partition-split-brain"
aria-haspopup="dialog"
aria-label="Share link: Scenario 2: Network Partition (Split Brain)">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4>
<h5 id="detection" class="position-relative d-flex align-items-center group">
<span>Detection</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="detection"
aria-haspopup="dialog"
aria-label="Share link: Detection">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h5><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Monitor cluster health</span>
</span></span><span class="line"><span class="cl">geode-admin cluster-status
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Output if partitioned:</span>
</span></span><span class="line"><span class="cl"><span class="c1"># DC1: 2 nodes connected</span>
</span></span><span class="line"><span class="cl"><span class="c1"># DC2: 2 nodes connected</span>
</span></span><span class="line"><span class="cl"><span class="c1"># ERROR: Split brain detected (quorum lost)</span>
</span></span></code></pre></div>
<h5 id="resolution" class="position-relative d-flex align-items-center group">
<span>Resolution</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="resolution"
aria-haspopup="dialog"
aria-label="Share link: Resolution">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h5><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 1. Identify which partition has quorum</span>
</span></span><span class="line"><span class="cl"><span class="c1"># DC1: 2 nodes, DC2: 2 nodes (tie)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. Manual intervention: choose primary</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Shut down DC2 nodes temporarily</span>
</span></span><span class="line"><span class="cl">ssh geode-coord1.dc2.internal <span class="s2">"systemctl stop geode"</span>
</span></span><span class="line"><span class="cl">ssh geode-coord2.dc2.internal <span class="s2">"systemctl stop geode"</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3. DC1 forms quorum</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Verify writes work</span>
</span></span><span class="line"><span class="cl">geode shell --server geode-coord1.dc1.internal:3141
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">CREATE</span><span class="w"> </span><span class="p">(:</span><span class="nc">SplitBrainTest</span><span class="w"> </span><span class="p">{</span><span class="py">resolved</span><span class="p">:</span><span class="w"> </span><span class="nc">true</span><span class="p">})</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 4. Restore DC2 as replicas</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Restore data from DC1</span>
</span></span><span class="line"><span class="cl">geode-admin sync-replica <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --source geode-coord1.dc1.internal:3141 <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --target geode-coord1.dc2.internal:3141
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Start DC2 nodes</span>
</span></span><span class="line"><span class="cl">systemctl start geode
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 5. Re-enable replication</span>
</span></span><span class="line"><span class="cl">systemctl start geode-cdc-consumer
</span></span></code></pre></div>
<h3 id="monitoring-and-observability" class="position-relative d-flex align-items-center group">
<span>Monitoring and Observability</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="monitoring-and-observability"
aria-haspopup="dialog"
aria-label="Share link: Monitoring and Observability">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="key-metrics" class="position-relative d-flex align-items-center group">
<span>Key Metrics</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="key-metrics"
aria-haspopup="dialog"
aria-label="Share link: Key Metrics">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4>
<h5 id="replication-lag" class="position-relative d-flex align-items-center group">
<span>Replication Lag</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="replication-lag"
aria-haspopup="dialog"
aria-label="Share link: Replication Lag">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h5><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-promql" data-lang="promql"><span class="line"><span class="cl"><span class="c1"># Prometheus query</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nv">geode_cdc_replication_lag_seconds</span><span class="p">{</span><span class="nl">datacenter</span><span class="o">=</span><span class="p">"</span><span class="s">dc2</span><span class="p">"}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1"># Alert if lag > 60 seconds</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nv">geode_cdc_replication_lag_seconds</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="mi">60</span><span class="w">
</span></span></span></code></pre></div>
<h5 id="cdc-throughput" class="position-relative d-flex align-items-center group">
<span>CDC Throughput</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="cdc-throughput"
aria-haspopup="dialog"
aria-label="Share link: CDC Throughput">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h5><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-promql" data-lang="promql"><span class="line"><span class="cl"><span class="c1"># Events per second</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">rate</span><span class="o">(</span><span class="nv">geode_cdc_events_total</span><span class="p">[</span><span class="s">5m</span><span class="p">]</span><span class="o">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1"># Bytes per second</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">rate</span><span class="o">(</span><span class="nv">geode_cdc_bytes_total</span><span class="p">[</span><span class="s">5m</span><span class="p">]</span><span class="o">)</span><span class="w">
</span></span></span></code></pre></div>
<h5 id="federation-query-performance" class="position-relative d-flex align-items-center group">
<span>Federation Query Performance</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="federation-query-performance"
aria-haspopup="dialog"
aria-label="Share link: Federation Query Performance">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h5><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-promql" data-lang="promql"><span class="line"><span class="cl"><span class="c1"># Cross-datacenter query latency</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">histogram_quantile</span><span class="o">(</span><span class="mf">0.99</span><span class="p">,</span><span class="w"> </span><span class="nv">geode_federation_query_duration_seconds</span><span class="o">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1"># Shard availability</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nv">geode_federation_shard_available</span><span class="p">{</span><span class="nl">shard</span><span class="o">=</span><span class="p">"</span><span class="s">shard1-dc2</span><span class="p">"}</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="monitoring-dashboard" class="position-relative d-flex align-items-center group">
<span>Monitoring Dashboard</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="monitoring-dashboard"
aria-haspopup="dialog"
aria-label="Share link: Monitoring Dashboard">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Import Grafana dashboard</span>
</span></span><span class="line"><span class="cl">curl -X POST <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> -H <span class="s2">"Content-Type: application/json"</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> -d @multi-dc-dashboard.json <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> http://grafana.internal:3000/api/dashboards/db
</span></span></code></pre></div><p><strong>Dashboard Panels</strong>:</p>
<ul>
<li>Replication lag per datacenter</li>
<li>CDC event throughput</li>
<li>Cross-datacenter network latency</li>
<li>Shard health status</li>
<li>Conflict resolution rate</li>
<li>Query distribution across shards</li>
</ul>
<h4 id="alerting-rules" class="position-relative d-flex align-items-center group">
<span>Alerting Rules</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="alerting-rules"
aria-haspopup="dialog"
aria-label="Share link: Alerting Rules">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Prometheus alerts</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">groups</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">multi_datacenter</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">rules</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">alert</span><span class="p">:</span><span class="w"> </span><span class="l">HighReplicationLag</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">expr</span><span class="p">:</span><span class="w"> </span><span class="l">geode_cdc_replication_lag_seconds > 60</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">for</span><span class="p">:</span><span class="w"> </span><span class="l">5m</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">summary</span><span class="p">:</span><span class="w"> </span><span class="s2">"CDC replication lag exceeds 60s"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">alert</span><span class="p">:</span><span class="w"> </span><span class="l">DatacenterUnavailable</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">expr</span><span class="p">:</span><span class="w"> </span><span class="l">up{job="geode", datacenter="dc2"} == 0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">for</span><span class="p">:</span><span class="w"> </span><span class="l">2m</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">summary</span><span class="p">:</span><span class="w"> </span><span class="s2">"Datacenter DC2 is unavailable"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">alert</span><span class="p">:</span><span class="w"> </span><span class="l">SplitBrainDetected</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">expr</span><span class="p">:</span><span class="w"> </span><span class="p">|</span><span class="sd">
</span></span></span><span class="line"><span class="cl"><span class="sd"> count(geode_cluster_quorum{status="active"}) > 1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">summary</span><span class="p">:</span><span class="w"> </span><span class="s2">"Multiple quorums detected (split brain)"</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="conflict-resolution" class="position-relative d-flex align-items-center group">
<span>Conflict Resolution</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="conflict-resolution"
aria-haspopup="dialog"
aria-label="Share link: Conflict Resolution">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="conflict-types" class="position-relative d-flex align-items-center group">
<span>Conflict Types</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="conflict-types"
aria-haspopup="dialog"
aria-label="Share link: Conflict Types">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ol>
<li><strong>Write-Write Conflicts</strong>: Same entity modified in both datacenters</li>
<li><strong>Delete-Write Conflicts</strong>: Entity deleted in DC1, modified in DC2</li>
<li><strong>Schema Conflicts</strong>: Schema changes in both datacenters</li>
</ol>
<h4 id="resolution-strategies" class="position-relative d-flex align-items-center group">
<span>Resolution Strategies</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="resolution-strategies"
aria-haspopup="dialog"
aria-label="Share link: Resolution Strategies">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4>
<h5 id="last-write-wins-timestamp-based" class="position-relative d-flex align-items-center group">
<span>Last-Write-Wins (Timestamp-Based)</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="last-write-wins-timestamp-based"
aria-haspopup="dialog"
aria-label="Share link: Last-Write-Wins (Timestamp-Based)">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h5><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">cdc_consumer</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">conflict_resolution</span><span class="p">:</span><span class="w"> </span><span class="s1">'last_write_wins'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">timestamp_field</span><span class="p">:</span><span class="w"> </span><span class="s1">'_last_modified'</span><span class="w">
</span></span></span></code></pre></div><p><strong>Pros</strong>: Simple, deterministic
<strong>Cons</strong>: May lose updates</p>
<h5 id="source-wins-primary-takes-precedence" class="position-relative d-flex align-items-center group">
<span>Source-Wins (Primary Takes Precedence)</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="source-wins-primary-takes-precedence"
aria-haspopup="dialog"
aria-label="Share link: Source-Wins (Primary Takes Precedence)">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h5><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">cdc_consumer</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">conflict_resolution</span><span class="p">:</span><span class="w"> </span><span class="s1">'source_wins'</span><span class="w">
</span></span></span></code></pre></div><p><strong>Pros</strong>: Consistent with primary
<strong>Cons</strong>: Replica writes lost</p>
<h5 id="custom-resolution" class="position-relative d-flex align-items-center group">
<span>Custom Resolution</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="custom-resolution"
aria-haspopup="dialog"
aria-label="Share link: Custom Resolution">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h5><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-zig" data-lang="zig"><span class="line"><span class="cl"><span class="c1">// Custom conflict handler
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kr">pub</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">resolveConflict</span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">local</span><span class="o">:</span><span class="w"> </span><span class="n">ChangeEvent</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">remote</span><span class="o">:</span><span class="w"> </span><span class="n">ChangeEvent</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="w"> </span><span class="o">!</span><span class="n">ResolvedEvent</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c1">// Business logic
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">local</span><span class="p">.</span><span class="n">entity_type</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="p">.</span><span class="n">node</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c1">// Merge properties
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">mergeNodeProperties</span><span class="p">(</span><span class="n">local</span><span class="p">,</span><span class="w"> </span><span class="n">remote</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c1">// Default: last-write-wins
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">local</span><span class="p">.</span><span class="n">timestamp</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="n">remote</span><span class="p">.</span><span class="n">timestamp</span><span class="p">)</span><span class="w"> </span><span class="n">local</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="n">remote</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">cdc_consumer</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">conflict_resolution</span><span class="p">:</span><span class="w"> </span><span class="s1">'custom'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">conflict_handler</span><span class="p">:</span><span class="w"> </span><span class="s1">'/etc/geode/conflict_handler.so'</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="performance-tuning" class="position-relative d-flex align-items-center group">
<span>Performance Tuning</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="performance-tuning"
aria-haspopup="dialog"
aria-label="Share link: Performance Tuning">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="network-optimization" class="position-relative d-flex align-items-center group">
<span>Network Optimization</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="network-optimization"
aria-haspopup="dialog"
aria-label="Share link: Network Optimization">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Increase batch sizes for cross-datacenter CDC</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">cdc</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">batch_size</span><span class="p">:</span><span class="w"> </span><span class="m">32000</span><span class="w"> </span><span class="c"># Up from 1000</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">flush_interval_ms</span><span class="p">:</span><span class="w"> </span><span class="m">5000</span><span class="w"> </span><span class="c"># Buffer longer</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c"># Enable compression</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sinks</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="s1">'kafka'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">config</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">compression</span><span class="p">:</span><span class="w"> </span><span class="s1">'zstd'</span><span class="w"> </span><span class="c"># Best compression ratio</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="replication-throughput" class="position-relative d-flex align-items-center group">
<span>Replication Throughput</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="replication-throughput"
aria-haspopup="dialog"
aria-label="Share link: Replication Throughput">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Parallel CDC consumers</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">cdc_consumer</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">workers</span><span class="p">:</span><span class="w"> </span><span class="m">8</span><span class="w"> </span><span class="c"># Match number of cores</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">batch_size</span><span class="p">:</span><span class="w"> </span><span class="m">5000</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">prefetch_count</span><span class="p">:</span><span class="w"> </span><span class="m">50</span><span class="w"> </span><span class="c"># Kafka prefetch</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="query-routing" class="position-relative d-flex align-items-center group">
<span>Query Routing</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="query-routing"
aria-haspopup="dialog"
aria-label="Share link: Query Routing">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Prefer local shards for reads</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">federation</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">query</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">locality_preference</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> </span><span class="c"># Route to nearest datacenter</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">shard_affinity</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> </span><span class="c"># Sticky routing for related queries</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="best-practices" class="position-relative d-flex align-items-center group">
<span>Best Practices</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="best-practices"
aria-haspopup="dialog"
aria-label="Share link: Best Practices">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="dos" class="position-relative d-flex align-items-center group">
<span>Do&rsquo;s</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="dos"
aria-haspopup="dialog"
aria-label="Share link: Dos">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>✅ <strong>Monitor replication lag</strong> - Alert if lag exceeds threshold
✅ <strong>Test failover regularly</strong> - Quarterly DR drills
✅ <strong>Use compression</strong> - Reduce cross-datacenter bandwidth
✅ <strong>Implement idempotency</strong> - Handle duplicate events
✅ <strong>Plan for split-brain</strong> - Clear resolution procedures
✅ <strong>Document runbooks</strong> - Failover and recovery steps
✅ <strong>Version CDC schema</strong> - Handle schema evolution</p>
<h4 id="donts" class="position-relative d-flex align-items-center group">
<span>Don&rsquo;ts</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="donts"
aria-haspopup="dialog"
aria-label="Share link: Donts">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>❌ <strong>Don’t ignore conflicts</strong> - Silent data loss
❌ <strong>Don’t skip backups</strong> - CDC isn’t backup
❌ <strong>Don’t overload network</strong> - Saturating cross-DC links
❌ <strong>Don’t assume synchronous</strong> - CDC is async
❌ <strong>Don’t forget monitoring</strong> - Blind to issues
❌ <strong>Don’t hard-code IPs</strong> - Use service discovery
❌ <strong>Don’t skip testing</strong> - Fail during real disaster</p>
<h3 id="troubleshooting" class="position-relative d-flex align-items-center group">
<span>Troubleshooting</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="troubleshooting"
aria-haspopup="dialog"
aria-label="Share link: Troubleshooting">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="replication-lag-increasing" class="position-relative d-flex align-items-center group">
<span>Replication Lag Increasing</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="replication-lag-increasing"
aria-haspopup="dialog"
aria-label="Share link: Replication Lag Increasing">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Symptoms</strong>: <code>geode_cdc_replication_lag_seconds</code> growing</p>
<p><strong>Causes</strong>:</p>
<ol>
<li>Network congestion</li>
<li>Kafka throughput insufficient</li>
<li>Consumer too slow</li>
</ol>
<p><strong>Solutions</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Check network bandwidth</span>
</span></span><span class="line"><span class="cl">iperf3 -c kafka.dc2.internal
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Increase Kafka partitions</span>
</span></span><span class="line"><span class="cl">kafka-topics --alter --partitions <span class="m">24</span> --topic geode-cdc-events
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Add CDC consumer workers</span>
</span></span><span class="line"><span class="cl"><span class="c1"># In geode.yaml</span>
</span></span><span class="line"><span class="cl">cdc_consumer:
</span></span><span class="line"><span class="cl"> workers: <span class="m">16</span> <span class="c1"># Increase parallelism</span>
</span></span></code></pre></div>
<h4 id="split-brain-scenario" class="position-relative d-flex align-items-center group">
<span>Split Brain Scenario</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="split-brain-scenario"
aria-haspopup="dialog"
aria-label="Share link: Split Brain Scenario">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Symptoms</strong>: Multiple nodes claim to be primary</p>
<p><strong>Solutions</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 1. Identify nodes in each partition</span>
</span></span><span class="line"><span class="cl">geode-admin cluster-status --all
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. Choose primary partition (larger or DC1)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 3. Shut down minority partition</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> node in dc2-nodes<span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl"> ssh <span class="nv">$node</span> <span class="s2">"systemctl stop geode"</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 4. Resync minority from primary</span>
</span></span><span class="line"><span class="cl">geode-admin resync-cluster <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --source dc1 <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --targets dc2-nodes
</span></span></code></pre></div>
<h4 id="cdc-events-lost" class="position-relative d-flex align-items-center group">
<span>CDC Events Lost</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="cdc-events-lost"
aria-haspopup="dialog"
aria-label="Share link: CDC Events Lost">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Symptoms</strong>: Missing data in replica</p>
<p><strong>Causes</strong>:</p>
<ol>
<li>Kafka retention expired</li>
<li>Consumer offset reset</li>
<li>Network partition during write</li>
</ol>
<p><strong>Solutions</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Check Kafka retention</span>
</span></span><span class="line"><span class="cl">kafka-topics --describe --topic geode-cdc-events
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Restore from backup + replay CDC</span>
</span></span><span class="line"><span class="cl">geode restore --source s3://backups/last-full
</span></span><span class="line"><span class="cl">geode-admin replay-cdc <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --from-timestamp <span class="s2">"2024-01-20T00:00:00Z"</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --to-timestamp <span class="s2">"now"</span>
</span></span></code></pre></div>
<h3 id="next-steps" class="position-relative d-flex align-items-center group">
<span>Next Steps</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="next-steps"
aria-haspopup="dialog"
aria-label="Share link: Next Steps">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><ul>
<li><a
href="/docs/guides/backup-automation/"
>Backup Automation</a>
- Automated backup strategies</li>
<li><a
href="/docs/configuration/server-configuration/"
>Server Configuration</a>
- Federation config details</li>
<li><a
href="/docs/architecture/distributed-architecture/"
>Distributed Architecture</a>
- Architecture deep dive</li>
<li><a
href="/docs/ops/observability/"
>Monitoring</a>
- Comprehensive monitoring setup</li>
<li><a
href="/docs/performance/"
>Performance Tuning</a>
- Optimize multi-DC performance</li>
</ul>
<h3 id="reference" class="position-relative d-flex align-items-center group">
<span>Reference</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="reference"
aria-haspopup="dialog"
aria-label="Share link: Reference">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="configuration-files" class="position-relative d-flex align-items-center group">
<span>Configuration Files</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="configuration-files"
aria-haspopup="dialog"
aria-label="Share link: Configuration Files">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ul>
<li><a
href="https://geodedb.com/docs/guides/multi-datacenter/#step-2-deploy-federation-query-distribution"
>Federation Config</a>
</li>
<li><a
href="https://geodedb.com/docs/guides/multi-datacenter/#step-3-deploy-cdc-replication"
>CDC Config</a>
</li>
<li><a
href="https://geodedb.com/docs/guides/multi-datacenter/#step-4-configure-high-availability"
>HA Config</a>
</li>
</ul>
<h4 id="cli-commands" class="position-relative d-flex align-items-center group">
<span>CLI Commands</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="cli-commands"
aria-haspopup="dialog"
aria-label="Share link: CLI Commands">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Cluster management</span>
</span></span><span class="line"><span class="cl">geode-admin cluster-status
</span></span><span class="line"><span class="cl">geode-admin shard-add --id shard3 --endpoint host:3141
</span></span><span class="line"><span class="cl">geode-admin shard-remove --id shard1
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># CDC management</span>
</span></span><span class="line"><span class="cl">geode-admin cdc-status
</span></span><span class="line"><span class="cl">geode-admin cdc-reset-offset --topic geode-cdc-events
</span></span><span class="line"><span class="cl">geode-admin replay-cdc --from-timestamp <ts>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Replication management</span>
</span></span><span class="line"><span class="cl">geode-admin replication-status
</span></span><span class="line"><span class="cl">geode-admin resync-replica --source <primary> --target <replica>
</span></span><span class="line"><span class="cl">geode-admin promote-replica --node <node-id>
</span></span></code></pre></div><hr>
<p><strong>License</strong>: Apache License 2.0
<strong>Copyright</strong>: 2024-2025 CodePros
<strong>Last Updated</strong>: January 2026</p>
Multi-Datacenter Deployment and Replication
Complete guide for deploying Geode across multiple datacenters with high availability, disaster recovery, and cross-region replication patterns