| import{_ as t,O as e,P as i,ah as l,aW as a}from"./framework-e4340ccd.js";const n={},o=a('<h1 id="分布式" tabindex="-1"><a class="header-anchor" href="#分布式" aria-hidden="true">#</a> 分布式</h1><h2 id="集群基本概念" tabindex="-1"><a class="header-anchor" href="#集群基本概念" aria-hidden="true">#</a> 集群基本概念</h2><p>Apache IoTDB 集群版包含两种角色的节点,ConfigNode 和 DataNode,分别为不同的进程,可独立部署。</p><p>集群架构示例如下图:</p><img style="width:100%;max-width:500px;max-height:400px;margin-left:auto;margin-right:auto;display:block;" src="https://alioss.timecho.com/docs/img/UserGuide/Cluster/Architecture.png"><p>ConfigNode 是集群的控制节点,管理集群的节点状态、分区信息等,集群所有 ConfigNode 组成一个高可用组,数据全量备份。</p><p>注意:ConfigNode 的副本数是集群当前加入的 ConfigNode 个数,一半以上的 ConfigNode 存活集群才能提供服务。</p><p>DataNode 是集群的数据节点,管理多个数据分片、元数据分片,数据即时间序列中的时间戳和值,元数据为时间序列的路径信息、数据类型等。</p><p>Client 只能通过 DataNode 进行数据读写。</p><h3 id="名词解释" tabindex="-1"><a class="header-anchor" href="#名词解释" aria-hidden="true">#</a> 名词解释</h3><table><thead><tr><th style="text-align:left;">名词</th><th style="text-align:left;">类型</th><th style="text-align:left;">解释</th></tr></thead><tbody><tr><td style="text-align:left;">ConfigNode</td><td style="text-align:left;">节点角色</td><td style="text-align:left;">配置节点,管理集群节点信息、分区信息,监控集群状态、控制负载均衡</td></tr><tr><td style="text-align:left;">DataNode</td><td style="text-align:left;">节点角色</td><td style="text-align:left;">数据节点,管理数据、元数据</td></tr><tr><td style="text-align:left;">Database</td><td style="text-align:left;">元数据</td><td style="text-align:left;">数据库,不同数据库的数据物理隔离</td></tr><tr><td style="text-align:left;">DeviceId</td><td style="text-align:left;">设备名</td><td style="text-align:left;">元数据树中从 root 到倒数第二级的全路径表示一个设备名</td></tr><tr><td style="text-align:left;">SeriesSlot</td><td style="text-align:left;">元数据分区</td><td style="text-align:left;">每个 Database 包含多个元数据分区,根据设备名进行分区</td></tr><tr><td style="text-align:left;">SchemaRegion</td><td style="text-align:left;">一组元数据分区</td><td style="text-align:left;">多个 SeriesSlot 的集合</td></tr><tr><td style="text-align:left;">SchemaRegionGroup</td><td style="text-align:left;">逻辑概念</td><td style="text-align:left;">包含元数据副本数个 SchemaRegion,管理相同的元数据,互为备份</td></tr><tr><td style="text-align:left;">SeriesTimeSlot</td><td style="text-align:left;">数据分区</td><td style="text-align:left;">一个元数据分区的一段时间的数据对应一个数据分区,每个元数据分区对应多个数据分区,根据时间范围进行分区</td></tr><tr><td style="text-align:left;">DataRegion</td><td style="text-align:left;">一组数据分区</td><td style="text-align:left;">多个 SeriesTimeSlot 的集合</td></tr><tr><td style="text-align:left;">DataRegionGroup</td><td style="text-align:left;">逻辑概念</td><td style="text-align:left;">包含数据副本数个 DataRegion,管理相同的数据,互为备份</td></tr></tbody></table><h2 id="集群特点" tabindex="-1"><a class="header-anchor" href="#集群特点" aria-hidden="true">#</a> 集群特点</h2><ul><li>原生分布式 <ul><li>IoTDB 各模块原生支持分布式。</li><li>Standalone 是分布式的一种特殊的部署形态。</li></ul></li><li>扩展性 <ul><li>支持秒级增加节点,无需进行数据迁移。</li></ul></li><li>大规模并行处理架构 MPP <ul><li>采用大规模并行处理架构及火山模型进行数据处理,具有高扩展性。</li></ul></li><li>可根据不同场景需求选择不同的共识协议 <ul><li>数据副本组和元数据副本组,可以采用不同的共识协议。</li></ul></li><li>可扩展分区策略 <ul><li>集群采用分区表管理数据和元数据分区,自定义灵活的分配策略。</li></ul></li><li>内置监控框架 <ul><li>内置集群监控,可以监控集群节点。</li></ul></li></ul><h2 id="分区策略" tabindex="-1"><a class="header-anchor" href="#分区策略" aria-hidden="true">#</a> 分区策略</h2><p>分区策略将数据和元数据划分到不同的 RegionGroup 中,并把 RegionGroup 的 Region 分配到不同的 DataNode。</p><p>推荐设置 1 个 database,集群会根据节点数和核数动态分配资源。</p><p>Database 包含多个 SchemaRegion 和 DataRegion,由 DataNode 管理。</p><ul><li><p>元数据分区策略</p><ul><li>对于一条未使用模板的时间序列的元数据,ConfigNode 会根据设备 ID (从 root 到倒数第二层节点的全路径)映射到一个序列分区,并将此序列分区分配到一组 SchemaRegion 中。</li></ul></li><li><p>数据分区策略</p><ul><li>对于一个时间序列数据点,ConfigNode 会根据设备 ID 映射到一个序列分区(纵向分区),再根据时间戳映射到一个序列时间分区(横向分区),并将此序列时间分区分配到一组 DataRegion 中。</li></ul></li></ul><p>IoTDB 使用了基于槽的分区策略,因此分区信息的大小是可控的,不会随时间序列或设备数无限增长。</p><p>Region 会分配到不同的 DataNode 上,分配 Region 时会保证不同 DataNode 的负载均衡。</p><h2 id="复制策略" tabindex="-1"><a class="header-anchor" href="#复制策略" aria-hidden="true">#</a> 复制策略</h2><p>复制策略将数据复制多份,互为副本,多个副本可以一起提供高可用服务,容忍部分副本失效的情况。</p><p>Region 是数据复制的基本单位,一个 Region 的多个副本构成了一个高可用复制组,数据互为备份。</p><ul><li>集群内的副本组 <ul><li>ConfigNodeGroup:由所有 ConfigNode 组成。</li><li>SchemaRegionGroup:集群有多个元数据组,每个 SchemaRegionGroup 内有多个 ID 相同的 SchemaRegion。</li><li>DataRegionGroup:集群有多个数据组,每个 DataRegionGroup 内有多个 ID 相同的 DataRegion。</li></ul></li></ul><p>完整的集群分区复制的示意图如下:</p><img style="width:100%;max-width:500px;max-height:500px;margin-left:auto;margin-right:auto;display:block;" src="https://alioss.timecho.com/docs/img/UserGuide/Cluster/Data-Partition.png"><p>图中包含 1 个 SchemaRegionGroup,元数据采用 3 副本,因此 3 个白色的 SchemaRegion-0 组成了一个副本组。</p><p>图中包含 3 个 DataRegionGroup,数据采用 3 副本,因此一共有 9 个 DataRegion。</p><h2 id="共识协议-一致性协议" tabindex="-1"><a class="header-anchor" href="#共识协议-一致性协议" aria-hidden="true">#</a> 共识协议(一致性协议)</h2><p>每个副本组的多个副本之间,都通过一个具体的共识协议保证数据一致性,共识协议会将读写请求应用到多个副本上。</p><ul><li>现有的共识协议 <ul><li>SimpleConsensus:提供强一致性,仅单副本时可用,一致性协议的极简实现,效率最高。</li><li>IoTConsensus:提供最终一致性,任意副本数可用,2 副本时可容忍 1 节点失效,当前仅可用于 DataRegion 的副本上,写入可以在任一副本进行,并异步复制到其他副本。</li><li>RatisConsensus:提供强一致性,Raft 协议的一种实现,任意副本数可用,当前可用于任意副本组上。目前DataRegion使用RatisConsensus时暂不支持多数据目录,预计会在后续版本中支持这一功能。</li></ul></li></ul>',31);function d(r,s){return e(),i("div",null,[l(` |
| |
| \`\`\` |
| 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. |
| \`\`\` |
| |
| `),o])}const g=t(n,[["render",d],["__file","Cluster-Concept.html.vue"]]);export{g as default}; |