<!-- 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’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: "Alice"}][{name: "Alice", 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">"2026-01-24T09:00:00Z"</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]---------->|
</span></span><span class="line"><span class="cl"> |----[WAL Record 1002]---------->|
</span></span><span class="line"><span class="cl"> |----[WAL Record 1003]---------->|
</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">"tx-12345"</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">"2026-01-24T00:00:00Z"</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">"2026-01-24T23:59:59Z"</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">"cp %p /mnt/wal-archive/%f"</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 “WAL disk full” 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’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 >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"># - <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]───────────────> │
</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"> │ <─────────────[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 'sync' 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">'</span><span class="nc">Alice</span><span class="err">'</span><span class="p">})</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span 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">'</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">'</span><span class="nc">Bob</span><span class="err">'</span><span class="p">})</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span 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">></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">></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">></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">></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">'</span><span class="py">us</span><span class="err">-</span><span class="py">east</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">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">"/var/lib/geode/wal/</span><span class="nv">$WAL_FILE</span><span class="s2">"</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">"</span><span class="nv">$WAL_PATH</span><span class="s2">"</span> <span class="s2">"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">"</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">"Archived </span><span class="nv">$WAL_FILE</span><span class="s2"> to S3"</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">"Failed to archive </span><span class="nv">$WAL_FILE</span><span class="s2">"</span> ><span class="p">&</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">"/usr/local/bin/archive_wal.sh %p"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">timeout</span><span class="p">:</span><span class="w"> </span><span class="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 > /var/lib/geode/data/recovery.conf <span class="s"><<EOF
</span></span></span><span class="line"><span class="cl"><span class="s">restore_command = 'aws s3 cp s3://geode-wal-archive/%f %p'
</span></span></span><span class="line"><span class="cl"><span class="s">recovery_target_time = '2026-01-24 14:30:00'
</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">'geode_wal_current_lsn'</span><span class="p">,</span> <span class="s1">'Current WAL LSN'</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">'geode_wal_files_count'</span><span class="p">,</span> <span class="s1">'Number of WAL files'</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">'geode_wal_bytes_written_total'</span><span class="p">,</span> <span class="s1">'Total bytes written to WAL'</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">'geode_wal_sync_seconds'</span><span class="p">,</span> <span class="s1">'WAL fsync duration'</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">'geode_replication_lag_bytes'</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'Replication lag in bytes'</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">[</span><span class="s1">'replica'</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">'geode_replication_lag_seconds'</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'Replication lag in seconds'</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">[</span><span class="s1">'replica'</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">'geode_checkpoint_duration_seconds'</span><span class="p">,</span> <span class="s1">'Checkpoint duration'</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">'geode_checkpoint_pages_written_total'</span><span class="p">,</span> <span class="s1">'Pages written during checkpoint'</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">"""Monitor WAL health"""</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">"""
</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"> """</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">></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"># >10GB</span>
</span></span><span class="line"><span class="cl"> <span class="n">alert</span><span class="p">(</span><span class="s2">"WAL directory growing too large"</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">"""
</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"> """</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">'lag_bytes'</span><span class="p">]</span> <span class="o">></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"># >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">"Replica </span><span class="si">{</span><span class="n">replica</span><span class="p">[</span><span class="s1">'replica_name'</span><span class="p">]</span><span class="si">}</span><span class="s2"> falling behind"</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">"""
</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 < NOW() - INTERVAL '1 hour'
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</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">'count'</span><span class="p">]</span> <span class="o">></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">"WAL archival falling behind"</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">"</span><span class="s">replica1</span><span class="p">"}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1"># 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’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>
Tag
1 article
Tag: Write-Ahead Logging (WAL)
Explore Geode documentation tagged with wal. Learn about wal features, best practices, and implementation details.