<!-- CANARY: REQ=REQ-DOCS-001; FEATURE="Docs"; ASPECT=Documentation; STATUS=TESTED; OWNER=docs; UPDATED=2026-01-15 --> <p>Documentation tagged with <strong>Write-Ahead Logging (WAL)</strong> in the Geode graph database. WAL is a fundamental technique for ensuring data durability and enabling crash recovery—every database modification is recorded in a sequential log file before being applied to the database itself.</p> <h3 id="introduction-to-write-ahead-logging" class="position-relative d-flex align-items-center group"> <span>Introduction to Write-Ahead Logging</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-write-ahead-logging" aria-haspopup="dialog" aria-label="Share link: Introduction to Write-Ahead Logging"> <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><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>Write-Ahead Logging (WAL) is the cornerstone of database durability. The principle is elegantly simple: before modifying any data in the database, first write a description of the change to a sequential log file on persistent storage. This ensures that even if the system crashes mid-operation, the database can recover to a consistent state by replaying the log.</p> <p>WAL has been a standard component of database systems since the 1970s, used by virtually every production database including PostgreSQL, Oracle, MySQL, and now Geode. The technique solves a fundamental problem: random writes to database pages are expensive (requiring disk seeks and scattered I/O), but sequential writes to a log file are fast (leveraging sequential disk throughput).</p> <p>By committing transactions via WAL, Geode achieves both:</p> <ul> <li><strong>Fast commits</strong>: Write sequential log records instead of scattered database pages</li> <li><strong>Crash recovery</strong>: Replay the WAL to reconstruct lost in-memory state</li> <li><strong>Point-in-time recovery</strong>: Restore database to any historical moment</li> <li><strong>Replication</strong>: Ship WAL records to replicas for synchronization</li> </ul> <p>Geode&rsquo;s WAL implementation provides full ACID durability guarantees while maintaining high write throughput—critical for production graph workloads.</p> <h3 id="core-wal-concepts" class="position-relative d-flex align-items-center group"> <span>Core WAL Concepts</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="core-wal-concepts" aria-haspopup="dialog" aria-label="Share link: Core WAL Concepts"> <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="the-wal-protocol" class="position-relative d-flex align-items-center group"> <span>The WAL 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="the-wal-protocol" aria-haspopup="dialog" aria-label="Share link: The WAL 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>The fundamental WAL protocol consists of three rules:</p> <ol> <li><strong>Write-Ahead Rule</strong>: Log records must reach persistent storage before data pages</li> <li><strong>Force-Log-at-Commit</strong>: All log records for a transaction must be durable before commit returns</li> <li><strong>No-Force Policy</strong>: Data pages may remain in memory; only WAL must be forced to disk</li> </ol> <p>These rules ensure that:</p> <ul> <li>Committed transactions survive crashes (durability)</li> <li>Uncommitted transactions can be rolled back (atomicity)</li> <li>The database can be reconstructed from the WAL (recoverability)</li> </ul> <h4 id="log-sequence-numbers-lsn" class="position-relative d-flex align-items-center group"> <span>Log Sequence Numbers (LSN)</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="log-sequence-numbers-lsn" aria-haspopup="dialog" aria-label="Share link: Log Sequence Numbers (LSN)"> <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>Every WAL record is assigned a monotonically increasing Log Sequence Number (LSN). LSNs serve multiple purposes:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">LSN: 64-bit integer representing log position </span></span><span class="line"><span class="cl">Example: 0x0000000123456789 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">Components: </span></span><span class="line"><span class="cl">- High 32 bits: WAL file number </span></span><span class="line"><span class="cl">- Low 32 bits: Offset within file </span></span></code></pre></div><p>LSNs enable:</p> <ul> <li>Ordering of operations</li> <li>Tracking which records have been applied</li> <li>Identifying the recovery start point</li> <li>Coordinating replication</li> </ul> <h4 id="wal-record-structure" class="position-relative d-flex align-items-center group"> <span>WAL Record Structure</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="wal-record-structure" aria-haspopup="dialog" aria-label="Share link: WAL Record Structure"> <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>Each WAL record contains:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">WAL Record Format: </span></span><span class="line"><span class="cl">[LSN][Transaction ID][Operation Type][Before Image][After Image][Checksum] </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">Example: </span></span><span class="line"><span class="cl">[0x123456][tx-98765][UPDATE_NODE][{name: &#34;Alice&#34;}][{name: &#34;Alice&#34;, age: 30}][crc32: 0xABCD] </span></span></code></pre></div><p>Components:</p> <ul> <li><strong>LSN</strong>: Unique identifier for this record</li> <li><strong>Transaction ID</strong>: Which transaction generated this operation</li> <li><strong>Operation Type</strong>: INSERT, UPDATE, DELETE, BEGIN, COMMIT, ABORT</li> <li><strong>Before Image</strong>: Data state before modification (for undo)</li> <li><strong>After Image</strong>: Data state after modification (for redo)</li> <li><strong>Checksum</strong>: Integrity verification</li> </ul> <h4 id="checkpointing" class="position-relative d-flex align-items-center group"> <span>Checkpointing</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="checkpointing" aria-haspopup="dialog" aria-label="Share link: Checkpointing"> <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>Periodically, Geode performs a checkpoint:</p> <ol> <li>Flush all dirty pages to disk</li> <li>Write a checkpoint record to WAL</li> <li>Record the LSN in a known location</li> </ol> <p>During recovery, Geode only needs to replay WAL records after the last checkpoint, dramatically reducing recovery time.</p> <h3 id="how-wal-works-in-geode" class="position-relative d-flex align-items-center group"> <span>How WAL Works 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="how-wal-works-in-geode" aria-haspopup="dialog" aria-label="Share link: How WAL Works 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> </h3> <h4 id="write-path" class="position-relative d-flex align-items-center group"> <span>Write Path</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="write-path" aria-haspopup="dialog" aria-label="Share link: Write Path"> <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 a transaction modifies data:</p> <ol> <li><strong>Generate WAL Record</strong>: Create log record describing the change</li> <li><strong>Append to WAL Buffer</strong>: Write to in-memory buffer (fast)</li> <li><strong>Modify In-Memory Data</strong>: Update in-memory database structures</li> <li><strong>Flush WAL on Commit</strong>: Call <code>fsync()</code> to ensure WAL reaches disk</li> <li><strong>Return Success</strong>: Commit completes only after WAL is durable</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="py">BEGIN</span><span class="w"> </span><span class="py">TRANSACTION</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Person</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nc">123</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SET</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">age</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">30</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">At</span><span class="w"> </span><span class="py">this</span><span class="w"> </span><span class="py">point</span><span class="p">,</span><span class="w"> </span><span class="py">WAL</span><span class="w"> </span><span class="py">record</span><span class="w"> </span><span class="py">exists</span><span class="w"> </span><span class="py">in</span><span class="w"> </span><span class="py">memory</span><span class="w"> </span><span class="py">buffer</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><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">fsync</span><span class="p">()</span><span class="w"> </span><span class="py">forces</span><span class="w"> </span><span class="py">WAL</span><span class="w"> </span><span class="py">to</span><span class="w"> </span><span class="py">disk</span><span class="p">,</span><span class="w"> </span><span class="py">then</span><span class="w"> </span><span class="py">commit</span><span class="w"> </span><span class="py">returns</span><span class="w"> </span></span></span></code></pre></div> <h4 id="crash-recovery" class="position-relative d-flex align-items-center group"> <span>Crash 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="crash-recovery" aria-haspopup="dialog" aria-label="Share link: Crash Recovery"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p>On startup after a crash, Geode performs WAL replay:</p> <ol> <li><strong>Find Last Checkpoint</strong>: Read checkpoint LSN from control file</li> <li><strong>Read WAL</strong>: Start reading from checkpoint LSN</li> <li><strong>Identify Transactions</strong>: Separate committed from uncommitted transactions</li> <li><strong>Redo Pass</strong>: Replay committed transactions to reconstruct state</li> <li><strong>Undo Pass</strong>: Roll back uncommitted transactions</li> <li><strong>Resume Operation</strong>: Database is now consistent and ready</li> </ol> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Recovery Example: </span></span><span class="line"><span class="cl">Checkpoint at LSN 1000 </span></span><span class="line"><span class="cl">Crash at LSN 1500 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">WAL Records: </span></span><span class="line"><span class="cl">[1001][tx-1][BEGIN] </span></span><span class="line"><span class="cl">[1002][tx-1][INSERT Node(Person, id=1)] </span></span><span class="line"><span class="cl">[1003][tx-1][COMMIT] </span></span><span class="line"><span class="cl">[1004][tx-2][BEGIN] </span></span><span class="line"><span class="cl">[1005][tx-2][INSERT Node(Person, id=2)] </span></span><span class="line"><span class="cl">[CRASH - no commit for tx-2] </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">Recovery: </span></span><span class="line"><span class="cl">- Replay tx-1: INSERT Node(Person, id=1) - COMMITTED </span></span><span class="line"><span class="cl">- Rollback tx-2: Undo INSERT Node(Person, id=2) - UNCOMMITTED </span></span></code></pre></div> <h4 id="wal-archival-and-rotation" class="position-relative d-flex align-items-center group"> <span>WAL Archival and Rotation</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="wal-archival-and-rotation" aria-haspopup="dialog" aria-label="Share link: WAL Archival and Rotation"> <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>WAL files grow continuously. Geode manages this through:</p> <p><strong>WAL Rotation</strong>: When a WAL file reaches a size limit (default 64MB), start a new file</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">wal/ </span></span><span class="line"><span class="cl">├── 00000001.wal (complete, archived) </span></span><span class="line"><span class="cl">├── 00000002.wal (complete, archived) </span></span><span class="line"><span class="cl">├── 00000003.wal (complete, archived) </span></span><span class="line"><span class="cl">└── 00000004.wal (current, active) </span></span></code></pre></div><p><strong>WAL Archival</strong>: Old WAL files are moved to archive storage for:</p> <ul> <li>Point-in-time recovery</li> <li>Replication to new replicas</li> <li>Audit and compliance</li> </ul> <p><strong>WAL Recycling</strong>: After checkpoint, archived WAL files older than the retention period are deleted or recycled.</p> <h4 id="integration-with-mvcc" class="position-relative d-flex align-items-center group"> <span>Integration with MVCC</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="integration-with-mvcc" aria-haspopup="dialog" aria-label="Share link: Integration with MVCC"> <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>WAL works hand-in-hand with Multi-Version Concurrency Control:</p> <ul> <li><strong>Before Images</strong>: WAL records contain old version data for rollback</li> <li><strong>After Images</strong>: WAL records contain new version data for redo</li> <li><strong>Version Chains</strong>: WAL enables reconstruction of version chains after crash</li> <li><strong>Garbage Collection</strong>: WAL archival coordinated with MVCC GC</li> </ul> <h3 id="use-cases-and-benefits" class="position-relative d-flex align-items-center group"> <span>Use Cases and Benefits</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="use-cases-and-benefits" aria-haspopup="dialog" aria-label="Share link: Use Cases and Benefits"> <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="crash-recovery-1" class="position-relative d-flex align-items-center group"> <span>Crash 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="crash-recovery-1" aria-haspopup="dialog" aria-label="Share link: Crash Recovery"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p>WAL enables automatic recovery from crashes:</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"># Server crashes during transaction</span> </span></span><span class="line"><span class="cl">$ geode serve </span></span><span class="line"><span class="cl"><span class="o">[</span>CRASH - power failure<span class="o">]</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Restart automatically recovers</span> </span></span><span class="line"><span class="cl">$ geode serve </span></span><span class="line"><span class="cl"><span class="o">[</span>2026-01-24 10:00:00<span class="o">]</span> Starting crash recovery... </span></span><span class="line"><span class="cl"><span class="o">[</span>2026-01-24 10:00:01<span class="o">]</span> Reading WAL from LSN <span class="m">123456789</span> </span></span><span class="line"><span class="cl"><span class="o">[</span>2026-01-24 10:00:02<span class="o">]</span> Replaying <span class="m">1523</span> committed transactions </span></span><span class="line"><span class="cl"><span class="o">[</span>2026-01-24 10:00:03<span class="o">]</span> Rolling back <span class="m">2</span> uncommitted transactions </span></span><span class="line"><span class="cl"><span class="o">[</span>2026-01-24 10:00:04<span class="o">]</span> Recovery <span class="nb">complete</span> </span></span><span class="line"><span class="cl"><span class="o">[</span>2026-01-24 10:00:05<span class="o">]</span> Database ready </span></span></code></pre></div> <h4 id="point-in-time-recovery" class="position-relative d-flex align-items-center group"> <span>Point-in-Time 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="point-in-time-recovery" aria-haspopup="dialog" aria-label="Share link: Point-in-Time Recovery"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p>WAL enables time-travel recovery:</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"># Restore database to specific timestamp</span> </span></span><span class="line"><span class="cl">$ geode restore --time <span class="s2">&#34;2026-01-24T09:00:00Z&#34;</span> </span></span><span class="line"><span class="cl"><span class="o">[</span>2026-01-24 10:05:00<span class="o">]</span> Restoring from checkpoint at 08:00:00 </span></span><span class="line"><span class="cl"><span class="o">[</span>2026-01-24 10:05:01<span class="o">]</span> Replaying WAL up to 09:00:00 </span></span><span class="line"><span class="cl"><span class="o">[</span>2026-01-24 10:05:02<span class="o">]</span> Restored to 2026-01-24T09:00:00Z </span></span></code></pre></div><p>This is invaluable for:</p> <ul> <li>Recovering from accidental data deletion</li> <li>Investigating historical states for debugging</li> <li>Compliance and audit requirements</li> </ul> <h4 id="replication" class="position-relative d-flex align-items-center group"> <span>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="replication" aria-haspopup="dialog" aria-label="Share link: 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>WAL enables efficient replication:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Primary Server Replica Server </span></span><span class="line"><span class="cl"> | | </span></span><span class="line"><span class="cl"> |----[WAL Record 1001]----------&gt;| </span></span><span class="line"><span class="cl"> |----[WAL Record 1002]----------&gt;| </span></span><span class="line"><span class="cl"> |----[WAL Record 1003]----------&gt;| </span></span><span class="line"><span class="cl"> | | </span></span><span class="line"><span class="cl"> | [Apply WAL] </span></span></code></pre></div><p>Replicas apply WAL records to stay synchronized with the primary, enabling:</p> <ul> <li>High availability (fail over to replica)</li> <li>Read scalability (distribute reads across replicas)</li> <li>Geographic distribution (replicas in multiple regions)</li> </ul> <h4 id="audit-logging" class="position-relative d-flex align-items-center group"> <span>Audit Logging</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="audit-logging" aria-haspopup="dialog" aria-label="Share link: Audit Logging"> <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>WAL provides a complete audit trail:</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">Query</span><span class="w"> </span><span class="py">WAL</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="py">specific</span><span class="w"> </span><span class="py">transaction</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CALL</span><span class="w"> </span><span class="py">dbms</span><span class="err">.</span><span class="py">audit</span><span class="err">.</span><span class="py">wal</span><span class="err">.</span><span class="kd">query</span><span class="p">({</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">transaction_id</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;tx-12345&#34;</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">time_range</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="nc">start</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;2026-01-24T00:00:00Z&#34;</span><span class="p">,</span><span class="w"> </span><span class="nc">end</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;2026-01-24T23:59:59Z&#34;</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="nc">YIELD</span><span class="w"> </span><span class="py">lsn</span><span class="p">,</span><span class="w"> </span><span class="py">operation</span><span class="p">,</span><span class="w"> </span><span class="py">before_image</span><span class="p">,</span><span class="w"> </span><span class="py">after_image</span><span class="p">,</span><span class="w"> </span><span class="py">timestamp</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">lsn</span><span class="p">,</span><span class="w"> </span><span class="py">operation</span><span class="p">,</span><span class="w"> </span><span class="py">before_image</span><span class="p">,</span><span class="w"> </span><span class="py">after_image</span><span class="p">,</span><span class="w"> </span><span class="py">timestamp</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p>This supports:</p> <ul> <li>Compliance (SOC 2, HIPAA, GDPR)</li> <li>Forensic investigation</li> <li>Change tracking</li> </ul> <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="wal-storage-configuration" class="position-relative d-flex align-items-center group"> <span>WAL Storage 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="wal-storage-configuration" aria-haspopup="dialog" aria-label="Share link: WAL Storage 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><ol> <li> <p><strong>Use dedicated storage</strong>: Place WAL on separate disks from data files</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ geode serve --wal-dir /mnt/wal-ssd --data-dir /mnt/data-hdd </span></span></code></pre></div></li> <li> <p><strong>Use SSDs for WAL</strong>: Sequential writes benefit from SSD latency</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">WAL on HDD: ~10ms fsync latency → 100 commits/sec </span></span><span class="line"><span class="cl">WAL on SSD: ~0.1ms fsync latency → 10,000 commits/sec </span></span></code></pre></div></li> <li> <p><strong>RAID configuration</strong>: Use RAID 1 or RAID 10 for WAL reliability</p> </li> </ol> <h4 id="checkpoint-tuning" class="position-relative d-flex align-items-center group"> <span>Checkpoint Tuning</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="checkpoint-tuning" aria-haspopup="dialog" aria-label="Share link: Checkpoint Tuning"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p>Configure checkpoint frequency to balance:</p> <ul> <li><strong>Recovery time</strong>: More frequent checkpoints → faster recovery</li> <li><strong>Performance</strong>: Less frequent checkpoints → less I/O overhead</li> </ul> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># geode.yaml</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">wal</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">checkpoint_interval</span><span class="p">:</span><span class="w"> </span><span class="l">5m </span><span class="w"> </span><span class="c"># Checkpoint every 5 minutes</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">checkpoint_timeout</span><span class="p">:</span><span class="w"> </span><span class="l">30s </span><span class="w"> </span><span class="c"># Max time for checkpoint</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max_wal_size</span><span class="p">:</span><span class="w"> </span><span class="l">1GB </span><span class="w"> </span><span class="c"># Force checkpoint if WAL exceeds 1GB</span><span class="w"> </span></span></span></code></pre></div> <h4 id="wal-archival-strategy" class="position-relative d-flex align-items-center group"> <span>WAL Archival Strategy</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="wal-archival-strategy" aria-haspopup="dialog" aria-label="Share link: WAL Archival Strategy"> <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"># geode.yaml</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">wal</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">archive_mode</span><span class="p">:</span><span class="w"> </span><span class="l">enabled</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">archive_command</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;cp %p /mnt/wal-archive/%f&#34;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">archive_timeout</span><span class="p">:</span><span class="w"> </span><span class="l">60s</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">retention_days</span><span class="p">:</span><span class="w"> </span><span class="m">30</span><span class="w"> </span></span></span></code></pre></div><p>Configure archival based on requirements:</p> <ul> <li><strong>Compliance</strong>: Long retention (90+ days)</li> <li><strong>Replication</strong>: Keep WAL until all replicas apply it</li> <li><strong>Storage cost</strong>: Balance retention with storage costs</li> </ul> <h4 id="monitoring-wal-health" class="position-relative d-flex align-items-center group"> <span>Monitoring WAL Health</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-wal-health" aria-haspopup="dialog" aria-label="Share link: Monitoring WAL Health"> <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>Track critical WAL metrics:</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">WAL</span><span class="w"> </span><span class="py">metrics</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CALL</span><span class="w"> </span><span class="py">dbms</span><span class="err">.</span><span class="py">monitor</span><span class="err">.</span><span class="py">wal</span><span class="err">.</span><span class="py">stats</span><span class="p">()</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">YIELD</span><span class="w"> </span><span class="py">current_lsn</span><span class="p">,</span><span class="w"> </span><span class="py">checkpoint_lsn</span><span class="p">,</span><span class="w"> </span><span class="py">wal_files</span><span class="p">,</span><span class="w"> </span><span class="py">wal_size</span><span class="p">,</span><span class="w"> </span><span class="py">flush_rate</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">WAL</span><span class="w"> </span><span class="py">lag</span><span class="w"> </span><span class="p">(</span><span class="py">replication</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CALL</span><span class="w"> </span><span class="py">dbms</span><span class="err">.</span><span class="py">monitor</span><span class="err">.</span><span class="py">replication</span><span class="err">.</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">YIELD</span><span class="w"> </span><span class="py">replica</span><span class="p">,</span><span class="w"> </span><span class="py">wal_lag_bytes</span><span class="p">,</span><span class="w"> </span><span class="py">wal_lag_seconds</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">Checkpoint</span><span class="w"> </span><span class="py">statistics</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CALL</span><span class="w"> </span><span class="py">dbms</span><span class="err">.</span><span class="py">monitor</span><span class="err">.</span><span class="py">checkpoint</span><span class="err">.</span><span class="py">stats</span><span class="p">()</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">YIELD</span><span class="w"> </span><span class="py">last_checkpoint</span><span class="p">,</span><span class="w"> </span><span class="py">duration</span><span class="p">,</span><span class="w"> </span><span class="py">pages_written</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p>Alert on:</p> <ul> <li><strong>WAL accumulation</strong>: WAL files growing without bound</li> <li><strong>Slow fsync</strong>: Commit latency increasing</li> <li><strong>Replication lag</strong>: Replicas falling behind</li> </ul> <h3 id="troubleshooting" class="position-relative d-flex align-items-center group"> <span>Troubleshooting</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="troubleshooting" aria-haspopup="dialog" aria-label="Share link: Troubleshooting"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3> <h4 id="wal-disk-full" class="position-relative d-flex align-items-center group"> <span>WAL Disk Full</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="wal-disk-full" aria-haspopup="dialog" aria-label="Share link: WAL Disk Full"> <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>Symptom</strong>: Commits fail with &ldquo;WAL disk full&rdquo; error <strong>Cause</strong>: WAL directory ran out of space <strong>Solution</strong>:</p> <ol> <li>Add storage to WAL directory</li> <li>Reduce WAL retention</li> <li>Increase checkpoint frequency</li> <li>Archive old WAL files to cheaper storage</li> </ol> <h4 id="slow-commits" class="position-relative d-flex align-items-center group"> <span>Slow Commits</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="slow-commits" aria-haspopup="dialog" aria-label="Share link: Slow Commits"> <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>Symptom</strong>: High commit latency <strong>Cause</strong>: Slow fsync() calls <strong>Solution</strong>:</p> <ol> <li>Move WAL to faster storage (SSD)</li> <li>Check disk I/O contention</li> <li>Tune filesystem mount options (noatime, data=writeback)</li> <li>Consider group commit optimization</li> </ol> <h4 id="long-recovery-times" class="position-relative d-flex align-items-center group"> <span>Long Recovery Times</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="long-recovery-times" aria-haspopup="dialog" aria-label="Share link: Long Recovery Times"> <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>Symptom</strong>: Database takes minutes to recover after crash <strong>Cause</strong>: Large amount of WAL to replay <strong>Solution</strong>:</p> <ol> <li>Increase checkpoint frequency</li> <li>Reduce transaction size</li> <li>Add more memory for in-memory buffers</li> <li>Use parallel WAL replay (if available)</li> </ol> <h4 id="corrupted-wal" class="position-relative d-flex align-items-center group"> <span>Corrupted WAL</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="corrupted-wal" aria-haspopup="dialog" aria-label="Share link: Corrupted WAL"> <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>Symptom</strong>: Recovery fails with checksum mismatch <strong>Cause</strong>: Disk corruption, partial write, bit flip <strong>Solution</strong>:</p> <ol> <li>Restore from backup</li> <li>Recover to last valid LSN (may lose recent commits)</li> <li>Use WAL archive if available</li> <li>Check hardware (bad disk, bad memory)</li> </ol> <h3 id="performance-considerations" class="position-relative d-flex align-items-center group"> <span>Performance Considerations</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="performance-considerations" aria-haspopup="dialog" aria-label="Share link: Performance Considerations"> <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="wal-write-throughput" class="position-relative d-flex align-items-center group"> <span>WAL Write Throughput</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="wal-write-throughput" aria-haspopup="dialog" aria-label="Share link: WAL Write Throughput"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p>Optimize WAL write performance:</p> <ol> <li> <p><strong>Batch commits</strong>: Group multiple transactions into single fsync</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">wal</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">group_commit_delay</span><span class="p">:</span><span class="w"> </span><span class="l">10ms </span><span class="w"> </span><span class="c"># Wait up to 10ms to batch commits</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">group_commit_size</span><span class="p">:</span><span class="w"> </span><span class="m">100</span><span class="w"> </span><span class="c"># Or batch up to 100 transactions</span><span class="w"> </span></span></span></code></pre></div></li> <li> <p><strong>Asynchronous commit</strong>: Trade durability for throughput (use cautiously)</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">BEGIN</span><span class="w"> </span><span class="py">TRANSACTION</span><span class="w"> </span><span class="py">ISOLATION</span><span class="w"> </span><span class="py">LEVEL</span><span class="w"> </span><span class="py">READ</span><span class="w"> </span><span class="py">COMMITTED</span><span class="p">,</span><span class="w"> </span><span class="py">COMMIT</span><span class="w"> </span><span class="py">MODE</span><span class="w"> </span><span class="py">ASYNC</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">Transaction</span><span class="w"> </span><span class="py">commits</span><span class="w"> </span><span class="py">without</span><span class="w"> </span><span class="py">waiting</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="py">fsync</span><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></li> <li> <p><strong>WAL compression</strong>: Reduce WAL size with compression</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">wal</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">compression</span><span class="p">:</span><span class="w"> </span><span class="l">lz4 </span><span class="w"> </span><span class="c"># Fast compression algorithm</span><span class="w"> </span></span></span></code></pre></div></li> </ol> <h4 id="recovery-performance" class="position-relative d-flex align-items-center group"> <span>Recovery Performance</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="recovery-performance" aria-haspopup="dialog" aria-label="Share link: Recovery Performance"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p>Optimize recovery speed:</p> <ol> <li><strong>Parallel replay</strong>: Replay independent transactions concurrently</li> <li><strong>Incremental checkpoints</strong>: Spread checkpoint I/O over time</li> <li><strong>Hot standby</strong>: Keep replica always ready for instant failover</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/acid/" >ACID Transactions</a> - WAL enables durability</li> <li><a href="/tags/mvcc/" >Multi-Version Concurrency Control (MVCC)</a> - WAL integrates with MVCC</li> <li><a href="/docs/recovery/" >Crash Recovery</a> - Recovery process details</li> <li><a href="/tags/distributed/" >Replication</a> - WAL-based replication</li> <li><a href="/docs/operations/backup/" >Backup and Restore</a> - Using WAL for backups</li> <li><a href="/tags/performance/" >Performance</a> - WAL performance tuning</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><a href="/docs/recovery/" >Durability and Recovery Guide</a> - Complete recovery documentation</li> <li><a href="/docs/architecture/" >Architecture Overview</a> - WAL in system architecture</li> <li><a href="/docs/query/performance-tuning/" >Performance Tuning</a> - WAL optimization</li> <li><a href="/docs/operations/monitoring/" >Monitoring Guide</a> - WAL health monitoring</li> </ul> <p>Geode&rsquo;s Write-Ahead Logging implementation provides rock-solid durability guarantees while maintaining high write throughput—essential for production graph workloads where data loss is unacceptable.</p> <h3 id="advanced-wal-features" class="position-relative d-flex align-items-center group"> <span>Advanced WAL Features</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="advanced-wal-features" aria-haspopup="dialog" aria-label="Share link: Advanced WAL Features"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3> <h4 id="parallel-wal-writing" class="position-relative d-flex align-items-center group"> <span>Parallel WAL Writing</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="parallel-wal-writing" aria-haspopup="dialog" aria-label="Share link: Parallel WAL Writing"> <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 parallel WAL writers for improved throughput:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Transaction Commit Pipeline: </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">Thread 1: Txn A → WAL Buffer → Flush Queue </span></span><span class="line"><span class="cl">Thread 2: Txn B → WAL Buffer → Flush Queue </span></span><span class="line"><span class="cl">Thread 3: Txn C → WAL Buffer → Flush Queue </span></span><span class="line"><span class="cl"> ↓ </span></span><span class="line"><span class="cl"> WAL Writer Thread </span></span><span class="line"><span class="cl"> ↓ </span></span><span class="line"><span class="cl"> fsync() call </span></span><span class="line"><span class="cl"> (batches A, B, C) </span></span><span class="line"><span class="cl"> ↓ </span></span><span class="line"><span class="cl"> All 3 txns commit </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">Benefit: Single fsync() commits multiple transactions </span></span><span class="line"><span class="cl">Result: 10,000+ commits/sec on NVMe SSD </span></span></code></pre></div> <h4 id="group-commit-optimization" class="position-relative d-flex align-items-center group"> <span>Group Commit 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="group-commit-optimization" aria-haspopup="dialog" aria-label="Share link: Group Commit 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><p>Batch commits to amortize fsync() cost:</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"># geode.yaml</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">wal</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">group_commit</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max_delay_ms</span><span class="p">:</span><span class="w"> </span><span class="m">10</span><span class="w"> </span><span class="c"># Wait up to 10ms to batch</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max_batch_size</span><span class="p">:</span><span class="w"> </span><span class="m">100</span><span class="w"> </span><span class="c"># Or commit when 100 txns queued</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"># Result:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># - Individual commit latency: 0.1ms (WAL append)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># - Actual fsync() latency: 10ms (once per batch)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># - Effective throughput: 10,000 commits/sec vs 100 commits/sec</span><span class="w"> </span></span></span></code></pre></div> <h4 id="wal-compression" class="position-relative d-flex align-items-center group"> <span>WAL Compression</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="wal-compression" aria-haspopup="dialog" aria-label="Share link: WAL Compression"> <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>Reduce WAL storage and I/O:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">wal</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">compression</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">algorithm</span><span class="p">:</span><span class="w"> </span><span class="l">lz4 </span><span class="w"> </span><span class="c"># Fast compression</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">level</span><span class="p">:</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="c"># Low CPU overhead</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">min_size</span><span class="p">:</span><span class="w"> </span><span class="m">1024</span><span class="w"> </span><span class="c"># Only compress records &gt;1KB</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"># Results:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># - 60-80% compression ratio for typical graph operations</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># - &lt;5% CPU overhead for compression</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># - Reduced network bandwidth for replication</span><span class="w"> </span></span></span></code></pre></div> <h4 id="incremental-checkpointing" class="position-relative d-flex align-items-center group"> <span>Incremental Checkpointing</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="incremental-checkpointing" aria-haspopup="dialog" aria-label="Share link: Incremental Checkpointing"> <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>Spread checkpoint I/O over time:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Traditional Checkpoint: </span></span><span class="line"><span class="cl">Time: ────────────[CHECKPOINT]──────────────────── </span></span><span class="line"><span class="cl">I/O: ████████████ (burst) </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">Incremental Checkpoint: </span></span><span class="line"><span class="cl">Time: ──────────────────────────────────────────── </span></span><span class="line"><span class="cl">I/O: ██ ██ ██ ██ ██ ██ (spread out) </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">Benefits: </span></span><span class="line"><span class="cl">- No I/O spikes </span></span><span class="line"><span class="cl">- Consistent query performance </span></span><span class="line"><span class="cl">- Faster recovery (shorter WAL replay) </span></span></code></pre></div><p>Configuration:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">wal</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">checkpoint</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">mode</span><span class="p">:</span><span class="w"> </span><span class="l">incremental</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">target_duration</span><span class="p">:</span><span class="w"> </span><span class="l">300s </span><span class="w"> </span><span class="c"># Spread over 5 minutes</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max_dirty_pages</span><span class="p">:</span><span class="w"> </span><span class="m">100000</span><span class="w"> </span><span class="c"># Trigger at 100k dirty pages</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">completion_target</span><span class="p">:</span><span class="w"> </span><span class="m">0.9</span><span class="w"> </span><span class="c"># Aim to complete 90% of checkpoint interval</span><span class="w"> </span></span></span></code></pre></div> <h3 id="wal-replication-strategies" class="position-relative d-flex align-items-center group"> <span>WAL Replication 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="wal-replication-strategies" aria-haspopup="dialog" aria-label="Share link: WAL Replication 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="streaming-replication" class="position-relative d-flex align-items-center group"> <span>Streaming 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="streaming-replication" aria-haspopup="dialog" aria-label="Share link: Streaming 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>Ship WAL records to replicas in real-time:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Primary Server Replica Server </span></span><span class="line"><span class="cl"> │ │ </span></span><span class="line"><span class="cl"> │ [Txn Commit] │ </span></span><span class="line"><span class="cl"> │ ↓ │ </span></span><span class="line"><span class="cl"> │ [WAL Write] │ </span></span><span class="line"><span class="cl"> │ ↓ │ </span></span><span class="line"><span class="cl"> │ [Stream WAL Record]───────────────&gt; │ </span></span><span class="line"><span class="cl"> │ [Apply WAL] </span></span><span class="line"><span class="cl"> │ ↓ </span></span><span class="line"><span class="cl"> │ &lt;─────────────[ACK]────────────── [Update State] </span></span><span class="line"><span class="cl"> │ │ </span></span><span class="line"><span class="cl"> │ [Commit Txn] │ </span></span></code></pre></div><p>Implementation:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">replication</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">mode</span><span class="p">:</span><span class="w"> </span><span class="l">streaming</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sync_mode</span><span class="p">:</span><span class="w"> </span><span class="l">async </span><span class="w"> </span><span class="c"># or &#39;sync&#39; for synchronous replication</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max_lag_bytes</span><span class="p">:</span><span class="w"> </span><span class="m">10485760</span><span class="w"> </span><span class="c"># 10MB max lag</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">max_lag_seconds</span><span class="p">:</span><span class="w"> </span><span class="m">10</span><span class="w"> </span><span class="c"># 10 seconds max time 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="nt">replicas</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">host</span><span class="p">:</span><span class="w"> </span><span class="l">replica1.example.com</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">port</span><span class="p">:</span><span class="w"> </span><span class="m">7000</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sync_priority</span><span class="p">:</span><span class="w"> </span><span class="m">1</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="nt">host</span><span class="p">:</span><span class="w"> </span><span class="l">replica2.example.com</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">port</span><span class="p">:</span><span class="w"> </span><span class="m">7000</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sync_priority</span><span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w"> </span></span></span></code></pre></div> <h4 id="synchronous-vs-asynchronous-replication" class="position-relative d-flex align-items-center group"> <span>Synchronous vs. Asynchronous 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="synchronous-vs-asynchronous-replication" aria-haspopup="dialog" aria-label="Share link: Synchronous vs. Asynchronous 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><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">Synchronous</span><span class="w"> </span><span class="py">replication</span><span class="w"> </span><span class="p">(</span><span class="py">wait</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="py">replica</span><span class="w"> </span><span class="py">ACK</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">BEGIN</span><span class="w"> </span><span class="py">TRANSACTION</span><span class="w"> </span><span class="py">REPLICATION</span><span class="w"> </span><span class="py">sync</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(:</span><span class="nc">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="nc">123</span><span class="p">,</span><span class="w"> </span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Alice</span><span class="err">&#39;</span><span class="p">})</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">COMMIT</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Blocks</span><span class="w"> </span><span class="py">until</span><span class="w"> </span><span class="py">replica</span><span class="w"> </span><span class="py">confirms</span><span class="w"> </span><span class="py">WAL</span><span class="w"> </span><span class="py">applied</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">Asynchronous</span><span class="w"> </span><span class="py">replication</span><span class="w"> </span><span class="p">(</span><span class="py">don</span><span class="err">&#39;</span><span class="py">t</span><span class="w"> </span><span class="py">wait</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">BEGIN</span><span class="w"> </span><span class="py">TRANSACTION</span><span class="w"> </span><span class="py">REPLICATION</span><span class="w"> </span><span class="py">async</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(:</span><span class="nc">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="nc">456</span><span class="p">,</span><span class="w"> </span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Bob</span><span class="err">&#39;</span><span class="p">})</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">COMMIT</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Returns</span><span class="w"> </span><span class="py">immediately</span><span class="p">,</span><span class="w"> </span><span class="py">replica</span><span class="w"> </span><span class="py">applies</span><span class="w"> </span><span class="py">eventually</span><span class="w"> </span></span></span></code></pre></div><p>Trade-offs:</p> <p><strong>Synchronous</strong>:</p> <ul> <li>Pro: Zero data loss on failover</li> <li>Pro: Strong consistency across replicas</li> <li>Con: Higher commit latency (network round-trip)</li> <li>Con: Availability depends on replica health</li> </ul> <p><strong>Asynchronous</strong>:</p> <ul> <li>Pro: Low commit latency</li> <li>Pro: Primary unaffected by replica failures</li> <li>Con: Potential data loss on failover (uncommitted WAL)</li> <li>Con: Eventual consistency</li> </ul> <h4 id="cascading-replication" class="position-relative d-flex align-items-center group"> <span>Cascading 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="cascading-replication" aria-haspopup="dialog" aria-label="Share link: Cascading 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>Replicate across multiple tiers:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"> <span class="n">Primary</span> <span class="p">(</span><span class="n">US</span><span class="o">-</span><span class="n">East</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="err">│</span> </span></span><span class="line"><span class="cl"> <span class="err">├───</span><span class="o">&gt;</span> <span class="n">Replica</span> <span class="mi">1</span> <span class="p">(</span><span class="n">US</span><span class="o">-</span><span class="n">East</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="err">│</span> </span></span><span class="line"><span class="cl"> <span class="err">└───</span><span class="o">&gt;</span> <span class="n">Replica</span> <span class="mi">2</span> <span class="p">(</span><span class="n">US</span><span class="o">-</span><span class="n">West</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="err">│</span> </span></span><span class="line"><span class="cl"> <span class="err">├───</span><span class="o">&gt;</span> <span class="n">Replica</span> <span class="mi">3</span> <span class="p">(</span><span class="n">EU</span><span class="o">-</span><span class="n">West</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="err">│</span> </span></span><span class="line"><span class="cl"> <span class="err">└───</span><span class="o">&gt;</span> <span class="n">Replica</span> <span class="mi">4</span> <span class="p">(</span><span class="n">AP</span><span class="o">-</span><span class="n">South</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">Benefits</span><span class="p">:</span> </span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Reduced</span> <span class="nb">load</span> <span class="n">on</span> <span class="n">primary</span> </span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Geographic</span> <span class="n">distribution</span> </span></span><span class="line"><span class="cl"><span class="o">-</span> <span class="n">Lower</span> <span class="n">cross</span><span class="o">-</span><span class="n">region</span> <span class="n">bandwidth</span> </span></span></code></pre></div> <h3 id="wal-based-logical-replication" class="position-relative d-flex align-items-center group"> <span>WAL-Based Logical 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="wal-based-logical-replication" aria-haspopup="dialog" aria-label="Share link: WAL-Based Logical 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> </h3><p>Replicate specific subsets of data:</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">Create</span><span class="w"> </span><span class="py">logical</span><span class="w"> </span><span class="py">replication</span><span class="w"> </span><span class="py">slot</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">REPLICATION</span><span class="w"> </span><span class="py">SLOT</span><span class="w"> </span><span class="py">analytics_slot</span><span class="w"> </span><span class="py">LOGICAL</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">Define</span><span class="w"> </span><span class="py">publication</span><span class="w"> </span><span class="p">(</span><span class="py">what</span><span class="w"> </span><span class="py">to</span><span class="w"> </span><span class="py">replicate</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="py">PUBLICATION</span><span class="w"> </span><span class="py">analytics_pub</span><span class="w"> </span><span class="py">FOR</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">LABELS</span><span class="w"> </span><span class="p">(</span><span class="py">User</span><span class="p">,</span><span class="w"> </span><span class="py">Order</span><span class="p">,</span><span class="w"> </span><span class="py">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">WHERE</span><span class="w"> </span><span class="py">region</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">&#39;</span><span class="py">us</span><span class="err">-</span><span class="py">east</span><span class="err">&#39;;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Subscriber</span><span class="w"> </span><span class="py">consumes</span><span class="w"> </span><span class="py">filtered</span><span class="w"> </span><span class="py">WAL</span><span class="w"> </span><span class="py">stream</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SUBSCRIBE</span><span class="w"> </span><span class="py">TO</span><span class="w"> </span><span class="py">PUBLICATION</span><span class="w"> </span><span class="py">analytics_pub</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">SLOT</span><span class="w"> </span><span class="py">analytics_slot</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p>Use cases:</p> <ul> <li>Replicate subset of data to analytics database</li> <li>Multi-tenant replication (one tenant per replica)</li> <li>Cross-database replication (Geode → PostgreSQL)</li> </ul> <h3 id="disaster-recovery-with-wal" class="position-relative d-flex align-items-center group"> <span>Disaster Recovery with WAL</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="disaster-recovery-with-wal" aria-haspopup="dialog" aria-label="Share link: Disaster Recovery with WAL"> <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="continuous-wal-archival" class="position-relative d-flex align-items-center group"> <span>Continuous WAL Archival</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="continuous-wal-archival" aria-haspopup="dialog" aria-label="Share link: Continuous WAL Archival"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash </span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="c1"># WAL archival script</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Geode calls this when WAL segment complete</span> </span></span><span class="line"><span class="cl"><span class="nv">WAL_FILE</span><span class="o">=</span><span class="nv">$1</span> </span></span><span class="line"><span class="cl"><span class="nv">WAL_PATH</span><span class="o">=</span><span class="s2">&#34;/var/lib/geode/wal/</span><span class="nv">$WAL_FILE</span><span class="s2">&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Archive to S3</span> </span></span><span class="line"><span class="cl">aws s3 cp <span class="s2">&#34;</span><span class="nv">$WAL_PATH</span><span class="s2">&#34;</span> <span class="s2">&#34;s3://geode-wal-archive/</span><span class="k">$(</span>date +%Y%m%d<span class="k">)</span><span class="s2">/</span><span class="nv">$WAL_FILE</span><span class="s2">&#34;</span> <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --storage-class GLACIER </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Verify upload</span> </span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> <span class="nv">$?</span> -eq <span class="m">0</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span> </span></span><span class="line"><span class="cl"> <span class="nb">echo</span> <span class="s2">&#34;Archived </span><span class="nv">$WAL_FILE</span><span class="s2"> to S3&#34;</span> </span></span><span class="line"><span class="cl"><span class="k">else</span> </span></span><span class="line"><span class="cl"> <span class="nb">echo</span> <span class="s2">&#34;Failed to archive </span><span class="nv">$WAL_FILE</span><span class="s2">&#34;</span> &gt;<span class="p">&amp;</span><span class="m">2</span> </span></span><span class="line"><span class="cl"> <span class="nb">exit</span> <span class="m">1</span> </span></span><span class="line"><span class="cl"><span class="k">fi</span> </span></span></code></pre></div><p>Configuration:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">wal</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">archive</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">command</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;/usr/local/bin/archive_wal.sh %p&#34;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">timeout</span><span class="p">:</span><span class="w"> </span><span class="m">300</span><span class="w"> </span><span class="c"># 5 minute timeout</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">retention_days</span><span class="p">:</span><span class="w"> </span><span class="m">30</span><span class="w"> </span></span></span></code></pre></div> <h4 id="point-in-time-recovery-pitr" class="position-relative d-flex align-items-center group"> <span>Point-in-Time Recovery (PITR)</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="point-in-time-recovery-pitr" aria-haspopup="dialog" aria-label="Share link: Point-in-Time Recovery (PITR)"> <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>Restore database to specific timestamp:</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"># Stop Geode server</span> </span></span><span class="line"><span class="cl">systemctl stop geode </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Restore base backup</span> </span></span><span class="line"><span class="cl">tar -xzf /backups/base-backup-20260124.tar.gz -C /var/lib/geode/data </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Configure recovery</span> </span></span><span class="line"><span class="cl">cat &gt; /var/lib/geode/data/recovery.conf <span class="s">&lt;&lt;EOF </span></span></span><span class="line"><span class="cl"><span class="s">restore_command = &#39;aws s3 cp s3://geode-wal-archive/%f %p&#39; </span></span></span><span class="line"><span class="cl"><span class="s">recovery_target_time = &#39;2026-01-24 14:30:00&#39; </span></span></span><span class="line"><span class="cl"><span class="s">recovery_target_action = promote </span></span></span><span class="line"><span class="cl"><span class="s">EOF</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Start Geode (recovery mode)</span> </span></span><span class="line"><span class="cl">systemctl start geode </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Geode replays WAL up to target time, then becomes operational</span> </span></span></code></pre></div><p>Recovery process:</p> <ol> <li>Restore base backup</li> <li>Replay WAL files from archive</li> <li>Stop at recovery target time</li> <li>Apply final checkpoint</li> <li>Database ready at target timestamp</li> </ol> <h4 id="wal-retention-for-compliance" class="position-relative d-flex align-items-center group"> <span>WAL Retention for Compliance</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="wal-retention-for-compliance" aria-haspopup="dialog" aria-label="Share link: WAL Retention for Compliance"> <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 long-term WAL retention:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">wal</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">archive</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">retention</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">short_term</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">days</span><span class="p">:</span><span class="w"> </span><span class="m">7</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">storage</span><span class="p">:</span><span class="w"> </span><span class="l">local </span><span class="w"> </span><span class="c"># /var/lib/geode/wal_archive</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">long_term</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">days</span><span class="p">:</span><span class="w"> </span><span class="m">2555</span><span class="w"> </span><span class="c"># 7 years for compliance</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">storage</span><span class="p">:</span><span class="w"> </span><span class="l">s3_glacier</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">bucket</span><span class="p">:</span><span class="w"> </span><span class="l">geode-compliance-archive</span><span class="w"> </span></span></span></code></pre></div> <h3 id="monitoring-wal-health-1" class="position-relative d-flex align-items-center group"> <span>Monitoring WAL Health</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-wal-health-1" aria-haspopup="dialog" aria-label="Share link: Monitoring WAL Health"> <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="critical-wal-metrics" class="position-relative d-flex align-items-center group"> <span>Critical WAL 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="critical-wal-metrics" aria-haspopup="dialog" aria-label="Share link: Critical WAL 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><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">prometheus_client</span> <span class="kn">import</span> <span class="n">Gauge</span><span class="p">,</span> <span class="n">Counter</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># WAL metrics</span> </span></span><span class="line"><span class="cl"><span class="n">wal_current_lsn</span> <span class="o">=</span> <span class="n">Gauge</span><span class="p">(</span><span class="s1">&#39;geode_wal_current_lsn&#39;</span><span class="p">,</span> <span class="s1">&#39;Current WAL LSN&#39;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">wal_files_count</span> <span class="o">=</span> <span class="n">Gauge</span><span class="p">(</span><span class="s1">&#39;geode_wal_files_count&#39;</span><span class="p">,</span> <span class="s1">&#39;Number of WAL files&#39;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">wal_bytes_written</span> <span class="o">=</span> <span class="n">Counter</span><span class="p">(</span><span class="s1">&#39;geode_wal_bytes_written_total&#39;</span><span class="p">,</span> <span class="s1">&#39;Total bytes written to WAL&#39;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">wal_sync_duration</span> <span class="o">=</span> <span class="n">Histogram</span><span class="p">(</span><span class="s1">&#39;geode_wal_sync_seconds&#39;</span><span class="p">,</span> <span class="s1">&#39;WAL fsync duration&#39;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Replication lag</span> </span></span><span class="line"><span class="cl"><span class="n">replication_lag_bytes</span> <span class="o">=</span> <span class="n">Gauge</span><span class="p">(</span> </span></span><span class="line"><span class="cl"> <span class="s1">&#39;geode_replication_lag_bytes&#39;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s1">&#39;Replication lag in bytes&#39;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="p">[</span><span class="s1">&#39;replica&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">replication_lag_seconds</span> <span class="o">=</span> <span class="n">Gauge</span><span class="p">(</span> </span></span><span class="line"><span class="cl"> <span class="s1">&#39;geode_replication_lag_seconds&#39;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s1">&#39;Replication lag in seconds&#39;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="p">[</span><span class="s1">&#39;replica&#39;</span><span class="p">]</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="c1"># Checkpoint metrics</span> </span></span><span class="line"><span class="cl"><span class="n">checkpoint_duration</span> <span class="o">=</span> <span class="n">Histogram</span><span class="p">(</span><span class="s1">&#39;geode_checkpoint_duration_seconds&#39;</span><span class="p">,</span> <span class="s1">&#39;Checkpoint duration&#39;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">checkpoint_pages_written</span> <span class="o">=</span> <span class="n">Counter</span><span class="p">(</span><span class="s1">&#39;geode_checkpoint_pages_written_total&#39;</span><span class="p">,</span> <span class="s1">&#39;Pages written during checkpoint&#39;</span><span class="p">)</span> </span></span></code></pre></div> <h4 id="wal-health-checks" class="position-relative d-flex align-items-center group"> <span>WAL Health Checks</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="wal-health-checks" aria-haspopup="dialog" aria-label="Share link: WAL Health Checks"> <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-python" data-lang="python"><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">check_wal_health</span><span class="p">(</span><span class="n">client</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;&#34;&#34;Monitor WAL health&#34;&#34;&#34;</span> </span></span><span class="line"><span class="cl"> <span class="c1"># Check WAL disk usage</span> </span></span><span class="line"><span class="cl"> <span class="n">wal_size</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">client</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">&#34;&#34;&#34; </span></span></span><span class="line"><span class="cl"><span class="s2"> SELECT SUM(size_bytes) AS total_size </span></span></span><span class="line"><span class="cl"><span class="s2"> FROM SYSTEM.wal_files </span></span></span><span class="line"><span class="cl"><span class="s2"> &#34;&#34;&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="n">wal_size</span> <span class="o">&gt;</span> <span class="mi">10</span> <span class="o">*</span> <span class="mi">1024</span> <span class="o">*</span> <span class="mi">1024</span> <span class="o">*</span> <span class="mi">1024</span><span class="p">:</span> <span class="c1"># &gt;10GB</span> </span></span><span class="line"><span class="cl"> <span class="n">alert</span><span class="p">(</span><span class="s2">&#34;WAL directory growing too large&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1"># Check replication lag</span> </span></span><span class="line"><span class="cl"> <span class="n">lag</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">client</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">&#34;&#34;&#34; </span></span></span><span class="line"><span class="cl"><span class="s2"> SELECT replica_name, </span></span></span><span class="line"><span class="cl"><span class="s2"> current_lsn - replica_lsn AS lag_bytes, </span></span></span><span class="line"><span class="cl"><span class="s2"> extract(epoch from now() - last_replay_time) AS lag_seconds </span></span></span><span class="line"><span class="cl"><span class="s2"> FROM SYSTEM.replication_status </span></span></span><span class="line"><span class="cl"><span class="s2"> &#34;&#34;&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">replica</span> <span class="ow">in</span> <span class="n">lag</span><span class="o">.</span><span class="n">bindings</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="n">replica</span><span class="p">[</span><span class="s1">&#39;lag_bytes&#39;</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mi">100</span> <span class="o">*</span> <span class="mi">1024</span> <span class="o">*</span> <span class="mi">1024</span><span class="p">:</span> <span class="c1"># &gt;100MB</span> </span></span><span class="line"><span class="cl"> <span class="n">alert</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;Replica </span><span class="si">{</span><span class="n">replica</span><span class="p">[</span><span class="s1">&#39;replica_name&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2"> falling behind&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1"># Check WAL archival</span> </span></span><span class="line"><span class="cl"> <span class="n">unarchived</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">client</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">&#34;&#34;&#34; </span></span></span><span class="line"><span class="cl"><span class="s2"> SELECT COUNT(*) AS count </span></span></span><span class="line"><span class="cl"><span class="s2"> FROM SYSTEM.wal_files </span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE archived = false </span></span></span><span class="line"><span class="cl"><span class="s2"> AND created_at &lt; NOW() - INTERVAL &#39;1 hour&#39; </span></span></span><span class="line"><span class="cl"><span class="s2"> &#34;&#34;&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="n">unarchived</span><span class="o">.</span><span class="n">bindings</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s1">&#39;count&#39;</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mi">10</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="n">alert</span><span class="p">(</span><span class="s2">&#34;WAL archival falling behind&#34;</span><span class="p">)</span> </span></span></code></pre></div> <h4 id="grafana-dashboard-queries" class="position-relative d-flex align-items-center group"> <span>Grafana Dashboard Queries</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="grafana-dashboard-queries" aria-haspopup="dialog" aria-label="Share link: Grafana Dashboard Queries"> <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-promql" data-lang="promql"><span class="line"><span class="cl"><span class="c1"># WAL write rate</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">rate</span><span class="o">(</span><span class="nv">geode_wal_bytes_written_total</span><span class="p">[</span><span class="s">5m</span><span class="p">]</span><span class="o">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1"># Average fsync duration</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">rate</span><span class="o">(</span><span class="nv">geode_wal_sync_seconds_sum</span><span class="p">[</span><span class="s">5m</span><span class="p">]</span><span class="o">)</span><span class="w"> </span><span class="o">/</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">rate</span><span class="o">(</span><span class="nv">geode_wal_sync_seconds_count</span><span class="p">[</span><span class="s">5m</span><span class="p">]</span><span class="o">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1"># Replication lag (seconds)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nv">geode_replication_lag_seconds</span><span class="p">{</span><span class="nl">replica</span><span class="o">=</span><span class="p">&#34;</span><span class="s">replica1</span><span class="p">&#34;}</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1"># WAL disk usage</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nv">geode_wal_files_count</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">64</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">1024</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">1024</span><span class="w"> </span><span class="c1"># Assuming 64MB segments</span><span class="w"> </span></span></span></code></pre></div> <h3 id="further-reading-1" 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-1" 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><a href="/docs/recovery/" >Durability and Recovery Guide</a> - Complete recovery documentation</li> <li><a href="/docs/architecture/" >Architecture Overview</a> - WAL in system architecture</li> <li><a href="/docs/query/performance-tuning/" >Performance Tuning</a> - WAL optimization</li> <li><a href="/docs/operations/monitoring/" >Monitoring Guide</a> - WAL health monitoring</li> <li><a href="https://www.postgresql.org/docs/current/wal-internals.html" aria-label="PostgreSQL WAL Internals – opens in new window" target="_blank" rel="noopener noreferrer" >PostgreSQL WAL Internals <span aria-hidden="true" class="external-icon">↗</span> </a> - Detailed WAL concepts</li> <li><a href="https://cs.stanford.edu/people/chrismre/cs345/rl/aries.pdf" aria-label="ARIES Recovery Algorithm – opens in new window" target="_blank" rel="noopener noreferrer" >ARIES Recovery Algorithm <span aria-hidden="true" class="external-icon">↗</span> </a> - Foundational paper</li> </ul> <p>Geode&rsquo;s Write-Ahead Logging implementation provides rock-solid durability guarantees while maintaining high write throughput—essential for production graph workloads where data loss is unacceptable.</p>

Related Articles