| |
| |
| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="utf-8"> |
| <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| <meta name="viewport" content="width=device-width, initial-scale=1"> |
| |
| <meta name="description" content="Apache Ozone Documentation"> |
| |
| <title>Documentation for Apache Ozone</title> |
| |
| |
| <link href="../../css/bootstrap.min.css" rel="stylesheet"> |
| |
| |
| <link href="../../css/ozonedoc.css" rel="stylesheet"> |
| |
| |
| |
| <link href="../../swagger-resources/swagger-ui.css" rel="stylesheet"> |
| |
| |
| <script> |
| var _paq = window._paq = window._paq || []; |
| |
| |
| |
| _paq.push(['disableCookies']); |
| |
| |
| _paq.push(['trackPageView']); |
| _paq.push(['enableLinkTracking']); |
| (function() { |
| var u="//analytics.apache.org/"; |
| _paq.push(['setTrackerUrl', u+'matomo.php']); |
| _paq.push(['setSiteId', '34']); |
| var d=document, g=d.createElement('script'), |
| s=d.getElementsByTagName('script')[0]; |
| g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s); |
| })(); |
| </script> |
| |
| |
| </head> |
| |
| |
| <body> |
| |
| |
| <nav class="navbar navbar-inverse navbar-fixed-top"> |
| <div class="container-fluid"> |
| <div class="navbar-header"> |
| <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#sidebar" aria-expanded="false" aria-controls="navbar"> |
| <span class="sr-only">Toggle navigation</span> |
| <span class="icon-bar"></span> |
| <span class="icon-bar"></span> |
| <span class="icon-bar"></span> |
| </button> |
| <a href="../../zh/index.html" class="navbar-left ozone-logo"> |
| <img src="../../ozone-logo-small.png"/> |
| </a> |
| <a class="navbar-brand hidden-xs" href="../../zh/index.html"> |
| Apache Ozone/HDDS Documentation |
| </a> |
| <a class="navbar-brand visible-xs-inline" href="#">Apache Ozone</a> |
| </div> |
| <div id="navbar" class="navbar-collapse collapse"> |
| <ul class="nav navbar-nav navbar-right"> |
| <li><a href="https://github.com/apache/ozone">Source</a></li> |
| <li><a href="https://ozone.apache.org">Apache Ozone</a></li> |
| <li><a href="https://apache.org">ASF</a></li> |
| </ul> |
| </div> |
| </div> |
| </nav> |
| |
| |
| <div class="wrapper"> |
| <div class="container-fluid"> |
| <div class="row"> |
| |
| <div class="col-sm-2 col-md-2 sidebar" id="sidebar"> |
| <ul class="nav nav-sidebar"> |
| |
| |
| |
| <li class=""> |
| |
| <a href="../../zh/index.html"> |
| |
| |
| |
| <span>概述</span> |
| </a> |
| </li> |
| |
| |
| |
| <li class=""> |
| |
| <a href="../../zh/start.html"> |
| |
| |
| |
| <span>快速入门</span> |
| </a> |
| </li> |
| |
| |
| |
| <li class=""> |
| <a href="../../zh/concept.html"> |
| |
| <span>概念</span> |
| </a> |
| <ul class="nav"> |
| |
| <li class=""> |
| |
| <a href="../../zh/concept/overview.html">概览</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../../zh/concept/ozonemanager.html">Ozone Manager</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../../zh/concept/storagecontainermanager.html">Storage Container Manager</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../../zh/concept/datanodes.html">数据节点</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../../zh/concept/containers.html">Containers</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../../zh/concept/recon.html">Recon</a> |
| |
| </li> |
| |
| </ul> |
| </li> |
| |
| |
| |
| <li class=""> |
| <a href="../../zh/feature.html"> |
| |
| <span>特性</span> |
| </a> |
| <ul class="nav"> |
| |
| <li class=""> |
| |
| <a href="../../zh/feature/decommission.html">Decommissioning</a> |
| |
| </li> |
| |
| <li class="active"> |
| |
| <a href="../../zh/feature/erasurecoding.html">纠删码</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../../zh/feature/om-ha.html">高可用 OM</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../../zh/feature/scm-ha.html">高可用 SCM</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../../zh/feature/dn-merge-rocksdb.html">在DataNode上合并Container的RocksDB</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../../zh/feature/prefixfso.html">基于前缀的文件系统优化</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../../zh/feature/topology.html">拓扑感知能力</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../../zh/feature/quota.html">Ozone 中的配额</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../../zh/feature/recon.html">Recon 服务器</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../../zh/feature/reconfigurability.html">动态加载配置</a> |
| |
| </li> |
| |
| </ul> |
| </li> |
| |
| |
| |
| <li class=""> |
| <a href="../../zh/security.html"> |
| |
| <span>安全</span> |
| </a> |
| <ul class="nav"> |
| |
| <li class=""> |
| |
| <a href="../../zh/security/secureozone.html">安全化 Ozone</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../../zh/security/securingtde.html">透明数据加密</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../../zh/security/gdpr.html">Ozone 中的 GDPR</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../../zh/security/securingdatanodes.html">安全化 Datanode</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../../zh/security/securings3.html">安全化 S3</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../../zh/security/securityacls.html">Ozone 访问控制列表</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../../zh/security/securitywithranger.html">Apache Ranger</a> |
| |
| </li> |
| |
| </ul> |
| </li> |
| |
| |
| |
| <li class=""> |
| <a href="../../zh/interface.html"> |
| |
| <span>编程接口</span> |
| </a> |
| <ul class="nav"> |
| |
| <li class=""> |
| |
| <a href="../../zh/interface/javaapi.html">Java API</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../../zh/interface/o3fs.html">Ozone 文件系统</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../../zh/interface/csi.html">CSI 协议</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../../zh/interface/s3.html">S3 协议接口</a> |
| |
| </li> |
| |
| <li class=""> |
| |
| <a href="../../zh/interface/reconapi.html">Recon API</a> |
| |
| </li> |
| |
| </ul> |
| </li> |
| |
| |
| |
| <li class=""> |
| |
| <a href="../../zh/tools.html"> |
| |
| |
| |
| <span>工具</span> |
| </a> |
| </li> |
| |
| |
| |
| <li class=""> |
| |
| <a href="../../zh/recipe.html"> |
| |
| |
| |
| <span>使用配方</span> |
| </a> |
| </li> |
| |
| |
| <li><a href="../../design.html"><span><b>Design docs</b></span></a></li> |
| <li class="visible-xs"><a href="#">References</a> |
| <ul class="nav"> |
| <li><a href="https://github.com/apache/ozone"><span class="glyphicon glyphicon-new-window" aria-hidden="true"></span> Source</a></li> |
| <li><a href="https://ozone.apache.org"><span class="glyphicon glyphicon-new-window" aria-hidden="true"></span> Apache Ozone</a></li> |
| <li><a href="https://apache.org"><span class="glyphicon glyphicon-new-window" aria-hidden="true"></span> ASF</a></li> |
| </ul></li> |
| </ul> |
| |
| </div> |
| |
| <div class="col-sm-10 col-sm-offset-2 col-md-10 col-md-offset-2 main-content"> |
| |
| |
| |
| <div class="col-md-9"> |
| <nav aria-label="breadcrumb"> |
| <ol class="breadcrumb"> |
| <li class="breadcrumb-item"><a href="../../zh/index.html">Home</a></li> |
| <li class="breadcrumb-item" aria-current="page"><a href="../../zh/feature.html">特性</a></li> |
| <li class="breadcrumb-item active" aria-current="page">纠删码</li> |
| </ol> |
| </nav> |
| |
| |
| |
| <div class="pull-right"> |
| |
| |
| |
| <a href="../../feature/erasurecoding.html"><span class="label label-success">English</span></a> |
| |
| |
| |
| |
| </div> |
| |
| |
| <div class="col-md-9"> |
| <h1>纠删码</h1> |
| |
| <!--- |
| 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. |
| --> |
| <h2 id="背景">背景</h2> |
| <p>分布式系统的基本目标是提供数据可靠性。 |
| 许多储存系统会透过复制来提高可靠性,像 Ozone 支援 <code>RATIS/THREE</code> 的复制方法,但复制方法需要耗费较多的额外资源。 |
| 例如,Ozone 预设的 <code>RATIS/THREE</code> 复制架构,在原本的资源需求(包含储存空间和网路带宽等)之外,还需要消耗额外的两倍资源。 |
| 然而,对于部分低 I/O 的资料集来说,很少需要用到额外的资料副本,但依然要消耗同等的储存空间。</p> |
| <p>一个改进方法是用纠删码(Erasure Coding,简称 EC)来取代副本。纠删码可以提供同样的容错能力,但需要的额外储存空间较小。 |
| 在典型的纠删码设定中,需要的额外储存空间不超过原本空间的 50%。 |
| 因此,Ozone 引入了 ReplicationConfig 接口来指定需要的复制类型,选项有 <code>RATIS/THREE</code> 和 <code>EC</code>。</p> |
| <p>在 Ozone 中使用纠删码可以提高储存效率,并维持原本的可靠性保证。 |
| 举例来说,某个档案包含 6 个 block,并需要 3x 个副本,在备份模式下需要 6*3 = <code>18</code> 个 block。但若使用纠删码机制(6 个数据块,3 个校验块),只需要 6+3 = <code>9</code> 个 block。</p> |
| <h2 id="架构">架构</h2> |
| <p>在纠删码的实现中,数据布局是关键因素。在一些技术考量和深度分析后,最合适的方法是条带化(striping)。 |
| 条带化并不是很新的技术,目前已经被一些资料系统(例如 Quantcast File Sysytem 和 Hadoop Distributed File System 等)采用并获得成功。</p> |
| <p>举例来说,使用 6 个数据块、3 个校验块的纠删码架构中,数据切片(data chunk)会被依序分配到前 6 个资料节点,接著客户端生成 3 个校验切片(parity chunk)并存到剩下的三个节点,我们把这 9 个切片统称为条带(Stripe)。 |
| 接下来的 6 个数据切片会再被依序分到前 6 个资料节点,并产出 3 个校验切片分配到末三个节点。 |
| 这 9 个资料节点被统称为块组(BlockGroup)。</p> |
| <p>如果应用程式写入超过 <code>6 * BLOCK_SIZE</code> 的大小,客户端会和 Ozone Manager 请求新的块组。</p> |
| <h3 id="资料写入">资料写入</h3> |
| <p>在纠删码的写入过程中,核心逻辑被放在 Ozone 客户端。 |
| 当客户端新增文件,Ozone Manager 会从管线提供者(pipeline provider)分配大小为 <code>d + p</code> 的块组,并将此返回给客户端。客户端将前 d 个数据切片写入前 d 个资料节点,并缓存这些资料块以产生校验切片。在校验切片生成后,便会被依序传送到剩下的 p 个节点。 |
| 当所有块都存满后,客户端会请求新的块组节点。</p> |
| <p>下图将容器中的块分配视为逻辑组。出于篇幅考量,我们以 (3,2) 的纠删码模式来做示例。</p> |
| <p> |
| |
| <img src="EC-Write-Block-Allocation-in-Containers.png" alt='EC Block Allocation in Containers' class="img-responsive" /></p> |
| <p>让我们放大检视上图中 blockID:1 的部分。下图显示了数据切片在块中会被如何安排。</p> |
| <p> |
| |
| <img src="EC-Chunk-Layout.png" alt='EC Chunk Layout' class="img-responsive" /></p> |
| <p>目前,纠删码的客户端在传输数据的过程中,会重复使用数据传输端点。 |
| XceiverClientGRPC 客户端会用于写入数据。 |
| 因为我们会重复使用已存在的传输协定,因此 datanode 的变化很小,且纠删码写入和非纠删码写入模式是相同的。 |
| 在单个块组中,container ID 在所有节点中都相同。一个文件可以有多个块组,每个块组有 <code>d+p</code> 个块,所有块的 ID 都一样。</p> |
| <p><strong>d</strong> - 块组中资料块的数量</p> |
| <p><strong>p</strong> - 块组中校验块的数量</p> |
| <h3 id="资料读取">资料读取</h3> |
| <p>在读取中,OM 会在搜寻键时,一并提供节点的位置讯息。 |
| 如果该键是采用纠删码机制,就会以纠删码方式进行读取。 |
| 由于数据布局不同(参见上节的写入机制),读取需要考虑使用的数据布局并进行相应动作。</p> |
| <p>EC 客户端会根据位置资讯连结 datanode。当所有和 datanode 的连结都可用时,便会开始从 d 個数据块中以 round robin 方式依序读取。</p> |
| <p>下图是没有读取失败时的读取状况。</p> |
| <p> |
| |
| <img src="EC-Reads-With-No-Failures.png" alt='EC Reads With no Failures' class="img-responsive" /></p> |
| <p>除非出现读取失败,否则不需要用纠删码进行资料重建。</p> |
| <h3 id="即时重建的资料读取">即时重建的资料读取</h3> |
| <p>当客户端在开始读取前或读取中检测到故障时,Ozone EC 客户端能透过 EC 解码,重建并恢复遗失的数据。 |
| EC 解码需要读取校验副本。由于需要进行资料重建,这个过程是降解读取(degraded read)。 |
| 此重建过程对应用程式来说是完全透明的。</p> |
| <p>下图描述了如何用校验块进行资料重建。</p> |
| <p> |
| |
| <img src="EC-Reconstructional-Read.png" alt='EC Reconstructional Reads' class="img-responsive" /></p> |
| <h3 id="纠删码副本配置">纠删码副本配置</h3> |
| <p>Apache Ozone 使用物件储存模式。然而,许多大数据生态系统依然使用文件系统模式的 API。 |
| 为了提供更好的文件取得模式,Ozone 提供物件储存和档案系统两种介面。不管使哪种模式,文件最后都会被写进 bucket 中。 |
| 因此,EC 配置可以在 bucket 层级设定。 |
| EC 配置概括了如何去编译/解码文件。每个 EC 配置都包含下列几项:</p> |
| <ol> |
| <li><strong>data</strong>:EC 块组中的数据块数量</li> |
| <li><strong>parity</strong>:EC 块组中的校验块数量</li> |
| <li><strong>ecChunkSize</strong>:条带化切片(striping chunk)的大小,这会决定读写的颗粒度</li> |
| <li><strong>codec</strong>:EC 使用的演算法(例如:<code>RS</code>(Reed-Solomon)、<code>XOR</code>)。</li> |
| </ol> |
| <p>如果想要在命令行或配置文件中做 EC 副本配置,下面是指定格式: |
| <em>codec</em>-<em>num data blocks</em>-<em>num parity blocks</em>-<em>ec chunk size</em></p> |
| <p>Ozone 目前支援下列三种内建的 EC 副本配置:<code>RS-3-2-1024k</code>、<code>RS-6-3-1024k</code>、<code>XOR-2-1-1024k</code>,最推荐的选项是 <code>RS-6-3-1024k</code>。若在新增文件时没有做 EC 副本配置,则会继承 bucket 中的 EC 配置。</p> |
| <p>更改 bucket 级别的 EC 副本设定只会影响在该 bucket 底下的新文件。一旦文件建立完成,EC 的副本设置便无法修改。</p> |
| <h2 id="部署">部署</h2> |
| <h3 id="集群与硬体设置">集群与硬体设置</h3> |
| <p>EC 对集群提出了额外的 CPU 和网路需求,编译和解译动作会在 Ozone 的客户端和 datanode 上消耗额外的 CPU。 |
| EC 要求集群中 datanode 的数量至少和带宽数量相等,因此对于 (6, 3) 的 EC 配置,我们最少需要 9 个 datanode。</p> |
| <p>在纠删码机制中,文件会分布在不同几架,以实现机架层级的容错。 |
| 这表示在读取和写入条带化文件时,大多数操作都是在机架外进行的。 |
| 因此网路的对分带宽(bisection bandwidth)非常重要。</p> |
| <p>为了机架层级的容错度,拥有足够数量的机架很重要。 |
| 平均来说,每个机架拥有的块数不超过 EC 校验块的数量。 |
| 机架数计算公式如下:(数据块+校验块)/校验块,并把計算結果四捨五入。 |
| 对于 <code>RS</code> (6,3) 的 EC 配置,最少需要 3 个机架(计算过程是 (6 + 3) / 3 = 3 ), |
| 理想上最好有 9 以上的机架来处理计划内和计划外的停机。 |
| 对于机架数少于校验块数量的集群,Ozone 无法保证机架层级的容错度,但会尝试把条带化文件散佈到多节点上,确保节点层级的的容错度。 |
| 基于上述原因,建议设置具有相似 datanode 数的机架。</p> |
| <h3 id="配置">配置</h3> |
| <p>如上所述,EC 的副本配置可以在 bucket 级别启用。 |
| 可以用 <code>ozone.server.default.replication.type</code> 和 <code>ozone.server.default.replication</code> 来设定集群内副本配置的预设值。</p> |
| <div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-XML" data-lang="XML"><span style="color:#f92672"><property></span> |
| <span style="color:#f92672"><name></span>ozone.server.default.replication.type<span style="color:#f92672"></name></span> |
| <span style="color:#f92672"><value></span>EC<span style="color:#f92672"></value></span> |
| <span style="color:#f92672"></property></span> |
| |
| <span style="color:#f92672"><property></span> |
| <span style="color:#f92672"><name></span>ozone.server.default.replication<span style="color:#f92672"></name></span> |
| <span style="color:#f92672"><value></span>RS-6-3-1024k<span style="color:#f92672"></value></span> |
| <span style="color:#f92672"></property></span> |
| </code></pre></div><p>要注意的是,上述设定只有在客户端没有做任何配置,或 bucket 没有预设值才有效。</p> |
| <h4 id="在-bucket-上做-ec-配置">在 bucket 上做 EC 配置</h4> |
| <p>我们可以用 <code>ozone sh</code> 命令来做 bucket 的 EC 副本设定,EC 的相关配置可以在新增 bucket 时做设定。</p> |
| <div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">ozone sh bucket create <bucket path> --type EC --replication rs-6-3-1024k |
| </code></pre></div><p>我们还可以使用以下命令重设 EC Replication Config。</p> |
| <div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">ozone sh bucket set-replication-config <bucket path> --type EC --replication rs-3-2-1024k |
| </code></pre></div><p>重置后,只有新建的文件会受到新设定的影响,bucket 中已经建立的文件会维持旧设定。</p> |
| <h4 id="在新增文件时做-ec-配置">在新增文件时做 EC 配置</h4> |
| <p>在新增文件时可以进行 EC 副本设定,且不用考虑 bucket 的副本配置。</p> |
| <div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">ozone sh key put <Ozone Key Object Path> <Local File> --type EC --replication rs-6-3-1024k |
| </code></pre></div><p>如果 bucket 已经有预设的 EC 副本设定,那么创建文件时就不用再做设定。</p> |
| |
| |
| |
| <a class="btn btn-success btn-lg" href="../../zh/feature/om-ha.html">Next >></a> |
| |
| </div> |
| |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="push"></div> |
| </div> |
| |
| |
| |
| <footer class="footer"> |
| <div class="container"> |
| <span class="small text-muted"> |
| Version: 1.5.0-SNAPSHOT, Last Modified: February 26, 2024 <a class="hide-child link primary-color" href="https://github.com/apache/ozone/commit/1b48186a0107711235abcd2636977ae0242f6be8">1b48186</a> |
| </span> |
| </div> |
| </footer> |
| |
| |
| |
| <script src="../../js/jquery-3.5.1.min.js"></script> |
| <script src="../../js/ozonedoc.js"></script> |
| <script src="../../js/bootstrap.min.js"></script> |
| |
| |
| </body> |
| |
| </html> |