foundationdb/known-limitations.html

405 lines
28 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<title>Known Limitations &#8212; FoundationDB ON documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="_static/bootstrap-sphinx.css" />
<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="_static/doctools.js"></script>
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="Transaction profiling and analyzing" href="transaction-profiler-analyzer.html" />
<link rel="prev" title="Transaction Tagging" href="transaction-tagging.html" />
<meta charset='utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'>
<meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1'>
<meta name="apple-mobile-web-app-capable" content="yes">
<script type="text/javascript" src="_static/js/jquery-1.12.4.min.js"></script>
<script type="text/javascript" src="_static/js/jquery-fix.js"></script>
<script type="text/javascript" src="_static/bootstrap-3.4.1/js/bootstrap.min.js"></script>
<script type="text/javascript" src="_static/bootstrap-sphinx.js"></script>
</head><body>
<div id="navbar" class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<!-- .btn-navbar is used as the toggle for collapsed navbar content -->
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="index.html">
FoundationDB</a>
<span class="navbar-text navbar-version pull-left"><b>7.3.57</b></span>
</div>
<div class="collapse navbar-collapse nav-collapse">
<ul class="nav navbar-nav">
<li><a href="contents.html">Site Map</a></li>
<li class="dropdown globaltoc-container">
<a role="button"
id="dLabelGlobalToc"
data-toggle="dropdown"
data-target="#"
href="index.html">Site <b class="caret"></b></a>
<ul class="dropdown-menu globaltoc"
role="menu"
aria-labelledby="dLabelGlobalToc"><ul class="current">
<li class="toctree-l1"><a class="reference internal" href="local-dev.html">Local Development</a></li>
<li class="toctree-l1"><a class="reference internal" href="internal-dev-tools.html">Internal Dev Tools</a></li>
<li class="toctree-l1"><a class="reference internal" href="why-foundationdb.html">Why FoundationDB</a><ul>
<li class="toctree-l2"><a class="reference internal" href="transaction-manifesto.html">Transaction Manifesto</a></li>
<li class="toctree-l2"><a class="reference internal" href="cap-theorem.html">CAP Theorem</a></li>
<li class="toctree-l2"><a class="reference internal" href="consistency.html">Consistency</a></li>
<li class="toctree-l2"><a class="reference internal" href="scalability.html">Scalability</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="technical-overview.html">Technical Overview</a><ul>
<li class="toctree-l2"><a class="reference internal" href="architecture.html">Architecture</a></li>
<li class="toctree-l2"><a class="reference internal" href="performance.html">Performance</a></li>
<li class="toctree-l2"><a class="reference internal" href="benchmarking.html">Benchmarking</a></li>
<li class="toctree-l2"><a class="reference internal" href="engineering.html">Engineering</a></li>
<li class="toctree-l2"><a class="reference internal" href="features.html">Features</a></li>
<li class="toctree-l2"><a class="reference internal" href="layer-concept.html">Layer Concept</a></li>
<li class="toctree-l2"><a class="reference internal" href="anti-features.html">Anti-Features</a></li>
<li class="toctree-l2"><a class="reference internal" href="experimental-features.html">Experimental-Features</a></li>
<li class="toctree-l2"><a class="reference internal" href="transaction-processing.html">Transaction Processing</a></li>
<li class="toctree-l2"><a class="reference internal" href="fault-tolerance.html">Fault Tolerance</a></li>
<li class="toctree-l2"><a class="reference internal" href="flow.html">Flow</a></li>
<li class="toctree-l2"><a class="reference internal" href="testing.html">Simulation and Testing</a></li>
<li class="toctree-l2"><a class="reference internal" href="kv-architecture.html">FoundationDB Architecture</a></li>
<li class="toctree-l2"><a class="reference internal" href="read-write-path.html">FDB Read and Write Path</a></li>
<li class="toctree-l2"><a class="reference internal" href="ha-write-path.html">FDB HA Write Path: How a mutation travels in FDB HA</a></li>
<li class="toctree-l2"><a class="reference internal" href="consistency-check-urgent.html">Consistency Checker Urgent</a></li>
</ul>
</li>
<li class="toctree-l1 current"><a class="reference internal" href="client-design.html">Client Design</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="getting-started-mac.html">Getting Started on macOS</a></li>
<li class="toctree-l2"><a class="reference internal" href="getting-started-linux.html">Getting Started on Linux</a></li>
<li class="toctree-l2"><a class="reference internal" href="downloads.html">Downloads</a></li>
<li class="toctree-l2"><a class="reference internal" href="developer-guide.html">Developer Guide</a></li>
<li class="toctree-l2"><a class="reference internal" href="data-modeling.html">Data Modeling</a></li>
<li class="toctree-l2"><a class="reference internal" href="client-testing.html">Client Testing</a></li>
<li class="toctree-l2"><a class="reference internal" href="client-testing.html#testing-error-handling-with-buggify">Testing Error Handling with Buggify</a></li>
<li class="toctree-l2"><a class="reference internal" href="client-testing.html#simulation-and-cluster-workloads">Simulation and Cluster Workloads</a></li>
<li class="toctree-l2"><a class="reference internal" href="client-testing.html#api-tester">API Tester</a></li>
<li class="toctree-l2"><a class="reference internal" href="api-general.html">Using FoundationDB Clients</a></li>
<li class="toctree-l2"><a class="reference internal" href="transaction-tagging.html">Transaction Tagging</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">Known Limitations</a></li>
<li class="toctree-l2"><a class="reference internal" href="transaction-profiler-analyzer.html">Transaction profiling and analyzing</a></li>
<li class="toctree-l2"><a class="reference internal" href="api-version-upgrade-guide.html">API Version Upgrade Guide</a></li>
<li class="toctree-l2"><a class="reference internal" href="tenants.html">Tenants</a></li>
<li class="toctree-l2"><a class="reference internal" href="automatic-idempotency.html">Automatic Idempotency</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="design-recipes.html">Design Recipes</a><ul>
<li class="toctree-l2"><a class="reference internal" href="blob.html">Blob</a></li>
<li class="toctree-l2"><a class="reference internal" href="blob-java.html">Blob</a></li>
<li class="toctree-l2"><a class="reference internal" href="hierarchical-documents.html">Hierarchical Documents</a></li>
<li class="toctree-l2"><a class="reference internal" href="hierarchical-documents-java.html">Hierarchical Documents</a></li>
<li class="toctree-l2"><a class="reference internal" href="multimaps.html">Multimaps</a></li>
<li class="toctree-l2"><a class="reference internal" href="multimaps-java.html">Multimaps</a></li>
<li class="toctree-l2"><a class="reference internal" href="priority-queues.html">Priority Queues</a></li>
<li class="toctree-l2"><a class="reference internal" href="priority-queues-java.html">Priority Queues</a></li>
<li class="toctree-l2"><a class="reference internal" href="queues.html">Queues</a></li>
<li class="toctree-l2"><a class="reference internal" href="queues-java.html">Queues</a></li>
<li class="toctree-l2"><a class="reference internal" href="segmented-range-reads.html">Segmented Range Reads</a></li>
<li class="toctree-l2"><a class="reference internal" href="segmented-range-reads-java.html">Segmented Range Reads</a></li>
<li class="toctree-l2"><a class="reference internal" href="simple-indexes.html">Simple Indexes</a></li>
<li class="toctree-l2"><a class="reference internal" href="simple-indexes-java.html">Simple Indexes</a></li>
<li class="toctree-l2"><a class="reference internal" href="spatial-indexing.html">Spatial Indexing</a></li>
<li class="toctree-l2"><a class="reference internal" href="spatial-indexing-java.html">Spatial Indexing</a></li>
<li class="toctree-l2"><a class="reference internal" href="subspace-indirection.html">Subspace Indirection</a></li>
<li class="toctree-l2"><a class="reference internal" href="subspace-indirection-java.html">Subspace Indirection</a></li>
<li class="toctree-l2"><a class="reference internal" href="tables.html">Tables</a></li>
<li class="toctree-l2"><a class="reference internal" href="tables-java.html">Tables</a></li>
<li class="toctree-l2"><a class="reference internal" href="vector.html">Vector</a></li>
<li class="toctree-l2"><a class="reference internal" href="vector-java.html">Vector</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="api-reference.html">API Reference</a><ul>
<li class="toctree-l2"><a class="reference internal" href="api-python.html">Python API</a></li>
<li class="toctree-l2"><a class="reference internal" href="api-ruby.html">Ruby API</a></li>
<li class="toctree-l2"><a class="reference external" href="relative://javadoc/index.html">Java API</a></li>
<li class="toctree-l2"><a class="reference external" href="https://godoc.org/github.com/apple/foundationdb/bindings/go/src/fdb">Go API</a></li>
<li class="toctree-l2"><a class="reference internal" href="api-c.html">C API</a></li>
<li class="toctree-l2"><a class="reference internal" href="api-error-codes.html">Error Codes</a></li>
<li class="toctree-l2"><a class="reference internal" href="special-keys.html">Special Keys</a></li>
<li class="toctree-l2"><a class="reference internal" href="global-configuration.html">Global Configuration</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="tutorials.html">Tutorials</a><ul>
<li class="toctree-l2"><a class="reference internal" href="class-scheduling.html">Class Scheduling</a></li>
<li class="toctree-l2"><a class="reference internal" href="largeval.html">Managing Large Values and Blobs</a></li>
<li class="toctree-l2"><a class="reference internal" href="time-series.html">Time-Series Data</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="administration.html">Administration</a><ul>
<li class="toctree-l2"><a class="reference internal" href="configuration.html">Configuration</a></li>
<li class="toctree-l2"><a class="reference internal" href="moving-a-cluster.html">Moving a Cluster to New Machines</a></li>
<li class="toctree-l2"><a class="reference internal" href="tls.html">Transport Layer Security</a></li>
<li class="toctree-l2"><a class="reference internal" href="authorization.html">Authorization</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="monitored-metrics.html"><strong>Monitored Metrics</strong></a></li>
<li class="toctree-l1"><a class="reference internal" href="redwood.html">Redwood Storage Engine</a></li>
<li class="toctree-l1"><a class="reference internal" href="visibility.html">Visibility Documents</a><ul>
<li class="toctree-l2"><a class="reference internal" href="request-tracing.html">Request Tracing</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="earlier-release-notes.html">Earlier Release Notes</a><ul>
<li class="toctree-l2"><a class="reference internal" href="release-notes/release-notes-014.html">Release Notes</a></li>
<li class="toctree-l2"><a class="reference internal" href="release-notes/release-notes-016.html">Release Notes</a></li>
<li class="toctree-l2"><a class="reference internal" href="release-notes/release-notes-021.html">Release Notes</a></li>
<li class="toctree-l2"><a class="reference internal" href="release-notes/release-notes-022.html">Release Notes</a></li>
<li class="toctree-l2"><a class="reference internal" href="release-notes/release-notes-023.html">Release Notes</a></li>
<li class="toctree-l2"><a class="reference internal" href="release-notes/release-notes-100.html">Release Notes</a></li>
<li class="toctree-l2"><a class="reference internal" href="release-notes/release-notes-200.html">Release Notes</a></li>
<li class="toctree-l2"><a class="reference internal" href="release-notes/release-notes-300.html">Release Notes</a></li>
<li class="toctree-l2"><a class="reference internal" href="release-notes/release-notes-400.html">Release Notes</a></li>
<li class="toctree-l2"><a class="reference internal" href="release-notes/release-notes-410.html">Release Notes</a></li>
<li class="toctree-l2"><a class="reference internal" href="release-notes/release-notes-420.html">Release Notes</a></li>
<li class="toctree-l2"><a class="reference internal" href="release-notes/release-notes-430.html">Release Notes</a></li>
<li class="toctree-l2"><a class="reference internal" href="release-notes/release-notes-440.html">Release Notes</a></li>
<li class="toctree-l2"><a class="reference internal" href="release-notes/release-notes-450.html">Release Notes</a></li>
<li class="toctree-l2"><a class="reference internal" href="release-notes/release-notes-460.html">Release Notes</a></li>
<li class="toctree-l2"><a class="reference internal" href="release-notes/release-notes-500.html">Release Notes</a></li>
<li class="toctree-l2"><a class="reference internal" href="release-notes/release-notes-510.html">Release Notes</a></li>
<li class="toctree-l2"><a class="reference internal" href="release-notes/release-notes-520.html">Release Notes</a></li>
<li class="toctree-l2"><a class="reference internal" href="release-notes/release-notes-600.html">Release Notes</a></li>
<li class="toctree-l2"><a class="reference internal" href="release-notes/release-notes-610.html">Release Notes</a></li>
<li class="toctree-l2"><a class="reference internal" href="release-notes/release-notes-620.html">Release Notes</a></li>
<li class="toctree-l2"><a class="reference internal" href="release-notes/release-notes-630.html">Release Notes</a></li>
<li class="toctree-l2"><a class="reference internal" href="release-notes/release-notes-700.html">Release Notes</a></li>
<li class="toctree-l2"><a class="reference internal" href="release-notes/release-notes-710.html">Release Notes</a></li>
<li class="toctree-l2"><a class="reference internal" href="release-notes/release-notes-720.html">Release Notes</a></li>
<li class="toctree-l2"><a class="reference internal" href="release-notes/release-notes-730.html">Release Notes</a></li>
</ul>
</li>
</ul>
</ul>
</li>
<li class="dropdown">
<a role="button"
id="dLabelLocalToc"
data-toggle="dropdown"
data-target="#"
href="#">Page <b class="caret"></b></a>
<ul class="dropdown-menu localtoc"
role="menu"
aria-labelledby="dLabelLocalToc"><ul>
<li><a class="reference internal" href="#">Known Limitations</a><ul>
<li><a class="reference internal" href="#design-limitations">Design limitations</a><ul>
<li><a class="reference internal" href="#large-transactions">Large transactions</a></li>
<li><a class="reference internal" href="#large-keys-and-values">Large keys and values</a></li>
<li><a class="reference internal" href="#spinning-hdds">Spinning HDDs</a></li>
<li><a class="reference internal" href="#key-selectors-with-large-offsets-are-slow">Key selectors with large offsets are slow</a></li>
<li><a class="reference internal" href="#not-a-security-boundary">Not a security boundary</a></li>
</ul>
</li>
<li><a class="reference internal" href="#current-limitations">Current limitations</a><ul>
<li><a class="reference internal" href="#long-running-transactions">Long running transactions</a></li>
<li><a class="reference internal" href="#cluster-size">Cluster size</a></li>
<li><a class="reference internal" href="#database-size">Database size</a></li>
<li><a class="reference internal" href="#limited-read-load-balancing">Limited read load balancing</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</ul>
</li>
<li>
<a href="transaction-tagging.html" title="Previous Chapter: Transaction Tagging"><span class="glyphicon glyphicon-chevron-left visible-sm"></span><span class="hidden-sm hidden-tablet">&laquo; Transaction Tagging</span>
</a>
</li>
<li>
<a href="transaction-profiler-analyzer.html" title="Next Chapter: Transaction profiling and analyzing"><span class="glyphicon glyphicon-chevron-right visible-sm"></span><span class="hidden-sm hidden-tablet">Transaction p... &raquo;</span>
</a>
</li>
</ul>
<form class="navbar-form navbar-right" action="search.html" method="get">
<div class="form-group">
<input type="text" name="q" class="form-control" placeholder="Search" />
</div>
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-md-3">
<div id="sidebar" class="bs-sidenav" role="complementary"><ul>
<li><a class="reference internal" href="#">Known Limitations</a><ul>
<li><a class="reference internal" href="#design-limitations">Design limitations</a><ul>
<li><a class="reference internal" href="#large-transactions">Large transactions</a></li>
<li><a class="reference internal" href="#large-keys-and-values">Large keys and values</a></li>
<li><a class="reference internal" href="#spinning-hdds">Spinning HDDs</a></li>
<li><a class="reference internal" href="#key-selectors-with-large-offsets-are-slow">Key selectors with large offsets are slow</a></li>
<li><a class="reference internal" href="#not-a-security-boundary">Not a security boundary</a></li>
</ul>
</li>
<li><a class="reference internal" href="#current-limitations">Current limitations</a><ul>
<li><a class="reference internal" href="#long-running-transactions">Long running transactions</a></li>
<li><a class="reference internal" href="#cluster-size">Cluster size</a></li>
<li><a class="reference internal" href="#database-size">Database size</a></li>
<li><a class="reference internal" href="#limited-read-load-balancing">Limited read load balancing</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<div class="body col-md-9 content" role="main">
<section id="known-limitations">
<span id="id1"></span><h1>Known Limitations</h1>
<p>FoundationDB has limitations, some of which may be addressed in future versions.</p>
<dl class="simple">
<dt>For related information, also see:</dt><dd><ul class="simple">
<li><p><a class="reference internal" href="platforms.html"><span class="doc">Platform Issues</span></a> that affect the operation of FoundationDB.</p></li>
<li><p><a class="reference internal" href="configuration.html#system-requirements"><span class="std std-ref">System requirements</span></a> for OS/hardware requirements.</p></li>
<li><p><a class="reference internal" href="anti-features.html"><span class="doc">Anti-Features</span></a> for limitations of the scope of the FoundationDB core.</p></li>
<li><p><a class="reference internal" href="developer-guide.html#developer-guide-peformance-considerations"><span class="std std-ref">Performance considerations</span></a> for how different workloads can limit performance.</p></li>
</ul>
</dd>
</dl>
<section id="design-limitations">
<h2>Design limitations</h2>
<p>These limitations come from fundamental design decisions and are unlikely to change in the short term. Applications using FoundationDB should plan to work around these limitations. See <a class="reference internal" href="anti-features.html"><span class="doc">Anti-Features</span></a> for related discussion of our design approach to the FoundationDB core.</p>
<section id="large-transactions">
<span id="id2"></span><h3>Large transactions</h3>
<p>Transaction size cannot exceed 10,000,000 bytes of affected data. Keys, values, and ranges that you write are included as affected data. Keys and ranges that you read are also included as affected data, but values that you read are not. Likewise, conflict ranges that you <a class="reference internal" href="api-python.html#api-python-conflict-ranges"><span class="std std-ref">add</span></a> or remove (using a <a class="reference internal" href="api-python.html#api-python-snapshot-reads"><span class="std std-ref">snapshot read</span></a> or a <a class="reference internal" href="api-python.html#api-python-no-write-conflict-range"><span class="std std-ref">transaction option</span></a>) are also added or removed from the scope of affected data.</p>
<p>If any single transaction exceeds one megabyte of affected data, you should modify your design. In the current version, these large transactions can cause performance issues and database availability can (briefly) be impacted.</p>
<div class="admonition-workarounds admonition">
<p class="admonition-title">Workarounds</p>
<p>See the discussion in <a class="reference internal" href="#long-transactions"><span class="std std-ref">long transactions</span></a> for applicable workarounds.</p>
</div>
</section>
<section id="large-keys-and-values">
<span id="id3"></span><h3>Large keys and values</h3>
<p>Keys cannot exceed 10,000 bytes in size. Values cannot exceed 100,000 bytes in size. Errors will be raised by the client if these limits are exceeded.</p>
<div class="admonition-workarounds admonition">
<p class="admonition-title">Workarounds</p>
<p>FoundationDB provides efficient ways to <a class="reference internal" href="largeval.html"><span class="doc">design keys and values</span></a> to work around this limitation.</p>
</div>
</section>
<section id="spinning-hdds">
<span id="id4"></span><h3>Spinning HDDs</h3>
<p>FoundationDB is only designed for good performance with rotational disk drives when using the durable <a class="reference internal" href="configuration.html#configuration-storage-engine-memory"><span class="std std-ref">memory</span></a> storage engine. It is not recommended that you run FoundationDB on rotational HDDs when using the <a class="reference internal" href="configuration.html#configuration-storage-engine-ssd"><span class="std std-ref">ssd</span></a> storage engine. Many algorithms and optimizations have been made to specifically target good performance on solid-state storage that do not translate well to HDDs. Reduced performance and/or database availability issues can be expected.</p>
<div class="admonition-recommendation admonition">
<p class="admonition-title">Recommendation</p>
<p>Large disk arrays and abstracted storage subsystems with sufficient I/O performance may be able to overcome this limitation, but testing specific use cases will be required.</p>
</div>
</section>
<section id="key-selectors-with-large-offsets-are-slow">
<span id="dont-use-key-selectors-for-paging"></span><h3>Key selectors with large offsets are slow</h3>
<p>The current version of FoundationDB resolves key selectors with large offsets in O(offset) time. A common misusage of key selectors is using offsets to page through a large range of data (i.e. reading a+0 to a+100, then a+100 to a+200, etc.)</p>
<div class="admonition-workarounds admonition">
<p class="admonition-title">Workarounds</p>
<p>An efficient alternative is to use the limit parameter with range reads, starting subsequent reads at the key after the last one returned. You can also use the iterator functionality available in most of the language bindings, which uses this technique internally.</p>
<p>The RankedSet layer provides a data structure in which large offsets and counting operations require only O(log N) time. It is a good choice for applications such as large leaderboards that require such functionality.</p>
</div>
</section>
<section id="not-a-security-boundary">
<h3>Not a security boundary</h3>
<p>Anyone who can connect to a FoundationDB cluster can read and write every key in the database. There is no user-level access control. External protections must be put into place to protect your database.</p>
</section>
</section>
<section id="current-limitations">
<h2>Current limitations</h2>
<p>These limitations do not reflect fundamental aspects of our design and are likely to be resolved or mitigated in future versions. Administrators should be aware of these issues, but longer-term application development should be less driven by them.</p>
<section id="long-running-transactions">
<span id="long-transactions"></span><h3>Long running transactions</h3>
<p>FoundationDB currently does not support transactions running for over five seconds. In particular, after 5 seconds from the first read in a transaction:</p>
<ul class="simple">
<li><p>subsequent reads that go to the database will usually raise a <code class="docutils literal notranslate"><span class="pre">transaction_too_old</span></code> <a class="reference internal" href="api-error-codes.html"><span class="doc">error</span></a> (although reads cached by the client will not);</p></li>
<li><p>a commit with any write will raise a <code class="docutils literal notranslate"><span class="pre">transaction_too_old</span></code> or <code class="docutils literal notranslate"><span class="pre">not_committed</span></code> <a class="reference internal" href="api-error-codes.html"><span class="doc">error</span></a>.</p></li>
</ul>
<p>Long running read/write transactions are a design limitation, see the discussion in <a class="reference internal" href="anti-features.html"><span class="doc">Anti-Features</span></a>.</p>
<div class="admonition-workarounds admonition">
<p class="admonition-title">Workarounds</p>
<p>The effect of long and large transactions can be achieved using short and small transactions with a variety of techniques, depending on the desired behavior:</p>
<ul class="simple">
<li><p>If an application wants long transactions because of an external process in the loop, it can perform optimistic validation itself at a higher layer.</p></li>
<li><p>If it needs long-running read snapshots, it can perform versioning in a layer.</p></li>
<li><p>If it needs large bulk inserts, it can use a level of indirection to swap in the inserted data quickly.</p></li>
</ul>
</div>
</section>
<section id="cluster-size">
<span id="id5"></span><h3>Cluster size</h3>
<p>FoundationDB has undergone performance testing and tuning with clusters of up to 500 cores/processes. Significantly larger clusters may experience performance bottlenecks leading to sub-linear scaling or related issues.</p>
</section>
<section id="database-size">
<h3>Database size</h3>
<p>FoundationDB has been tested with databases up to 100 TB (total size of key-value pairs required disk space will be significantly higher after replication and overhead).</p>
</section>
<section id="limited-read-load-balancing">
<h3>Limited read load balancing</h3>
<p>FoundationDB load balances reads across the servers with replicas of the data being read. However, it does not currently increase the replication factor of keys that are frequently read. As a result, the aggregate read performance of any given key or small contiguous set of keys in a triple-replicated system is limited to the total performance of three server processes (typically on the order of 100,000 reads per second).</p>
<div class="admonition-workarounds admonition">
<p class="admonition-title">Workarounds</p>
<p>If data is accessed exceptionally frequently, an application could avoid this limitation by storing such data in multiple subspaces, effectively increasing its replication factor.</p>
</div>
</section>
</section>
</section>
</div>
</div>
</div>
<footer class="footer">
<div class="container">
<p class="pull-right">
<a href="#">Back to top</a>
<br/>
<div id="sourcelink">
<a href="_sources/known-limitations.rst.txt"
rel="nofollow">Source</a>
</div>
</p>
<p>
&copy; Copyright 2013-2022 Apple, Inc and the FoundationDB project authors.<br/>
Last updated on Nov 20, 2024.<br/>
</p>
</div>
</footer>
</body>
</html>