<!-- 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’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">"production-cluster"</span>
</span></span><span class="line"><span class="cl"><span class="nx">mode</span> <span class="p">=</span> <span class="s2">"distributed"</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">"node1.geode.internal:7687"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"node2.geode.internal:7687"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"node3.geode.internal:7687"</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">"node1"</span>
</span></span><span class="line"><span class="cl"><span class="nx">role</span> <span class="p">=</span> <span class="s2">"data"</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">"/var/lib/geode/data"</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">"raft"</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">"raft"</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">'</span><span class="nc">user</span><span class="err">-</span><span class="py">123</span><span class="err">'</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">'</span><span class="nc">Alice</span><span class="err">'</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">'</span><span class="nc">prod</span><span class="err">-</span><span class="py">456</span><span class="err">'</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">'</span><span class="nc">Widget</span><span class="err">'</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">'</span><span class="nc">user</span><span class="err">-</span><span class="py">123</span><span class="err">'</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">'</span><span class="nc">prod</span><span class="err">-</span><span class="py">456</span><span class="err">'</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">-></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">'</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">'</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">'</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">'</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">'</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">'</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">'</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">'</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">'</span><span class="nc">USA</span><span class="err">'</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">-></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">-></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">></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">'</span><span class="py">P7D</span><span class="err">'</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 = 'USA')
</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]->(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]->(Post)
</span></span><span class="line"><span class="cl"> 5. Filter: p.created_at > 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">'</span><span class="nc">user</span><span class="err">-</span><span class="py">123</span><span class="err">'</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">"""Geode automatically optimizes cross-shard traversals"""</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">"coordinator.geode.internal"</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">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (u:User {id: $id})-[:FOLLOWS*1..3]->(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"> """</span><span class="p">,</span> <span class="p">{</span><span class="s2">"id"</span><span class="p">:</span> <span class="s2">"user-123"</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">"majority"</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">"sync"</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">"rack-aware"</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">"primary"</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">"healthy"</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">"unhealthy"</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">"1"</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">"scatter_gather"</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">"Cluster Health"</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">'geode_cluster_nodes_total{status="healthy"}'</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">"Healthy Nodes"</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">"Replication Lag"</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">'histogram_quantile(0.99, rate(geode_cluster_replication_lag_seconds_bucket[5m]))'</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">"p99 Lag"</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">"Cross-Shard Traffic"</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">'rate(geode_cross_shard_bytes_total[5m])'</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">"Bytes/sec"</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="unhealthy"} > 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">"Geode cluster node is unhealthy"</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 > 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">"Replication lag exceeds 5 seconds"</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]) > 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">"Frequent leader elections detected"</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">"/etc/geode/cluster.crt"</span>
</span></span><span class="line"><span class="cl"><span class="nx">tls_key_file</span> <span class="p">=</span> <span class="s2">"/etc/geode/cluster.key"</span>
</span></span><span class="line"><span class="cl"><span class="nx">tls_ca_file</span> <span class="p">=</span> <span class="s2">"/etc/geode/ca.crt"</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