blob: 3a88ef0ac4008d9c2ccbff41e7bd84cfc0474f4b [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<title>Apache BookKeeper&trade; - BP-29: Metadata API module</title>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="/css/normalize.css">
<link rel="stylesheet" href="/css/tippy.css">
<link rel="stylesheet" href="/css/style.css">
<link rel="shortcut icon" href="/img/favicon.ico">
<script src="/js/tippy.min.js"></script>
<script type="text/javascript">
var shiftWindow = function() { scrollBy(0, -25); };
window.addEventListener("hashchange", shiftWindow);
window.addEventListener("pageshow", shiftWindow);
function load() { if (window.location.hash) shiftWindow(); }
</script>
</head>
<body class="body">
<main class="main">
<nav class="navbar bk-topnav">
<div class="navbar-brand">
<a class="navbar-item bk-brand" href="/">
Apache BookKeeper&trade;
</a>
<div class="navbar-burger burger" data-target="bkNav">
<span></span>
<span></span>
<span></span>
</div>
</div>
<div id="bkNav" class="navbar-menu">
<div class="navbar-start">
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link">Documentation</a>
<div class="navbar-dropdown is-boxed">
<a class="navbar-item" href="/docs/latest/overview/overview">
Version 4.15.0-SNAPSHOT
<span class="tag is-warning">Development</span>
</a>
<a class="navbar-item" href="/docs/latest/api/javadoc">
<span class="icon bk-javadoc-icon">
<img src="/img/java-icon.svg">
</span>
Javadoc
</a>
<hr class="dropdown-divider">
<a class="navbar-item" href="/docs/4.14.0/overview/overview">
Release 4.14.0
</a>
<a class="navbar-item" href="/docs/4.13.0/overview/overview">
Release 4.13.0
</a>
<a class="navbar-item" href="/docs/4.12.1/overview/overview">
Release 4.12.1
</a>
<a class="navbar-item" href="/docs/4.12.0/overview/overview">
Release 4.12.0
</a>
<a class="navbar-item" href="/docs/4.11.1/overview/overview">
Release 4.11.1
<span class="tag is-success">Stable</span>
</a>
<a class="navbar-item" href="/docs/4.11.0/overview/overview">
Release 4.11.0
</a>
<a class="navbar-item" href="/docs/4.10.0/overview/overview">
Release 4.10.0
</a>
<a class="navbar-item" href="/archives/docs/r4.9.2">
Release 4.9.2
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.9.1">
Release 4.9.1
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.9.0">
Release 4.9.0
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.8.2">
Release 4.8.2
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.8.1">
Release 4.8.1
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.8.0">
Release 4.8.0
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.7.3">
Release 4.7.3
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.7.2">
Release 4.7.2
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.7.1">
Release 4.7.1
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.7.0">
Release 4.7.0
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.6.2">
Release 4.6.2
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.6.1">
Release 4.6.1
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.6.0">
Release 4.6.0
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.5.1">
Release 4.5.1
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.5.0">
Release 4.5.0
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.4.0">
Release 4.4.0
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.3.2">
Release 4.3.2
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.3.1">
Release 4.3.1
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.3.0">
Release 4.3.0
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.2.4">
Release 4.2.4
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.2.3">
Release 4.2.3
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.2.2">
Release 4.2.2
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.2.1">
Release 4.2.1
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.2.0">
Release 4.2.0
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.1.0">
Release 4.1.0
<span class="tag is-warning">EOL</span>
</a>
<a class="navbar-item" href="/archives/docs/r4.0.0">
Release 4.0.0
<span class="tag is-warning">EOL</span>
</a>
</div>
</div>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link">Community</a>
<div class="navbar-dropdown is-boxed">
<a class="navbar-item" href="/community/mailing-lists">Mailing lists</a>
<a class="navbar-item" href="/community/slack">Slack</a>
<a class="navbar-item" href="https://github.com/apache/bookkeeper/issues">Github Issues</a>
<a class="navbar-item" href="/community/releases">Release Management</a>
<a class="navbar-item" href="/community/meeting">Community Meetings</a>
<hr class="dropdown-divider">
<a class="navbar-item" href="/community/contributing">Contribution Guide</a>
<a class="navbar-item" href="/community/coding_guide">Coding Guide</a>
<a class="navbar-item" href="/community/testing">Testing Guide</a>
<a class="navbar-item" href="/community/issue-report">Issue Report Guide</a>
<a class="navbar-item" href="/community/release_guide">Release Guide</a>
<hr class="dropdown-divider">
<a class="navbar-item" href="/community/presentations">Presentations</a>
<a class="navbar-item" href="/community/bookkeeper_proposals">BookKeeper Proposals</a>
</div>
</div>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link">Project</a>
<div class="navbar-dropdown is-boxed">
<a class="navbar-item" href="/project/who">Who are we?</a>
<a class="navbar-item" href="/project/bylaws">Bylaws</a>
<a class="navbar-item" href="http://www.apache.org/licenses/">License</a>
<hr class="dropdown-divider">
<a class="navbar-item" href="/project/privacy">Privacy policy</a>
<a class="navbar-item" href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a>
<a class="navbar-item" href="http://www.apache.org/foundation/thanks.html">Thanks</a>
</div>
</div>
</div>
<div class="navbar-end">
<div class="navbar-item">
<div class="field is-grouped">
<p class="control">
<a class="button bk-twitter" href="https://twitter.com/asfbookkeeper">
<span class="icon">
<i class="fa fa-twitter"></i>
</span>
<span>Twitter</span>
</a>
</p>
<p class="control">
<a class="button" href="https://github.com/apache/bookkeeper">
<span class="icon">
<i class="fa fa-github"></i>
</span>
<span>GitHub</span>
</a>
</p>
<p class="control">
<a class="button is-primary" href="/releases">
<span class="icon">
<i class="fa fa-download"></i>
</span>
<span>Download</span>
</a>
</p>
</div>
</div>
</div>
</div>
</nav>
<div class="bk-community-container">
<div class="columns">
<div class="column is-12">
<header class="docs-title">
<nav class="level">
<div class="level-left">
<div class="level-item">
<h1 class="title">BP-29: Metadata API module</h1>
</div>
</div>
</nav>
</header>
<hr />
<div class="content is-medium">
<section class="bk-community-content">
<h3 id="motivation">Motivation</h3>
<p>We have already abstracted all the metadata operations into interfaces. And all the bookkeeper implementations only reply on metadata interfaces,
rather than depending on zookeeper. This proposal is to organize the metadata interfaces and its implementations in a separate module and make
bookkeeper implementation only depends on metadata interfaces, not depends on zookeeper. This would a few benefits:</p>
<ul>
<li>It allows supporting different metadata storages, without bringing in dependencies of metadata store implementation directly into
bookkeeper-server module. The development of different metadata storage can be done without interleaving with each other.</li>
<li>It would define a clean module dependency between bookkeeper implementation and metadata api, and how bookkeeper load a different metadata
implementation.</li>
</ul>
<h3 id="public-interfaces">Public Interfaces</h3>
<p>A more generic setting <code class="highlighter-rouge">metadataServiceUri</code> is introduced for replacing implementation specific settings <code class="highlighter-rouge">zkServers</code> and <code class="highlighter-rouge">zkLedgersRootPath</code>.</p>
<p>A metadata service uri defines the location of a metadata storage. In zookeeper based implementation, the metadata service url will be
<code class="highlighter-rouge">zk://&lt;zkServers&gt;/&lt;zkLedgersRootPath&gt;</code>.</p>
<p>This new setting in bookie configuration will be like as below:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>metadataServiceUri=zk://127.0.0.1/ledgers
</code></pre></div></div>
<p>If we eventually support Etcd as one of the metadata storages. Then the setting in bookie configuration to use Etcd will be:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>metadataServiceUri=etcd://&lt;etcd_servers&gt;/&lt;etcd_key_prefix&gt;
</code></pre></div></div>
<h3 id="proposed-changes">Proposed Changes</h3>
<h4 id="configuration">Configuration</h4>
<p>This BP proposes introducing a more generic metadata setting <code class="highlighter-rouge">metadataServiceUri</code> to replace implementation specific settings
<code class="highlighter-rouge">zkServers</code> and <code class="highlighter-rouge">zkLedgersRootPath</code>. All implementation specific settings should be considered moving to implementation itself.</p>
<p>The <code class="highlighter-rouge">metadataServiceUri</code> can also be used for replacing the need of configuring <code class="highlighter-rouge">ledgerManagerFactoryClass</code>, <code class="highlighter-rouge">registrationClientClass</code> and
<code class="highlighter-rouge">registrationManagerClass</code>. It is unnecessarily complicated to configure multiple settings to load a specific metadata implementation.
We can just use the <code class="highlighter-rouge">scheme</code> field in <code class="highlighter-rouge">metadataServiceUri</code> to resolve which metadata implementation to use. Using uri to resolve
different driver or implementation is commonly seen at java world, for example, jdbc to support different database drivers. Also, distributedlog
uses this pattern to load different metadata driver.</p>
<p>So in zookeeper based metadata implementation, the metadata service uri can be:</p>
<ul>
<li><code class="highlighter-rouge">zk+flat://127.0.0.1/ledgers</code>: the scheme is “zk+flat”. it means a zookeeper base metadata implementation and it uses flat ledger manager.</li>
<li><code class="highlighter-rouge">zk+hierarchical://127.0.0.1/ledgers</code>: the scheme is “zk+hierarchical”. it means a zookeeper base metadata implementation and it
uses hierarchical ledger manager.</li>
<li><code class="highlighter-rouge">zk+longhierarchical://127.0.0.1/ledgers</code>: the scheme is “zk+longhierarchical”. it means a zookeeper base metadata implementation and it
uses long hierarchical ledger manager.</li>
</ul>
<h4 id="metadata-stores">Metadata Stores</h4>
<p>Introduce a new directory called <code class="highlighter-rouge">metadata-stores</code> for storing all the metadata related modules. Under this directory, it will have following modules:</p>
<ul>
<li><code class="highlighter-rouge">api</code>: it is the metadata api module <code class="highlighter-rouge">metadata-store-api</code>. It contains all the files defining the metadata interfaces.</li>
<li><code class="highlighter-rouge">zookeeper</code>: it is the zookeeper implementation module <code class="highlighter-rouge">metadata-store-zookeeper</code>. It contains all the files that implementing the metadata interfaces
using zookeeper.</li>
</ul>
<p>If a new metadata implementation is added, a new directory will be created under <code class="highlighter-rouge">metadata-stores</code> to contain the implementation. For example, if we
are adding <code class="highlighter-rouge">Etcd</code> as the metadata store. A <code class="highlighter-rouge">Etcd</code> directory will be created under <code class="highlighter-rouge">metadata-stores/etcd</code> to store the files that implement metadata
interfaces using etcd client. And its module is named as <code class="highlighter-rouge">metadata-store-etcd</code>.</p>
<p>We then change bookkeeper-server to depend on <code class="highlighter-rouge">metadata-store-api</code> only.</p>
<p>This approach is same as other pluggable modules <code class="highlighter-rouge">stats-api</code> and <code class="highlighter-rouge">http-server</code>.</p>
<h3 id="compatibility-deprecation-and-migration-plan">Compatibility, Deprecation, and Migration Plan</h3>
<p>No compatibility concern at this moment. New setting is introduced and old settings will still continue to work.
No immediate deprecation.
No migration is needed.</p>
<h3 id="test-plan">Test Plan</h3>
<p>This proposal is mostly around refactor. So existing test cases would cover this.</p>
<h3 id="rejected-alternatives">Rejected Alternatives</h3>
<p>N/A</p>
</section>
</div>
</div>
</div>
</div>
</main>
<footer class="footer">
<div class="container">
<div class="content has-text-centered">
<p>
Copyright &copy; 2016 - 2021 <a href="https://www.apache.org/">The Apache Software Foundation</a>,<br /> licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, version 2.0</a>.
</p>
<p>
Apache BookKeeper, BookKeeper®, Apache®, the Apache feature logo, and the Apache BookKeeper logo are either registered trademarks or trademarks of The Apache Software Foundation.
</p>
</div>
</div>
</footer>
</body>
<script src="/js/app.js"></script>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-104419626-1', 'auto');
ga('send', 'pageview');
</script>
</html>