<!-- CANARY: REQ=REQ-DOCS-001; FEATURE="Docs"; ASPECT=Documentation; STATUS=TESTED; OWNER=docs; UPDATED=2026-01-28 --> <h2 id="distributed-systems-in-geode" class="position-relative d-flex align-items-center group"> <span>Distributed Systems in Geode</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="distributed-systems-in-geode" aria-haspopup="dialog" aria-label="Share link: Distributed Systems in Geode"> <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>Distributed systems enable Geode to scale beyond the limits of a single machine while maintaining consistency, availability, and fault tolerance. Geode implements a sophisticated distributed architecture designed specifically for graph workloads, where data locality and relationship traversal efficiency are paramount.</p> <p>This guide covers Geode&rsquo;s distributed architecture, consensus mechanisms, cluster coordination, and strategies for building resilient, scalable graph database deployments.</p> <h3 id="introduction-to-distributed-graph-databases" class="position-relative d-flex align-items-center group"> <span>Introduction to Distributed Graph Databases</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="introduction-to-distributed-graph-databases" aria-haspopup="dialog" aria-label="Share link: Introduction to Distributed Graph Databases"> <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>Traditional relational databases can be distributed by sharding rows across nodes, but graph databases face unique challenges:</p> <p><strong>Relationship Locality</strong>: Graph traversals cross node boundaries, requiring efficient cross-shard communication</p> <p><strong>Hotspot Prevention</strong>: Popular nodes (celebrities, viral content) can create load imbalances</p> <p><strong>Consistency Across Edges</strong>: Relationships connecting nodes on different shards must remain consistent</p> <p><strong>Variable Query Patterns</strong>: Graph queries follow unpredictable paths unlike tabular scans</p> <p>Geode addresses these challenges through intelligent data placement, distributed query planning, and optimized cross-shard communication.</p> <h3 id="geode-cluster-architecture" class="position-relative d-flex align-items-center group"> <span>Geode Cluster Architecture</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="geode-cluster-architecture" aria-haspopup="dialog" aria-label="Share link: Geode Cluster Architecture"> <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="cluster-components" class="position-relative d-flex align-items-center group"> <span>Cluster Components</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="cluster-components" aria-haspopup="dialog" aria-label="Share link: Cluster Components"> <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>A Geode cluster consists of multiple node types working together:</p> <p><strong>Leader Node</strong>: Coordinates cluster state and manages consensus</p> <ul> <li>Handles schema changes and DDL operations</li> <li>Coordinates distributed transactions</li> <li>Manages cluster membership</li> <li>Performs global query planning</li> </ul> <p><strong>Data Nodes</strong>: Store and serve graph data</p> <ul> <li>Host data partitions (shards)</li> <li>Execute local query operations</li> <li>Participate in consensus for writes</li> <li>Maintain local indexes</li> </ul> <p><strong>Query Coordinators</strong>: Route and aggregate queries</p> <ul> <li>Parse and plan distributed queries</li> <li>Coordinate cross-shard operations</li> <li>Aggregate results from multiple nodes</li> <li>Handle client connections</li> </ul> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="c"># geode.toml - Cluster configuration</span> </span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">cluster</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="nx">name</span> <span class="p">=</span> <span class="s2">&#34;production-cluster&#34;</span> </span></span><span class="line"><span class="cl"><span class="nx">mode</span> <span class="p">=</span> <span class="s2">&#34;distributed&#34;</span> <span class="c"># standalone, distributed, or replicated</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">cluster</span><span class="p">.</span><span class="nx">nodes</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="c"># Initial cluster members for discovery</span> </span></span><span class="line"><span class="cl"><span class="nx">seeds</span> <span class="p">=</span> <span class="p">[</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;node1.geode.internal:7687&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;node2.geode.internal:7687&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;node3.geode.internal:7687&#34;</span> </span></span><span class="line"><span class="cl"><span class="p">]</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">cluster</span><span class="p">.</span><span class="nx">node</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="nx">id</span> <span class="p">=</span> <span class="s2">&#34;node1&#34;</span> </span></span><span class="line"><span class="cl"><span class="nx">role</span> <span class="p">=</span> <span class="s2">&#34;data&#34;</span> <span class="c"># leader, data, or coordinator</span> </span></span><span class="line"><span class="cl"><span class="nx">data_dir</span> <span class="p">=</span> <span class="s2">&#34;/var/lib/geode/data&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">cluster</span><span class="p">.</span><span class="nx">consensus</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="nx">protocol</span> <span class="p">=</span> <span class="s2">&#34;raft&#34;</span> </span></span><span class="line"><span class="cl"><span class="nx">election_timeout_ms</span> <span class="p">=</span> <span class="mi">1500</span> </span></span><span class="line"><span class="cl"><span class="nx">heartbeat_interval_ms</span> <span class="p">=</span> <span class="mi">150</span> </span></span></code></pre></div> <h4 id="cluster-formation" class="position-relative d-flex align-items-center group"> <span>Cluster Formation</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="cluster-formation" aria-haspopup="dialog" aria-label="Share link: Cluster Formation"> <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>When starting a Geode cluster, nodes discover each other and elect a leader:</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"># Start first node (will become leader if cluster is new)</span> </span></span><span class="line"><span class="cl">./geode serve --cluster-mode distributed <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --node-id node1 <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --cluster-seeds node1:7687,node2:7687,node3:7687 <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --listen 0.0.0.0:3141 <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --cluster-listen 0.0.0.0:7687 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Start additional nodes</span> </span></span><span class="line"><span class="cl">./geode serve --cluster-mode distributed <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --node-id node2 <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --cluster-seeds node1:7687,node2:7687,node3:7687 <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --listen 0.0.0.0:3141 <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --cluster-listen 0.0.0.0:7687 </span></span></code></pre></div><p><strong>Formation Process</strong>:</p> <ol> <li>Nodes connect to seed addresses</li> <li>Cluster state is synchronized</li> <li>Leader election occurs via Raft</li> <li>Data partitions are assigned</li> <li>Cluster becomes operational</li> </ol> <h3 id="consensus-and-coordination" class="position-relative d-flex align-items-center group"> <span>Consensus and Coordination</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="consensus-and-coordination" aria-haspopup="dialog" aria-label="Share link: Consensus and Coordination"> <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="raft-consensus-protocol" class="position-relative d-flex align-items-center group"> <span>Raft Consensus Protocol</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="raft-consensus-protocol" aria-haspopup="dialog" aria-label="Share link: Raft Consensus Protocol"> <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>Geode uses the Raft consensus protocol for leader election and log replication:</p> <p><strong>Leader Election</strong>: When the current leader fails or is unreachable, remaining nodes elect a new leader through voting. A node needs majority votes to become leader.</p> <p><strong>Log Replication</strong>: All writes are first logged by the leader, then replicated to followers. A write is committed only after a majority of nodes have persisted it.</p> <p><strong>Membership Changes</strong>: Adding or removing nodes is handled through joint consensus to ensure safety during transitions.</p> <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">View</span><span class="w"> </span><span class="py">cluster</span><span class="w"> </span><span class="py">consensus</span><span class="w"> </span><span class="py">status</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SELECT</span><span class="w"> </span><span class="py">node_id</span><span class="p">,</span><span class="w"> </span><span class="py">role</span><span class="p">,</span><span class="w"> </span><span class="py">term</span><span class="p">,</span><span class="w"> </span><span class="py">commit_index</span><span class="p">,</span><span class="w"> </span><span class="py">last_applied</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">FROM</span><span class="w"> </span><span class="py">system</span><span class="err">.</span><span class="py">consensus_status</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="py">replication</span><span class="w"> </span><span class="py">lag</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SELECT</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">follower_id</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">leader_commit_index</span><span class="w"> </span><span class="err">-</span><span class="w"> </span><span class="py">follower_commit_index</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">lag</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">last_heartbeat</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">FROM</span><span class="w"> </span><span class="py">system</span><span class="err">.</span><span class="py">replication_status</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Consensus Configuration</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="p">[</span><span class="nx">cluster</span><span class="p">.</span><span class="nx">consensus</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="nx">protocol</span> <span class="p">=</span> <span class="s2">&#34;raft&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c"># Election timeout (follower becomes candidate)</span> </span></span><span class="line"><span class="cl"><span class="nx">election_timeout_ms</span> <span class="p">=</span> <span class="mi">1500</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c"># Heartbeat interval (leader to followers)</span> </span></span><span class="line"><span class="cl"><span class="nx">heartbeat_interval_ms</span> <span class="p">=</span> <span class="mi">150</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c"># Maximum entries per append</span> </span></span><span class="line"><span class="cl"><span class="nx">max_append_entries</span> <span class="p">=</span> <span class="mi">1000</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c"># Snapshot threshold (log entries before snapshot)</span> </span></span><span class="line"><span class="cl"><span class="nx">snapshot_threshold</span> <span class="p">=</span> <span class="mi">10000</span> </span></span></code></pre></div> <h4 id="distributed-transactions" class="position-relative d-flex align-items-center group"> <span>Distributed Transactions</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="distributed-transactions" aria-haspopup="dialog" aria-label="Share link: Distributed Transactions"> <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>Geode supports distributed ACID transactions using two-phase commit:</p> <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">Distributed</span><span class="w"> </span><span class="py">transaction</span><span class="w"> </span><span class="py">spanning</span><span class="w"> </span><span class="py">multiple</span><span class="w"> </span><span class="py">shards</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">BEGIN</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">Creates</span><span class="w"> </span><span class="kd">on</span><span class="w"> </span><span class="py">shard</span><span class="err">-</span><span class="py">1</span><span class="w"> </span><span class="p">(</span><span class="py">user</span><span class="w"> </span><span class="py">nodes</span><span class="p">)</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="py">u</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">user</span><span class="err">-</span><span class="py">123</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Alice</span><span class="err">&#39;</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">Creates</span><span class="w"> </span><span class="kd">on</span><span class="w"> </span><span class="py">shard</span><span class="err">-</span><span class="py">2</span><span class="w"> </span><span class="p">(</span><span class="py">product</span><span class="w"> </span><span class="py">nodes</span><span class="p">)</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="py">p</span><span class="p">:</span><span class="nc">Product</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">prod</span><span class="err">-</span><span class="py">456</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Widget</span><span class="err">&#39;</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">Relationship</span><span class="w"> </span><span class="py">spans</span><span class="w"> </span><span class="py">both</span><span class="w"> </span><span class="py">shards</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">u</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">user</span><span class="err">-</span><span class="py">123</span><span class="err">&#39;</span><span class="p">}),</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Product</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">prod</span><span class="err">-</span><span class="py">456</span><span class="err">&#39;</span><span class="p">})</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="py">u</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">PURCHASED</span><span class="w"> </span><span class="p">{</span><span class="py">date</span><span class="p">:</span><span class="w"> </span><span class="nc">datetime</span><span class="p">()}]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">p</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="py">COMMIT</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Transaction Flow</strong>:</p> <ol> <li><strong>Prepare Phase</strong>: Coordinator asks all involved shards to prepare</li> <li><strong>Vote</strong>: Each shard votes commit or abort</li> <li><strong>Commit Phase</strong>: If all vote commit, coordinator broadcasts commit</li> <li><strong>Completion</strong>: All shards apply changes and release locks</li> </ol> <p><strong>Transaction Configuration</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="p">[</span><span class="nx">transactions</span><span class="p">.</span><span class="nx">distributed</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="nx">enabled</span> <span class="p">=</span> <span class="kc">true</span> </span></span><span class="line"><span class="cl"><span class="nx">timeout_ms</span> <span class="p">=</span> <span class="mi">30000</span> </span></span><span class="line"><span class="cl"><span class="nx">max_retries</span> <span class="p">=</span> <span class="mi">3</span> </span></span><span class="line"><span class="cl"><span class="nx">retry_delay_ms</span> <span class="p">=</span> <span class="mi">100</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c"># Two-phase commit settings</span> </span></span><span class="line"><span class="cl"><span class="nx">prepare_timeout_ms</span> <span class="p">=</span> <span class="mi">10000</span> </span></span><span class="line"><span class="cl"><span class="nx">commit_timeout_ms</span> <span class="p">=</span> <span class="mi">10000</span> </span></span></code></pre></div> <h3 id="data-sharding-strategies" class="position-relative d-flex align-items-center group"> <span>Data Sharding 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="data-sharding-strategies" aria-haspopup="dialog" aria-label="Share link: Data Sharding 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> </h3> <h4 id="hash-based-sharding" class="position-relative d-flex align-items-center group"> <span>Hash-Based Sharding</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="hash-based-sharding" aria-haspopup="dialog" aria-label="Share link: Hash-Based Sharding"> <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>Distribute data based on property hash values:</p> <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">Configure</span><span class="w"> </span><span class="py">hash</span><span class="err">-</span><span class="py">based</span><span class="w"> </span><span class="py">sharding</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">TYPE</span><span class="w"> </span><span class="py">social_network</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="py">User</span><span class="w"> </span><span class="py">LABEL</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="py">id</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">PRIMARY</span><span class="w"> </span><span class="py">KEY</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">name</span><span class="w"> </span><span class="py">STRING</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">email</span><span class="w"> </span><span class="py">STRING</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 class="py">Post</span><span class="w"> </span><span class="py">LABEL</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="py">id</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">PRIMARY</span><span class="w"> </span><span class="py">KEY</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">content</span><span class="w"> </span><span class="py">STRING</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">created_at</span><span class="w"> </span><span class="py">DATETIME</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 class="p">)</span><span class="w"> </span><span class="py">SHARD</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">HASH</span><span class="p">(</span><span class="py">User</span><span class="err">.</span><span class="py">id</span><span class="p">,</span><span class="w"> </span><span class="py">Post</span><span class="err">.</span><span class="py">id</span><span class="p">)</span><span class="w"> </span><span class="py">SHARDS</span><span class="w"> </span><span class="py">16</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Advantages</strong>:</p> <ul> <li>Even data distribution</li> <li>Predictable shard location</li> <li>Simple implementation</li> </ul> <p><strong>Disadvantages</strong>:</p> <ul> <li>Range queries span all shards</li> <li>No locality for related data</li> </ul> <h4 id="range-based-sharding" class="position-relative d-flex align-items-center group"> <span>Range-Based Sharding</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="range-based-sharding" aria-haspopup="dialog" aria-label="Share link: Range-Based Sharding"> <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>Partition data by property ranges:</p> <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">Range</span><span class="err">-</span><span class="py">based</span><span class="w"> </span><span class="py">sharding</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="py">time</span><span class="err">-</span><span class="py">series</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">TYPE</span><span class="w"> </span><span class="py">event_log</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="py">Event</span><span class="w"> </span><span class="py">LABEL</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="py">id</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">PRIMARY</span><span class="w"> </span><span class="py">KEY</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">timestamp</span><span class="w"> </span><span class="py">DATETIME</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kd">type</span><span class="w"> </span><span class="nc">STRING</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">data</span><span class="w"> </span><span class="py">JSON</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 class="p">)</span><span class="w"> </span><span class="py">SHARD</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">RANGE</span><span class="p">(</span><span class="py">Event</span><span class="err">.</span><span class="py">timestamp</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="py">PARTITION</span><span class="w"> </span><span class="py">p2024q1</span><span class="w"> </span><span class="py">VALUES</span><span class="w"> </span><span class="py">LESS</span><span class="w"> </span><span class="py">THAN</span><span class="w"> </span><span class="p">(</span><span class="err">&#39;</span><span class="py">2024</span><span class="err">-</span><span class="py">04</span><span class="err">-</span><span class="py">01</span><span class="err">&#39;</span><span class="p">),</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">PARTITION</span><span class="w"> </span><span class="py">p2024q2</span><span class="w"> </span><span class="py">VALUES</span><span class="w"> </span><span class="py">LESS</span><span class="w"> </span><span class="py">THAN</span><span class="w"> </span><span class="p">(</span><span class="err">&#39;</span><span class="py">2024</span><span class="err">-</span><span class="py">07</span><span class="err">-</span><span class="py">01</span><span class="err">&#39;</span><span class="p">),</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">PARTITION</span><span class="w"> </span><span class="py">p2024q3</span><span class="w"> </span><span class="py">VALUES</span><span class="w"> </span><span class="py">LESS</span><span class="w"> </span><span class="py">THAN</span><span class="w"> </span><span class="p">(</span><span class="err">&#39;</span><span class="py">2024</span><span class="err">-</span><span class="py">10</span><span class="err">-</span><span class="py">01</span><span class="err">&#39;</span><span class="p">),</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">PARTITION</span><span class="w"> </span><span class="py">p2024q4</span><span class="w"> </span><span class="py">VALUES</span><span class="w"> </span><span class="py">LESS</span><span class="w"> </span><span class="py">THAN</span><span class="w"> </span><span class="p">(</span><span class="err">&#39;</span><span class="py">2025</span><span class="err">-</span><span class="py">01</span><span class="err">-</span><span class="py">01</span><span class="err">&#39;</span><span class="p">),</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">PARTITION</span><span class="w"> </span><span class="py">pmax</span><span class="w"> </span><span class="py">VALUES</span><span class="w"> </span><span class="py">LESS</span><span class="w"> </span><span class="py">THAN</span><span class="w"> </span><span class="py">MAXVALUE</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Advantages</strong>:</p> <ul> <li>Efficient range queries</li> <li>Time-based data lifecycle management</li> <li>Partition pruning for queries</li> </ul> <p><strong>Disadvantages</strong>:</p> <ul> <li>Potential hotspots on recent partitions</li> <li>Requires partition management</li> </ul> <h4 id="graph-aware-sharding" class="position-relative d-flex align-items-center group"> <span>Graph-Aware Sharding</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="graph-aware-sharding" aria-haspopup="dialog" aria-label="Share link: Graph-Aware Sharding"> <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>Colocate connected nodes to minimize cross-shard traversals:</p> <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">Colocate</span><span class="w"> </span><span class="py">users</span><span class="w"> </span><span class="py">with</span><span class="w"> </span><span class="py">their</span><span class="w"> </span><span class="py">content</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">TYPE</span><span class="w"> </span><span class="py">content_graph</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="py">User</span><span class="w"> </span><span class="py">LABEL</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="py">id</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">PRIMARY</span><span class="w"> </span><span class="py">KEY</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">tenant_id</span><span class="w"> </span><span class="py">STRING</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 class="py">Post</span><span class="w"> </span><span class="py">LABEL</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="py">id</span><span class="w"> </span><span class="py">STRING</span><span class="w"> </span><span class="py">PRIMARY</span><span class="w"> </span><span class="py">KEY</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">author_id</span><span class="w"> </span><span class="py">STRING</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 class="p">)</span><span class="w"> </span><span class="py">SHARD</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">COLOCATE</span><span class="p">(</span><span class="py">User</span><span class="err">.</span><span class="py">tenant_id</span><span class="p">,</span><span class="w"> </span><span class="py">Post</span><span class="err">.</span><span class="py">author_id</span><span class="p">)</span><span class="w"> </span><span class="py">SHARDS</span><span class="w"> </span><span class="py">8</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Advantages</strong>:</p> <ul> <li>Minimal cross-shard traversals</li> <li>Better query performance</li> <li>Reduced network overhead</li> </ul> <p><strong>Disadvantages</strong>:</p> <ul> <li>Requires careful data modeling</li> <li>May cause uneven distribution</li> </ul> <h4 id="monitoring-shard-distribution" class="position-relative d-flex align-items-center group"> <span>Monitoring Shard 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="monitoring-shard-distribution" aria-haspopup="dialog" aria-label="Share link: Monitoring Shard 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><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">Check</span><span class="w"> </span><span class="py">shard</span><span class="w"> </span><span class="py">balance</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SELECT</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">shard_id</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">node_count</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">edge_count</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">data_size_mb</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">primary_node</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">FROM</span><span class="w"> </span><span class="py">system</span><span class="err">.</span><span class="py">shard_statistics</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">data_size_mb</span><span class="w"> </span><span class="py">DESC</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">Identify</span><span class="w"> </span><span class="py">cross</span><span class="err">-</span><span class="py">shard</span><span class="w"> </span><span class="py">relationships</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SELECT</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">relationship_type</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">COUNT</span><span class="p">(</span><span class="err">*</span><span class="p">)</span><span class="w"> </span><span class="py">as</span><span class="w"> </span><span class="py">total</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">SUM</span><span class="p">(</span><span class="py">CASE</span><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">source_shard</span><span class="w"> </span><span class="p">!=</span><span class="w"> </span><span class="py">target_shard</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="py">1</span><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="py">0</span><span class="w"> </span><span class="py">END</span><span class="p">)</span><span class="w"> </span><span class="py">as</span><span class="w"> </span><span class="py">cross_shard</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ROUND</span><span class="p">(</span><span class="py">100</span><span class="mf">.0</span><span class="w"> </span><span class="err">*</span><span class="w"> </span><span class="py">SUM</span><span class="p">(</span><span class="py">CASE</span><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">source_shard</span><span class="w"> </span><span class="p">!=</span><span class="w"> </span><span class="py">target_shard</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="py">1</span><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="py">0</span><span class="w"> </span><span class="py">END</span><span class="p">)</span><span class="w"> </span><span class="err">/</span><span class="w"> </span><span class="py">COUNT</span><span class="p">(</span><span class="err">*</span><span class="p">),</span><span class="w"> </span><span class="py">2</span><span class="p">)</span><span class="w"> </span><span class="py">as</span><span class="w"> </span><span class="py">cross_shard_pct</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">FROM</span><span class="w"> </span><span class="py">system</span><span class="err">.</span><span class="py">relationship_distribution</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">GROUP</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">relationship_type</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div> <h3 id="distributed-query-execution" class="position-relative d-flex align-items-center group"> <span>Distributed Query Execution</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="distributed-query-execution" aria-haspopup="dialog" aria-label="Share link: Distributed Query Execution"> <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="query-planning" class="position-relative d-flex align-items-center group"> <span>Query Planning</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-planning" aria-haspopup="dialog" aria-label="Share link: Query Planning"> <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>The query coordinator analyzes queries and generates distributed execution plans:</p> <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">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">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">u</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">country</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">USA</span><span class="err">&#39;</span><span class="p">})</span><span class="err">-</span><span class="p">[:</span><span class="nc">FOLLOWS</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">friend</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">POSTED</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Post</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">p</span><span class="err">.</span><span class="py">created_at</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="py">datetime</span><span class="p">()</span><span class="w"> </span><span class="err">-</span><span class="w"> </span><span class="py">duration</span><span class="p">(</span><span class="err">&#39;</span><span class="py">P7D</span><span class="err">&#39;</span><span class="p">)</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">u</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">friend</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">title</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">LIMIT</span><span class="w"> </span><span class="py">100</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Execution Plan</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">DistributedQueryPlan: </span></span><span class="line"><span class="cl"> 1. ScatterGather: Filter User nodes (country = &#39;USA&#39;) </span></span><span class="line"><span class="cl"> - Shards: [1, 3, 5, 7, 9, 11, 13, 15] (based on hash distribution) </span></span><span class="line"><span class="cl"> 2. LocalExpand: (User)-[:FOLLOWS]-&gt;(friend) </span></span><span class="line"><span class="cl"> - Colocated: 78%, Cross-shard: 22% </span></span><span class="line"><span class="cl"> 3. RemoteFetch: Fetch cross-shard friends </span></span><span class="line"><span class="cl"> - Estimated remote calls: 2,340 </span></span><span class="line"><span class="cl"> 4. LocalExpand: (friend)-[:POSTED]-&gt;(Post) </span></span><span class="line"><span class="cl"> 5. Filter: p.created_at &gt; threshold </span></span><span class="line"><span class="cl"> 6. Gather: Aggregate results at coordinator </span></span><span class="line"><span class="cl"> 7. Limit: 100 </span></span><span class="line"><span class="cl">Estimated Cost: 12,450 </span></span></code></pre></div> <h4 id="query-routing-strategies" class="position-relative d-flex align-items-center group"> <span>Query Routing 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="query-routing-strategies" aria-haspopup="dialog" aria-label="Share link: Query Routing 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><p><strong>Scatter-Gather</strong>: Send query to all relevant shards, aggregate results</p> <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">Scatter</span><span class="err">-</span><span class="py">gather</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="py">aggregation</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">Product</span><span class="p">)</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">p</span><span class="err">.</span><span class="py">category</span><span class="p">,</span><span class="w"> </span><span class="py">COUNT</span><span class="p">(</span><span class="err">*</span><span class="p">)</span><span class="w"> </span><span class="py">as</span><span class="w"> </span><span class="py">count</span><span class="p">,</span><span class="w"> </span><span class="py">AVG</span><span class="p">(</span><span class="py">p</span><span class="err">.</span><span class="py">price</span><span class="p">)</span><span class="w"> </span><span class="py">as</span><span class="w"> </span><span class="py">avg_price</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">GROUP</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">category</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">Runs</span><span class="w"> </span><span class="kd">on</span><span class="w"> </span><span class="py">all</span><span class="w"> </span><span class="py">shards</span><span class="p">,</span><span class="w"> </span><span class="py">coordinator</span><span class="w"> </span><span class="py">aggregates</span><span class="w"> </span></span></span></code></pre></div><p><strong>Directed Query</strong>: Route to specific shard based on filter</p> <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">Directed</span><span class="w"> </span><span class="kd">query</span><span class="w"> </span><span class="nc">with</span><span class="w"> </span><span class="py">shard</span><span class="w"> </span><span class="py">key</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">u</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">user</span><span class="err">-</span><span class="py">123</span><span class="err">&#39;</span><span class="p">})</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">u</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">Routes</span><span class="w"> </span><span class="py">directly</span><span class="w"> </span><span class="py">to</span><span class="w"> </span><span class="py">shard</span><span class="w"> </span><span class="py">containing</span><span class="w"> </span><span class="py">user</span><span class="err">-</span><span class="py">123</span><span class="w"> </span></span></span></code></pre></div><p><strong>Broadcast Query</strong>: Send to all shards for global operations</p> <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">Broadcast</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="kd">schema</span><span class="w"> </span><span class="py">operations</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">INDEX</span><span class="w"> </span><span class="py">user_email</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">User</span><span class="p">(</span><span class="py">email</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">Applied</span><span class="w"> </span><span class="kd">on</span><span class="w"> </span><span class="py">all</span><span class="w"> </span><span class="py">shards</span><span class="w"> </span></span></span></code></pre></div> <h4 id="cross-shard-traversals" class="position-relative d-flex align-items-center group"> <span>Cross-Shard Traversals</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="cross-shard-traversals" aria-haspopup="dialog" aria-label="Share link: Cross-Shard Traversals"> <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>When traversals cross shard boundaries, Geode optimizes communication:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">geode_client</span> <span class="kn">import</span> <span class="n">Client</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">efficient_traversal</span><span class="p">():</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;&#34;&#34;Geode automatically optimizes cross-shard traversals&#34;&#34;&#34;</span> </span></span><span class="line"><span class="cl"> <span class="n">client</span> <span class="o">=</span> <span class="n">Client</span><span class="p">(</span><span class="n">host</span><span class="o">=</span><span class="s2">&#34;coordinator.geode.internal&#34;</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="mi">3141</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="c1"># Geode batches remote fetches for efficiency</span> </span></span><span class="line"><span class="cl"> <span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">&#34;&#34;&#34; </span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (u:User {id: $id})-[:FOLLOWS*1..3]-&gt;(friend) </span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN DISTINCT friend.id, friend.name </span></span></span><span class="line"><span class="cl"><span class="s2"> &#34;&#34;&#34;</span><span class="p">,</span> <span class="p">{</span><span class="s2">&#34;id&#34;</span><span class="p">:</span> <span class="s2">&#34;user-123&#34;</span><span class="p">})</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span> </span></span></code></pre></div><p><strong>Optimization Techniques</strong>:</p> <ul> <li><strong>Batch Remote Fetches</strong>: Collect all needed remote node IDs, fetch in batches</li> <li><strong>Prefetch Hints</strong>: Predict likely traversal paths, prefetch data</li> <li><strong>Query Caching</strong>: Cache frequently traversed paths</li> <li><strong>Bloom Filters</strong>: Quickly determine if node exists on shard</li> </ul> <h3 id="fault-tolerance-and-recovery" class="position-relative d-flex align-items-center group"> <span>Fault Tolerance and 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="fault-tolerance-and-recovery" aria-haspopup="dialog" aria-label="Share link: Fault Tolerance and 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> </h3> <h4 id="handling-node-failures" class="position-relative d-flex align-items-center group"> <span>Handling Node Failures</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="handling-node-failures" aria-haspopup="dialog" aria-label="Share link: Handling Node Failures"> <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>Geode automatically detects and recovers from node failures:</p> <p><strong>Failure Detection</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="p">[</span><span class="nx">cluster</span><span class="p">.</span><span class="nx">health</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="c"># Failure detection settings</span> </span></span><span class="line"><span class="cl"><span class="nx">heartbeat_interval_ms</span> <span class="p">=</span> <span class="mi">100</span> </span></span><span class="line"><span class="cl"><span class="nx">heartbeat_timeout_ms</span> <span class="p">=</span> <span class="mi">1000</span> </span></span><span class="line"><span class="cl"><span class="nx">failure_detection_threshold</span> <span class="p">=</span> <span class="mi">3</span> <span class="c"># Missed heartbeats before suspected</span> </span></span></code></pre></div><p><strong>Automatic Failover</strong>:</p> <ol> <li>Failure detected via missed heartbeats</li> <li>Leader marks node as unavailable</li> <li>Replicas promoted to primary for affected shards</li> <li>Clients automatically redirect to new primaries</li> <li>Rebalancing triggered when replacement node joins</li> </ol> <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">Monitor</span><span class="w"> </span><span class="py">node</span><span class="w"> </span><span class="py">health</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SELECT</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">node_id</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">status</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">last_heartbeat</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">shard_count</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">is_leader</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">FROM</span><span class="w"> </span><span class="py">system</span><span class="err">.</span><span class="py">cluster_nodes</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">View</span><span class="w"> </span><span class="py">failover</span><span class="w"> </span><span class="py">history</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SELECT</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">timestamp</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">event_type</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">affected_node</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">affected_shards</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">recovery_time_ms</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">FROM</span><span class="w"> </span><span class="py">system</span><span class="err">.</span><span class="py">failover_events</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">timestamp</span><span class="w"> </span><span class="py">DESC</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">LIMIT</span><span class="w"> </span><span class="py">20</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div> <h4 id="network-partition-handling" class="position-relative d-flex align-items-center group"> <span>Network Partition Handling</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-partition-handling" aria-haspopup="dialog" aria-label="Share link: Network Partition Handling"> <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>Geode handles network partitions following the Raft protocol:</p> <p><strong>Majority Partition</strong>: Continues operating, elects new leader if needed <strong>Minority Partition</strong>: Becomes read-only, rejects writes</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="p">[</span><span class="nx">cluster</span><span class="p">.</span><span class="nx">partition</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="c"># Partition handling strategy</span> </span></span><span class="line"><span class="cl"><span class="nx">strategy</span> <span class="p">=</span> <span class="s2">&#34;majority&#34;</span> <span class="c"># majority, all, or custom</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c"># Read behavior during partition</span> </span></span><span class="line"><span class="cl"><span class="nx">allow_stale_reads</span> <span class="p">=</span> <span class="kc">false</span> </span></span><span class="line"><span class="cl"><span class="nx">stale_read_timeout_ms</span> <span class="p">=</span> <span class="mi">5000</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c"># Write behavior</span> </span></span><span class="line"><span class="cl"><span class="nx">require_majority_ack</span> <span class="p">=</span> <span class="kc">true</span> </span></span></code></pre></div> <h4 id="data-replication" class="position-relative d-flex align-items-center group"> <span>Data 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="data-replication" aria-haspopup="dialog" aria-label="Share link: Data 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>Configure replication for durability and availability:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="p">[</span><span class="nx">replication</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="c"># Number of replicas per shard</span> </span></span><span class="line"><span class="cl"><span class="nx">factor</span> <span class="p">=</span> <span class="mi">3</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c"># Synchronous vs asynchronous</span> </span></span><span class="line"><span class="cl"><span class="nx">mode</span> <span class="p">=</span> <span class="s2">&#34;sync&#34;</span> <span class="c"># sync or async</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c"># Replica placement</span> </span></span><span class="line"><span class="cl"><span class="nx">placement</span> <span class="p">=</span> <span class="s2">&#34;rack-aware&#34;</span> <span class="c"># spread replicas across racks</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c"># Read preference</span> </span></span><span class="line"><span class="cl"><span class="nx">read_preference</span> <span class="p">=</span> <span class="s2">&#34;primary&#34;</span> <span class="c"># primary, secondary, or nearest</span> </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">Check</span><span class="w"> </span><span class="py">replication</span><span class="w"> </span><span class="py">status</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SELECT</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">shard_id</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">primary_node</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">replica_nodes</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">replication_lag_ms</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">last_sync</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">FROM</span><span class="w"> </span><span class="py">system</span><span class="err">.</span><span class="py">shard_replication</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div> <h3 id="monitoring-distributed-operations" class="position-relative d-flex align-items-center group"> <span>Monitoring Distributed Operations</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-distributed-operations" aria-haspopup="dialog" aria-label="Share link: Monitoring Distributed Operations"> <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="cluster-metrics" class="position-relative d-flex align-items-center group"> <span>Cluster 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="cluster-metrics" aria-haspopup="dialog" aria-label="Share link: Cluster 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><p>Key metrics for monitoring distributed Geode deployments:</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"># Prometheus metrics endpoint</span> </span></span><span class="line"><span class="cl">curl http://coordinator:3141/metrics </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Key distributed metrics</span> </span></span><span class="line"><span class="cl">geode_cluster_nodes_total<span class="o">{</span><span class="nv">status</span><span class="o">=</span><span class="s2">&#34;healthy&#34;</span><span class="o">}</span> <span class="m">5</span> </span></span><span class="line"><span class="cl">geode_cluster_nodes_total<span class="o">{</span><span class="nv">status</span><span class="o">=</span><span class="s2">&#34;unhealthy&#34;</span><span class="o">}</span> <span class="m">0</span> </span></span><span class="line"><span class="cl">geode_cluster_leader_elections_total <span class="m">3</span> </span></span><span class="line"><span class="cl">geode_cluster_replication_lag_seconds<span class="o">{</span><span class="nv">shard</span><span class="o">=</span><span class="s2">&#34;1&#34;</span><span class="o">}</span> 0.012 </span></span><span class="line"><span class="cl">geode_distributed_queries_total<span class="o">{</span><span class="nv">type</span><span class="o">=</span><span class="s2">&#34;scatter_gather&#34;</span><span class="o">}</span> <span class="m">45823</span> </span></span><span class="line"><span class="cl">geode_cross_shard_bytes_total <span class="m">1847293847</span> </span></span></code></pre></div><p><strong>Grafana Dashboard Queries</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"># Cluster health panel</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Cluster Health&#34;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">targets</span><span class="p">:</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="s1">&#39;geode_cluster_nodes_total{status=&#34;healthy&#34;}&#39;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">legendFormat</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Healthy Nodes&#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="c"># Replication lag panel</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Replication Lag&#34;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">targets</span><span class="p">:</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="s1">&#39;histogram_quantile(0.99, rate(geode_cluster_replication_lag_seconds_bucket[5m]))&#39;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">legendFormat</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;p99 Lag&#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="c"># Cross-shard traffic panel</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Cross-Shard Traffic&#34;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">targets</span><span class="p">:</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="s1">&#39;rate(geode_cross_shard_bytes_total[5m])&#39;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">legendFormat</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Bytes/sec&#34;</span><span class="w"> </span></span></span></code></pre></div> <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 alerting rules</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">geode_cluster</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">ClusterNodeDown</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_cluster_nodes_total{status=&#34;unhealthy&#34;} &gt; 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">1m</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">labels</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">critical</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;Geode cluster node is unhealthy&#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">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_cluster_replication_lag_seconds &gt; 5</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">labels</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</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;Replication lag exceeds 5 seconds&#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">FrequentLeaderElections</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">rate(geode_cluster_leader_elections_total[1h]) &gt; 5</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">10m</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">labels</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</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;Frequent leader elections detected&#34;</span><span class="w"> </span></span></span></code></pre></div> <h3 id="configuration-best-practices" class="position-relative d-flex align-items-center group"> <span>Configuration 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="configuration-best-practices" aria-haspopup="dialog" aria-label="Share link: Configuration 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="network-configuration" class="position-relative d-flex align-items-center group"> <span>Network Configuration</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-configuration" aria-haspopup="dialog" aria-label="Share link: Network Configuration"> <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-toml" data-lang="toml"><span class="line"><span class="cl"><span class="p">[</span><span class="nx">cluster</span><span class="p">.</span><span class="nx">network</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="c"># Separate client and cluster traffic</span> </span></span><span class="line"><span class="cl"><span class="nx">client_port</span> <span class="p">=</span> <span class="mi">3141</span> </span></span><span class="line"><span class="cl"><span class="nx">cluster_port</span> <span class="p">=</span> <span class="mi">7687</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c"># Timeouts</span> </span></span><span class="line"><span class="cl"><span class="nx">connect_timeout_ms</span> <span class="p">=</span> <span class="mi">5000</span> </span></span><span class="line"><span class="cl"><span class="nx">request_timeout_ms</span> <span class="p">=</span> <span class="mi">30000</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c"># Keep-alive</span> </span></span><span class="line"><span class="cl"><span class="nx">keepalive_interval_ms</span> <span class="p">=</span> <span class="mi">10000</span> </span></span><span class="line"><span class="cl"><span class="nx">keepalive_timeout_ms</span> <span class="p">=</span> <span class="mi">30000</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c"># TLS for inter-node communication</span> </span></span><span class="line"><span class="cl"><span class="nx">tls_enabled</span> <span class="p">=</span> <span class="kc">true</span> </span></span><span class="line"><span class="cl"><span class="nx">tls_cert_file</span> <span class="p">=</span> <span class="s2">&#34;/etc/geode/cluster.crt&#34;</span> </span></span><span class="line"><span class="cl"><span class="nx">tls_key_file</span> <span class="p">=</span> <span class="s2">&#34;/etc/geode/cluster.key&#34;</span> </span></span><span class="line"><span class="cl"><span class="nx">tls_ca_file</span> <span class="p">=</span> <span class="s2">&#34;/etc/geode/ca.crt&#34;</span> </span></span></code></pre></div> <h4 id="resource-limits" class="position-relative d-flex align-items-center group"> <span>Resource Limits</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="resource-limits" aria-haspopup="dialog" aria-label="Share link: Resource Limits"> <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-toml" data-lang="toml"><span class="line"><span class="cl"><span class="p">[</span><span class="nx">cluster</span><span class="p">.</span><span class="nx">resources</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="c"># Per-node limits</span> </span></span><span class="line"><span class="cl"><span class="nx">max_concurrent_queries</span> <span class="p">=</span> <span class="mi">1000</span> </span></span><span class="line"><span class="cl"><span class="nx">max_transaction_size_mb</span> <span class="p">=</span> <span class="mi">100</span> </span></span><span class="line"><span class="cl"><span class="nx">max_cross_shard_batch_size</span> <span class="p">=</span> <span class="mi">10000</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c"># Memory allocation</span> </span></span><span class="line"><span class="cl"><span class="nx">node_memory_limit_gb</span> <span class="p">=</span> <span class="mi">32</span> </span></span><span class="line"><span class="cl"><span class="nx">query_memory_limit_gb</span> <span class="p">=</span> <span class="mi">8</span> </span></span><span class="line"><span class="cl"><span class="nx">replication_buffer_mb</span> <span class="p">=</span> <span class="mi">512</span> </span></span></code></pre></div> <h4 id="deployment-topology" class="position-relative d-flex align-items-center group"> <span>Deployment Topology</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-topology" aria-haspopup="dialog" aria-label="Share link: Deployment Topology"> <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>Three-Node Cluster</strong> (Minimum for HA):</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Node 1: Leader + Data (Shard 1-5 primary, 11-16 replica) </span></span><span class="line"><span class="cl">Node 2: Data (Shard 6-10 primary, 1-5 replica) </span></span><span class="line"><span class="cl">Node 3: Data (Shard 11-16 primary, 6-10 replica) </span></span></code></pre></div><p><strong>Five-Node Cluster</strong> (Better fault tolerance):</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Node 1: Leader + Coordinator </span></span><span class="line"><span class="cl">Node 2-5: Data nodes (4 shards primary each, 2 replicas) </span></span></code></pre></div><p><strong>Production Cluster</strong> (Dedicated roles):</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Coordinators: 2 nodes (active-passive) </span></span><span class="line"><span class="cl">Data Nodes: 6+ nodes (3 replicas per shard) </span></span><span class="line"><span class="cl">Load Balancer: External LB for client traffic </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="data-modeling-for-distribution" class="position-relative d-flex align-items-center group"> <span>Data Modeling for 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="data-modeling-for-distribution" aria-haspopup="dialog" aria-label="Share link: Data Modeling for 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><ol> <li><strong>Choose shard keys carefully</strong>: Select properties with even distribution</li> <li><strong>Colocate related data</strong>: Keep frequently traversed relationships local</li> <li><strong>Avoid hotspots</strong>: Distribute high-traffic nodes across shards</li> <li><strong>Plan for growth</strong>: Choose sharding strategy that scales</li> </ol> <h4 id="query-optimization" class="position-relative d-flex align-items-center group"> <span>Query 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="query-optimization" aria-haspopup="dialog" aria-label="Share link: Query 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><ol> <li><strong>Filter on shard key first</strong>: Enables directed queries</li> <li><strong>Limit traversal depth</strong>: Deep traversals amplify cross-shard calls</li> <li><strong>Use aggregation pushdown</strong>: Aggregate locally before gathering</li> <li><strong>Cache hot traversals</strong>: Use application-level caching for popular paths</li> </ol> <h4 id="operations" class="position-relative d-flex align-items-center group"> <span>Operations</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="operations" aria-haspopup="dialog" aria-label="Share link: Operations"> <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>Monitor replication lag</strong>: Keep lag under SLA thresholds</li> <li><strong>Test failover regularly</strong>: Verify automatic recovery works</li> <li><strong>Plan capacity</strong>: Add nodes before reaching limits</li> <li><strong>Rolling upgrades</strong>: Upgrade one node at a time</li> </ol> <h3 id="related-topics" class="position-relative d-flex align-items-center group"> <span>Related Topics</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="related-topics" aria-haspopup="dialog" aria-label="Share link: Related Topics"> <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="/tags/high-availability/" >High Availability</a> - Configuring HA deployments</li> <li><a href="/tags/clustering/" >Clustering</a> - Cluster setup and management</li> <li><a href="/tags/recovery/" >Recovery</a> - Disaster recovery procedures</li> <li><a href="/tags/scaling/" >Scaling</a> - Horizontal and vertical scaling</li> <li><a href="/tags/performance/" >Performance</a> - Distributed query optimization</li> <li><a href="/tags/deployment/" >Deployment</a> - Production deployment patterns</li> </ul> <h3 id="further-reading" class="position-relative d-flex align-items-center group"> <span>Further Reading</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="further-reading" aria-haspopup="dialog" aria-label="Share link: Further Reading"> <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>Distributed Systems Architecture Guide</li> <li>Raft Consensus Protocol Overview</li> <li>Sharding Strategy Selection Guide</li> <li>Cross-Shard Query Optimization</li> <li>Network Partition Handling</li> <li>Cluster Operations Runbook</li> </ul>

Related Articles

No articles found with this tag yet.

Back to Home