diff --git a/hadoop-hdds/docs/content/concept/OzoneManager.zh.md b/hadoop-hdds/docs/content/concept/OzoneManager.zh.md index 3fc7fbf583a7..276780542a86 100644 --- a/hadoop-hdds/docs/content/concept/OzoneManager.zh.md +++ b/hadoop-hdds/docs/content/concept/OzoneManager.zh.md @@ -77,6 +77,8 @@ Ozone Manager 使用 Apache Ratis(一种 Raft 协议的开源实现)来复 为了详细地了解 Ozone Manager ,本节针对它所提供的网络服务和持久化状态提供一个快速概述。 +### Ozone Manager 提供的网络服务 + Ozone 为客户端和管理命令提供网络服务,主要的服务如下: * 键、桶、卷 / 增删改查 @@ -93,7 +95,7 @@ Ozone 为客户端和管理命令提供网络服务,主要的服务如下: * ServiceList(用于服务发现) * DBUpdates(用于 [Recon]({{< ref path="feature/Recon.md" lang="en" >}}) 下载快照) - **持久化状态** +### 持久化状态 以下数据将保存在 Ozone Manager 端的指定 RocksDB 目录中: diff --git a/hadoop-hdds/docs/content/concept/Recon.zh.md b/hadoop-hdds/docs/content/concept/Recon.zh.md new file mode 100644 index 000000000000..5c67351782af --- /dev/null +++ b/hadoop-hdds/docs/content/concept/Recon.zh.md @@ -0,0 +1,116 @@ +--- +title: "Recon" +date: "2020-10-27" +weight: 8 +menu: + main: + parent: 概念 +summary: Recon 作为 Ozone 的管理和监视控制台。 +--- + + +Recon 充当 Ozone 的管理和监视控制台。它提供了 Ozone 的鸟瞰图,并通过基于 REST 的 API 和丰富的网页用户界面(Web UI)展示了集群的当前状态,从而帮助用户解决任何问题。 + + +## 高层次设计 + +{{
}} + +
+ +在较高的层次上,Recon 收集和汇总来自 Ozone Manager(OM)、Storage Container Manager(SCM)和数据节点(DN)的元数据,并充当中央管理和监视控制台。Ozone 管理员可以使用 Recon 查询系统的当前状态,而不会使 OM 或 SCM 过载。 + +Recon 维护多个数据库,以支持批处理,更快的查询和持久化聚合信息。它维护 OM DB 和 SCM DB 的本地副本,以及用于持久存储聚合信息的 SQL 数据库。 + +Recon 还与 Prometheus 集成,提供一个 HTTP 端点来查询 Prometheus 的 Ozone 指标,并在网页用户界面(Web UI)中显示一些关键时间点的指标。 + +## Recon 和 Ozone Manager + +{{
}} + +
+ +Recon 最初从领导者 OM 的 HTTP 端点获取 OM rocks DB 的完整快照,解压缩文件并初始化 RocksDB 以进行本地查询。通过对最后一个应用的序列 ID 的 RPC 调用,定期请求领导者 OM 进行增量更新,从而使数据库保持同步。如果由于某种原因而无法检索增量更新或将其应用于本地数据库,则会再次请求一个完整快照以使本地数据库与 OM DB 保持同步。因此,Recon 可能会显示陈旧的信息,因为本地数据库不会总是同步的。 + +## Recon 和 Storage Container Manager + +{{
}} + +
+ +Recon 还充当数据节点的被动 SCM。在集群中配置 Recon 时,所有数据节点都向 Recon 注册,并像 SCM 一样向 Recon 发送心跳、容器报告、增量容器报告等。Recon 使用它从数据节点得到的所有信息在本地构建自己的 SCM rocks DB 副本。Recon 从不向数据节点发送任何命令作为响应,而只是充当被动 SCM 以更快地查找 SCM 元数据。 + +## 任务框架 + +Recon 有其自己的任务框架,可对从 OM 和 SCM 获得的数据进行批处理。一个任务可以在 OM DB 或 SCM DB 上监听和操作数据库事件,如`PUT`、`DELETE`、`UPDATE`等。在此基础上,任务实现`org.apache.hadoop.ozone.recon.tasks.ReconOmTask`或者扩展`org.apache.hadoop.ozone.recon.scm.ReconScmTask`。 + +`ReconOmTask`的一个示例是`ContainerKeyMapperTask`,它在 RocksDB 中持久化保留了容器 -> 键映射。当容器被报告丢失或处于不健康的运行状态时,这有助于了解哪些键是容器的一部分。另一个示例是`FileSizeCountTask`,它跟踪 SQL 数据库中给定文件大小范围内的文件计数。这些任务有两种情况的实现: + + - 完整快照(reprocess()) + - 增量更新(process()) + +当从领导者 OM 获得 OM DB 的完整快照时,将对所有注册的 OM 任务调用 reprocess()。在随后的增量更新中,将在这些 OM 任务上调用 process()。 + +`ReconScmTask`的示例是`ContainerHealthTask`,它以可配置的时间间隔运行,扫描所有容器的列表,并将不健康容器的状态(`MISSING`、`MIS_REPLICATED`、`UNDER_REPLICATED`、`OVER_REPLICATED`)持久化保留在 SQL 表中。此信息用于确定集群中是否有丢失的容器。 + +## Recon 和 Prometheus + +Recon 可以与任何配置为收集指标的 Prometheus 实例集成,并且可以在数据节点和 Pipelines 页面的 Recon UI 中显示有用的信息。Recon 还公开了一个代理端点 ([/指标]({{< ref path="interface/ReconApi.zh.md#metrics" >}})) 来查询 Prometheus。可以通过将此配置`ozone.recon.prometheus.http.endpoint`设置为 Prometheus 端点如`ozone.recon.prometheus.http.endpoint=localhost:9090`来启用此集成。 + +## API 参考 + +[链接到完整的 API 参考]({{< ref path="interface/ReconApi.zh.md" >}}) + +## 持久化状态 + + * [OM database]({{< ref "concept/OzoneManager.zh.md#持久化状态" >}})的本地副本 + * [SCM database]({{< ref "concept/StorageContainerManager.zh.md#持久化状态" >}})的本地副本 + * 以下数据在 Recon 中持久化在指定的 RocksDB 目录下: + * ContainerKey 表 + * 存储映射(容器,键) -> 计数 + * ContainerKeyCount 表 + * 存储容器 ID -> 容器内的键数 + * 以下数据存储在已配置的 SQL 数据库中(默认为 Derby ): + * GlobalStats 表 + * 一个键 -> Value table 用于存储集群中出现的卷/桶/键的总数等聚合信息 + * FileCountBySize 表 + * 跟踪集群中文件大小范围内的文件数量 + * ReconTaskStatus 表 + * 跟踪在[Recon 任务框架](#task-framework)中已注册的 OM 和 SCM DB 任务的状态和最后运行时间戳 + * ContainerHistory 表 + * 存储容器副本 -> 具有最新已知时间戳记的数据节点映射。当一个容器被报告丢失时,它被用来确定最后已知的数据节点。 + * UnhealthyContainers 表 + * 随时跟踪集群中所有不健康的容器(MISSING、UNDER_REPLICATED、OVER_REPLICATED、MIS_REPLICATED) + + +## 需要关注的配置项 + +配置项 |默认值 |
描述
+----|---------|------------ +ozone.recon.http-address | 0.0.0.0:9888 | Recon web UI 监听的地址和基本端口。 +ozone.recon.address | 0.0.0.0:9891 | Recon 的 RPC 地址。 +ozone.recon.db.dir | none | Recon Server 存储其元数据的目录。 +ozone.recon.om.db.dir | none | Recon Server 存储其 OM 快照 DB 的目录。 +ozone.recon.om.snapshot
.task.interval.delay | 10m | Recon 以分钟间隔请求 OM DB 快照。 +ozone.recon.task
.missingcontainer.interval | 300s | 定期检查集群中不健康容器的时间间隔。 +ozone.recon.sql.db.jooq.dialect | DERBY | 请参考 [SQL 方言](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/SQLDialect.html) 来指定不同的方言。 +ozone.recon.sql.db.jdbc.url | jdbc:derby:${ozone.recon.db.dir}
/ozone_recon_derby.db | Recon SQL database 的 jdbc url。 +ozone.recon.sql.db.username | none | Recon SQL数据库的用户名。 +ozone.recon.sql.db.password | none | Recon SQL数据库的密码。 +ozone.recon.sql.db.driver | org.apache.derby.jdbc
.EmbeddedDriver | Recon SQL数据库的 jdbc driver。 + diff --git a/hadoop-hdds/docs/content/concept/StorageContainerManager.zh.md b/hadoop-hdds/docs/content/concept/StorageContainerManager.zh.md index 1c63f1b37c82..7adecdee0290 100644 --- a/hadoop-hdds/docs/content/concept/StorageContainerManager.zh.md +++ b/hadoop-hdds/docs/content/concept/StorageContainerManager.zh.md @@ -44,7 +44,7 @@ SCM 负责创建 Ozone 集群。当通过 `init` 命令启动 SCM 时,SCM 将 针对 Storage Container Manager 的详细视图,本节提供有关网络服务和持久化数据的快速概述。 -**Storage Container Manager 提供的网络服务:** +### Storage Container Manager 提供的网络服务: * 管道: 列出/删除/激活/停用 * 管道是形成一组复制组的数据节点 @@ -62,7 +62,7 @@ SCM 负责创建 Ozone 集群。当通过 `init` 命令启动 SCM 时,SCM 将 注意:客户端不能直接连接 SCM 。 -**持久化状态** +### 持久化状态 以下数据持久化在 Storage Container Manager 端的指定 RocksDB 目录中 @@ -83,4 +83,4 @@ ozone.scm.container.size | 5GB | Ozone 使用的默认容器的大小 ozone.scm.block.size | 256MB | 数据块的默认大小 hdds.scm.safemode.min.datanode | 1 | 能够启动实际工作所需的最小数据节点数 ozone.scm.http-address | 0.0.0.0:9876 | SCM 服务端使用的 HTTP 地址 -ozone.metadata.dirs | none | 存储持久化数据的目录(RocksDB) \ No newline at end of file +ozone.metadata.dirs | none | 存储持久化数据的目录(RocksDB) diff --git a/hadoop-hdds/docs/content/feature/Recon.zh.md b/hadoop-hdds/docs/content/feature/Recon.zh.md index 5a41620ea2d3..b7d04a760a6d 100644 --- a/hadoop-hdds/docs/content/feature/Recon.zh.md +++ b/hadoop-hdds/docs/content/feature/Recon.zh.md @@ -1,5 +1,5 @@ --- -title: "Recon" +title: "Recon 服务器" weight: 7 menu: main: @@ -23,27 +23,10 @@ summary: Recon 是 Ozone 中用于分析服务的网页用户界面(Web UI) limitations under the License. --> -Recon 是 Ozone 中用于分析服务的网页用户界面(Web UI)。它是一个可选组件,但强烈建议您使用,因为它可以增加可视性。 +Recon 作为 Ozone 的管理和监听控制台。它是一个可选组件,但强烈建议将其添加到集群中,因为 Recon 可以在关键时刻帮助您对集群进行故障排除。请参阅 [Recon 架构]({{< ref "concept/Recon.zh.md" >}}) 以获得详细的架构概述和 [Recon API]({{< ref path="interface/ReconApi.zh.md" >}}) 文档,以获得 HTTP API 参考。 -Recon 从 Ozone 集群中**收集**所有数据,并将其存储在 SQL数据库中,以便进一步分析。 - - 1. Ozone Manager 的数据是通过异步过程在后台下载的。OM 会定期创建 RocksDB 快照,并将增量数据复制到 Recon 进行处理。 - - 2. 数据节点不仅可以将心跳发送到 SCM,也能发送到 Recon。Recon 可以成为心跳的唯读(Read-only)监听器,并根据收到的信息更新本地数据库。 - -当 Recon 配置完成时,我们便可以启动服务。 +Recon 是一个自带 HTTP 网页服务器的服务,可以通过以下命令启动。 {{< highlight bash >}} ozone --daemon start recon {{< /highlight >}} - -## 需要关注的配置项 - -配置项 | 默认值 | 描述 --------|--------|----- -ozone.recon.http-address | 0.0.0.0:9888 | Recon web UI 监听的地址和基本端口。 -ozone.recon.address | 0.0.0.0:9891 | Recon 的 RPC 地址。 -ozone.recon.db.dir | none | Recon Server 存储其元数据的目录。 -ozone.recon.om.db.dir | none | Recon Server 存储其 OM 快照 DB 的目录。 -ozone.recon.om.snapshot.task.interval.delay | 10m | Recon 以分钟间隔请求 OM DB 快照。 - diff --git a/hadoop-hdds/docs/content/interface/ReconApi.zh.md b/hadoop-hdds/docs/content/interface/ReconApi.zh.md new file mode 100644 index 000000000000..a134fd49378b --- /dev/null +++ b/hadoop-hdds/docs/content/interface/ReconApi.zh.md @@ -0,0 +1,502 @@ +--- +title: Recon API +weight: 4 +menu: + main: + parent: "编程接口" +summary: Recon 服务器支持 HTTP 端点,以帮助故障排除和监听 Ozone 集群。 +--- + + + +Recon API v1 是一组 HTTP 端点,可以帮助您了解 Ozone 集群的当前状态,并在需要时进行故障排除。 + +### HTTP 端点 + +#### 容器 + +* **/containers** + + **URL 结构** + ``` + GET /api/v1/containers + ``` + + **参数** + + * prevKey (可选) + + 只回传ID大于给定的 prevKey 的容器。 + 示例:prevKey=1 + + * limit (可选) + + 只回传有限数量的结果。默认限制是1000。 + + **回传** + + 回传所有 ContainerMetadata 对象。 + + ```json + { + "data": { + "totalCount": 3, + "containers": [ + { + "ContainerID": 1, + "NumberOfKeys": 834 + }, + { + "ContainerID": 2, + "NumberOfKeys": 833 + }, + { + "ContainerID": 3, + "NumberOfKeys": 833 + } + ] + } + } + ``` + +* **/containers/:id/keys** + + **URL 结构** + ``` + GET /api/v1/containers/:id/keys + ``` + + **参数** + + * prevKey (可选) + + 只回传在给定的 prevKey 键前缀之后的键。 + 示例:prevKey=/vol1/bucket1/key1 + + * limit (可选) + + 只回传有限数量的结果。默认限制是1000。 + + **回传** + + 回传给定容器 ID 的所有 KeyMetadata 对象。 + + ```json + { + "totalCount":7, + "keys": [ + { + "Volume":"vol-1-73141", + "Bucket":"bucket-3-35816", + "Key":"key-0-43637", + "DataSize":1000, + "Versions":[0], + "Blocks": { + "0": [ + { + "containerID":1, + "localID":105232659753992201 + } + ] + }, + "CreationTime":"2020-11-18T18:09:17.722Z", + "ModificationTime":"2020-11-18T18:09:30.405Z" + }, + ... + ] + } + ``` +* **/containers/missing** + + **URL 结构** + ``` + GET /api/v1/containers/missing + ``` + + **参数** + + 没有参数。 + + **回传** + + 回传所有丢失容器的 MissingContainerMetadata 对象。 + + ```json + { + "totalCount": 26, + "containers": [{ + "containerID": 1, + "missingSince": 1605731029145, + "keys": 7, + "pipelineID": "88646d32-a1aa-4e1a", + "replicas": [{ + "containerId": 1, + "datanodeHost": "localhost-1", + "firstReportTimestamp": 1605724047057, + "lastReportTimestamp": 1605731201301 + }, + ... + ] + }, + ... + ] + } + ``` +* **/containers/:id/replicaHistory** + + **URL 结构** + ``` + GET /api/v1/containers/:id/replicaHistory + ``` + + **参数** + + 没有参数。 + + **回传** + + 回传给定容器 ID 的所有 ContainerHistory 对象。 + + ```json + [ + { + "containerId": 1, + "datanodeHost": "localhost-1", + "firstReportTimestamp": 1605724047057, + "lastReportTimestamp": 1605730421294 + }, + ... + ] + ``` +* **/containers/unhealthy** + + **URL 结构** + ``` + GET /api/v1/containers/unhealthy + ``` + + **参数** + + * batchNum (可选) + + 回传结果的批号(如“页码”)。 + 传递1,将回传记录1到limit。传递2,将回传limit + 1到2 * limit,依此类推。 + + * limit (可选) + + 只回传有限数量的结果。默认限制是1000。 + + **回传** + + 回传所有不健康容器的 UnhealthyContainerMetadata 对象。 + + ```json + { + "missingCount": 2, + "underReplicatedCount": 0, + "overReplicatedCount": 0, + "misReplicatedCount": 0, + "containers": [{ + "containerID": 1, + "containerState": "MISSING", + "unhealthySince": 1605731029145, + "expectedReplicaCount": 3, + "actualReplicaCount": 0, + "replicaDeltaCount": 3, + "reason": null, + "keys": 7, + "pipelineID": "88646d32-a1aa-4e1a", + "replicas": [{ + "containerId": 1, + "datanodeHost": "localhost-1", + "firstReportTimestamp": 1605722960125, + "lastReportTimestamp": 1605731230509 + }, + ... + ] + }, + ... + ] + } + ``` + +* **/containers/unhealthy/:state** + + **URL 结构** + ``` + GET /api/v1/containers/unhealthy/:state + ``` + + **参数** + + * batchNum (可选) + + 回传结果的批号(如“页码”)。 + 传递1,将回传记录1到limit。传递2,将回传limit + 1到2 * limit,依此类推。 + + * limit (可选) + + 只回传有限数量的结果。默认限制是1000。 + + **回传** + + 回传处于给定状态的容器的 UnhealthyContainerMetadata 对象。 + 不健康的容器状态可能为`MISSING`, `MIS_REPLICATED`, `UNDER_REPLICATED`, `OVER_REPLICATED`。 + 响应结构与`/containers/unhealthy`相同。 + +#### 集群状态 + +* **/clusterState** + + **URL 结构** + ``` + GET /api/v1/clusterState + ``` + + **参数** + + 没有参数。 + + **回传** + + 返回 Ozone 集群当前状态的摘要。 + + ```json + { + "pipelines": 5, + "totalDatanodes": 4, + "healthyDatanodes": 4, + "storageReport": { + "capacity": 1081719668736, + "used": 1309212672, + "remaining": 597361258496 + }, + "containers": 26, + "volumes": 6, + "buckets": 26, + "keys": 25 + } + ``` + +#### 数据节点 + +* **/datanodes** + + **URL 结构** + ``` + GET /api/v1/datanodes + ``` + + **参数** + + 没有参数。 + + **回传** + + 回传集群中的所有数据节点。 + + ```json + { + "totalCount": 4, + "datanodes": [{ + "uuid": "f8f8cb45-3ab2-4123", + "hostname": "localhost-1", + "state": "HEALTHY", + "lastHeartbeat": 1605738400544, + "storageReport": { + "capacity": 270429917184, + "used": 358805504, + "remaining": 119648149504 + }, + "pipelines": [{ + "pipelineID": "b9415b20-b9bd-4225", + "replicationType": "RATIS", + "replicationFactor": 3, + "leaderNode": "localhost-2" + }, { + "pipelineID": "3bf4a9e9-69cc-4d20", + "replicationType": "RATIS", + "replicationFactor": 1, + "leaderNode": "localhost-1" + }], + "containers": 17, + "leaderCount": 1 + }, + ... + ] + } + ``` + +#### 管道 + +* **/pipelines** + + **URL 结构** + ``` + GET /api/v1/pipelines + ``` + **参数** + + 没有参数 + + **回传** + + 回传在集群中的所有管道。 + + ```json + { + "totalCount": 5, + "pipelines": [{ + "pipelineId": "b9415b20-b9bd-4225", + "status": "OPEN", + "leaderNode": "localhost-1", + "datanodes": ["localhost-1", "localhost-2", "localhost-3"], + "lastLeaderElection": 0, + "duration": 23166128, + "leaderElections": 0, + "replicationType": "RATIS", + "replicationFactor": 3, + "containers": 0 + }, + ... + ] + } + ``` + +#### 任务 + +* **/task/status** + + **URL 结构** + ``` + GET /api/v1/task/status + ``` + + **参数** + + 没有参数 + + **回传** + + 回传所有 Recon 任务的状态。 + + ```json + [ + { + "taskName": "OmDeltaRequest", + "lastUpdatedTimestamp": 1605724099147, + "lastUpdatedSeqNumber": 186 + }, + ... + ] + ``` + +#### 使用率 + +* **/utilization/fileCount** + + **URL 结构** + ``` + GET /api/v1/utilization/fileCount + ``` + + **参数** + + * volume (可选) + + 根据给定的卷名过滤结果。 + + * bucket (可选) + + 根据给定的桶名过滤结果。 + + * fileSize (可选) + + 根据给定的文件大小筛选结果。 + + **回传** + + 回传不同文件范围内的文件计数,其中响应对象中的`fileSize`是文件大小范围的上限。 + + ```json + [{ + "volume": "vol-2-04168", + "bucket": "bucket-0-11685", + "fileSize": 1024, + "count": 1 + }, { + "volume": "vol-2-04168", + "bucket": "bucket-1-41795", + "fileSize": 1024, + "count": 1 + }, { + "volume": "vol-2-04168", + "bucket": "bucket-2-93377", + "fileSize": 1024, + "count": 1 + }, { + "volume": "vol-2-04168", + "bucket": "bucket-3-50336", + "fileSize": 1024, + "count": 2 + }] + ``` + +#### 指标 + +* **/metrics/:api** + + **URL 结构** + ``` + GET /api/v1/metrics/:api + ``` + + **参数** + + 请参阅 [Prometheus HTTP API 参考](https://prometheus.io/docs/prometheus/latest/querying/api/) 以获取完整的查询文档。 + + **回传** + + 这是 Prometheus 的代理端点,并回传与 Prometheus 端点相同的响应。 + 示例:/api/v1/metrics/query?query=ratis_leader_election_electionCount + + ```json + { + "status": "success", + "data": { + "resultType": "vector", + "result": [ + { + "metric": { + "__name__": "ratis_leader_election_electionCount", + "exported_instance": "33a5ac1d-8c65-4c74-a0b8-9314dfcccb42", + "group": "group-03CA9397D54B", + "instance": "ozone_datanode_1:9882", + "job": "ozone" + }, + "value": [ + 1599159384.455, + "5" + ] + } + ] + } + } + ``` + +