<!-- 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">&#39;shard1-east&#39;</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">&#39;shard1.us-east.internal:3141&#39;</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">&#39;us-east-1&#39;</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">&#39;shard2-east&#39;</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">&#39;shard2.us-east.internal:3141&#39;</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">&#39;us-east-1&#39;</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">&#39;shard3-west&#39;</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">&#39;shard3.us-west.internal:3141&#39;</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">&#39;us-west-2&#39;</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">&#39;shard4-west&#39;</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">&#39;shard4.us-west.internal:3141&#39;</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">&#39;us-west-2&#39;</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">&#39;30s&#39;</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">&#39;1s&#39;</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">&#39;kafka&#39;</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">&#39;kafka.us-east.internal:9092&#39;</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">&#39;geode-changes&#39;</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">&#39;zstd&#39;</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">&#39;all&#39;</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">&#39;kafka&#39;</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">&#39;kafka.us-east.internal:9092&#39;</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">&#39;geode-changes&#39;</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">&#39;geode-replica-us-west&#39;</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">&#39;async&#39;</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">&#39;source_wins&#39;</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">&#39;kafka&#39;</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">&#39;kafka-global.internal:9092&#39;</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">&#39;geode-changes-dc1&#39;</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">&#39;kafka&#39;</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">&#39;kafka-global.internal:9092&#39;</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">&#39;geode-changes-dc2&#39;</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">&#39;last_write_wins&#39;</span><span class="w"> </span><span class="c"># or &#39;custom&#39;</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">&#39;kafka&#39;</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">&#39;kafka-global.internal:9092&#39;</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">&#39;geode-changes-dc2&#39;</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">&#39;kafka&#39;</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">&#39;kafka-global.internal:9092&#39;</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">&#39;geode-changes-dc1&#39;</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">&#39;last_write_wins&#39;</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 &#43; 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 &amp;#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>: &lt;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 &gt; 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> &lt;dc1-private-key&gt; </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> &lt;dc2-public-key&gt; </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 &gt; /etc/geode/geode.yaml <span class="s">&lt;&lt;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: &#39;0.0.0.0:3141&#39; </span></span></span><span class="line"><span class="cl"><span class="s"> data_dir: &#39;/var/lib/geode/coordinator&#39; </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: &#39;shard1-dc1&#39; </span></span></span><span class="line"><span class="cl"><span class="s"> endpoint: &#39;geode-shard1.dc1.internal:3141&#39; </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: &#39;us-east-1&#39; </span></span></span><span class="line"><span class="cl"><span class="s"> - id: &#39;shard2-dc1&#39; </span></span></span><span class="line"><span class="cl"><span class="s"> endpoint: &#39;geode-shard2.dc1.internal:3141&#39; </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: &#39;us-east-1&#39; </span></span></span><span class="line"><span class="cl"><span class="s"> - id: &#39;shard1-dc2&#39; </span></span></span><span class="line"><span class="cl"><span class="s"> endpoint: &#39;geode-shard1.dc2.internal:3141&#39; </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: &#39;us-west-2&#39; </span></span></span><span class="line"><span class="cl"><span class="s"> - id: &#39;shard2-dc2&#39; </span></span></span><span class="line"><span class="cl"><span class="s"> endpoint: &#39;geode-shard2.dc2.internal:3141&#39; </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: &#39;us-west-2&#39; </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: &#39;30s&#39; </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: &#39;info&#39; </span></span></span><span class="line"><span class="cl"><span class="s"> format: &#39;json&#39; </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 &gt; /etc/geode/geode.yaml <span class="s">&lt;&lt;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: &#39;0.0.0.0:3141&#39; </span></span></span><span class="line"><span class="cl"><span class="s"> data_dir: &#39;/var/lib/geode/shard1&#39; </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: &#39;8GB&#39; </span></span></span><span class="line"><span class="cl"><span class="s"> wal_sync_interval: &#39;100ms&#39; </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: &#39;info&#39; </span></span></span><span class="line"><span class="cl"><span class="s"> format: &#39;json&#39; </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">&gt;</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">&gt;</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">&#39;kafka&#39;</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">&#39;kafka-dc1.internal:9092,kafka-dc2.internal:9092&#39;</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">&#39;geode-cdc-events&#39;</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">&#39;zstd&#39;</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">&#39;all&#39;</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">&#39;kafka&#39;</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">&#39;kafka-dc1.internal:9092,kafka-dc2.internal:9092&#39;</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">&#39;geode-cdc-events&#39;</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">&#39;geode-replica-dc2&#39;</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">&#39;earliest&#39;</span><span class="w"> </span><span class="c"># or &#39;latest&#39; 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">&#39;async&#39;</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">&#39;source_wins&#39;</span><span class="w"> </span><span class="c"># or &#39;timestamp&#39;, &#39;custom&#39;</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">&#34;Alice&#34;</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">&#34;Alice&#34;</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">&#39;5s&#39;</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">&#39;30s&#39;</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">&#39;quorum&#39;</span><span class="w"> </span><span class="c"># or &#39;eventual&#39;, &#39;strong&#39;</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">&#39;primary_preferred&#39;</span><span class="w"> </span><span class="c"># or &#39;primary&#39;, &#39;secondary&#39;, &#39;nearest&#39;</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">&#34;systemctl stop geode&#34;</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">&#34;systemctl start geode&#34;</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">&#34;Primary down&#34;</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 &gt; /etc/geode/geode.yaml <span class="s">&lt;&lt;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: &#39;0.0.0.0:3141&#39; </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: &#39;kafka&#39; </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: &#39;kafka-dc2.internal:9092&#39; </span></span></span><span class="line"><span class="cl"><span class="s"> topic: &#39;geode-cdc-events&#39; </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 -&gt; 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 &gt; /etc/geode/geode.yaml <span class="s">&lt;&lt;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: &#39;kafka&#39; </span></span></span><span class="line"><span class="cl"><span class="s"> topic: &#39;geode-cdc-events&#39; </span></span></span><span class="line"><span class="cl"><span class="s"> auto_offset_reset: &#39;latest&#39; # 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">&#34;systemctl stop geode&#34;</span> </span></span><span class="line"><span class="cl">ssh geode-coord2.dc2.internal <span class="s2">&#34;systemctl stop geode&#34;</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">&#34;</span><span class="s">dc2</span><span class="p">&#34;}</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 &gt; 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">&gt;</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">&#34;</span><span class="s">shard1-dc2</span><span class="p">&#34;}</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">&#34;Content-Type: application/json&#34;</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 &gt; 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">&#34;CDC replication lag exceeds 60s&#34;</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=&#34;geode&#34;, datacenter=&#34;dc2&#34;} == 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">&#34;Datacenter DC2 is unavailable&#34;</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=&#34;active&#34;}) &gt; 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">&#34;Multiple quorums detected (split brain)&#34;</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">&#39;last_write_wins&#39;</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">&#39;_last_modified&#39;</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">&#39;source_wins&#39;</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">&gt;</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">&#39;custom&#39;</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">&#39;/etc/geode/conflict_handler.so&#39;</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">&#39;kafka&#39;</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">&#39;zstd&#39;</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&amp;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&amp;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&rsquo;t ignore conflicts</strong> - Silent data loss ❌ <strong>Don&rsquo;t skip backups</strong> - CDC isn&rsquo;t backup ❌ <strong>Don&rsquo;t overload network</strong> - Saturating cross-DC links ❌ <strong>Don&rsquo;t assume synchronous</strong> - CDC is async ❌ <strong>Don&rsquo;t forget monitoring</strong> - Blind to issues ❌ <strong>Don&rsquo;t hard-code IPs</strong> - Use service discovery ❌ <strong>Don&rsquo;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">&#34;systemctl stop geode&#34;</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">&#34;2024-01-20T00:00:00Z&#34;</span> <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --to-timestamp <span class="s2">&#34;now&#34;</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 &lt;ts&gt; </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 &lt;primary&gt; --target &lt;replica&gt; </span></span><span class="line"><span class="cl">geode-admin promote-replica --node &lt;node-id&gt; </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>