Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >世界最优秀的分布式文件系统架构演进之路

世界最优秀的分布式文件系统架构演进之路

作者头像
玄姐谈AGI
发布于 2020-02-13 04:04:09
发布于 2020-02-13 04:04:09
7940
举报
文章被收录于专栏:架构之美架构之美

前言

Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS,解决了海量数据存储的问题;实现了一个分布式计算引擎MapReduce,解决了海量数据如何计算的问题;实现了一个分布式资源调度框架YARN,解决了资源调度,任务管理的问题。而我们今天重点给大家介绍的是Hadoop里享誉世界的优秀的分布式文件系统-HDFS。

Hadoop重要的比较大的版本有:Hadoop1,Hadoop2,hadoop3。同时也相对应的有HDFS1,HDFS2,HDFS3三个大版本。后面的HDFS的版本,都是对前一个版本的架构进行了调整优化,而在这个调整优化的过程当中都是解决上一个版本的架构缺陷,然而这些低版本的架构缺陷也是我们在平时工作当中会经常遇到的问题,所以这篇文章一个重要的目的就是通过给大家介绍HDFS不同版本的架构演进,通过学习高版本是如何解决低版本的架构问题从而来提升我们的系统架构能力。

HDFS1

最早出来投入商业使用的的Hadoop的版本,我们称为Hadoop1,里面的HDFS就是HDFS1,当时刚出来HDFS1,大家都很兴奋,因为它解决了一个海量数据如何存储的问题。HDFS1用的是主从式架构,主节点只有一个叫:Namenode,从节点有多个叫:DataNode。

我们往HDFS上上传一个大文件,HDFS会自动把文件划分成为大小固定的数据块(HDFS1的时候,默认块的大小是64M,可以配置),然后这些数据块会分散到存储的不同的服务器上面,为了保证数据安全,HDFS1里默认每个数据块都有3个副本。Namenode是HDFS的主节点,里面维护了文件系统的目录树,存储了文件系统的元数据信息,用户上传文件,下载文件等操作都必须跟NameNode进行交互,因为它存储了元数据信息,Namenode为了能快速响应用户的操作,启动的时候就把元数据信息加载到了内存里面。DataNode是HDFS的从节点,干的活就很简单,就是存储block文件块。

01 / HDFS1架构缺陷

缺陷一:单点故障问题(高可用)

我们很清楚的看到,HDFS1里面只有一个NameNode,那么也就是说如果这个Namenode出问题以后,整个分布式文件系统就不能用了。

缺陷二:内存受限问题

NameNode为了能快速响应用户的操作,把文件系统的元数据信息加载到了内存里面,那么如果一个集群里面存储的文件较多,产生的元数据量也很大,大到namenode所在的服务器撑不下去了,那么文件系统的寿命也就到尽头了,所以从这个角度说,之前的HDFS1的架构里Namenode有内存受限的问题。

我们大体能看得出来,在HDFS1架构设计中,DataNode是没有明显的问题的,主要的问题是在NameNode这儿。

HDFS2

HDFS1明显感觉架构不太成熟,所以HDFS2就是对HDFS1的问题进行解决。

01 / 单点故障问题解决(高可用)

大家先跟着我的思路走,现在我们要解决的是一个单点的问题,其实解决的思路很简单,因为之前是只有一个NameNode,所以有单点故障问题,那我们把设计成两个Namenode就可以了,如果其中一个namenode有问题,就切换到另外一个NameNode上。

所以现在我们想要实现的是:其中一个Namenode有问题,然后可以把服务切换到另外一个Namenode上。如果是这样的话,首先需要解决一个问题:如何保证两个NameNode之间的元数据保持一致?因为只有这样才能保证服务切换以后还能正常干活。

保证两个NameNode之间元数据一致

为了解决两个NameNode之间元数据一致的问题,引入了第三方的一个JournalNode集群。

JournalNode集群的特点:JournalNode守护进程是相对轻量级的,那么这些守护进程可与其它Hadoop守护进程,如NameNode,运行在相同的主机上。由于元数据的改变必须写入大多数(一半以上)JNs,所以至少存在3个JournalNodes守护进程,这样系统能够容忍单个Journal Node故障。当然也可以运行多于3个JournalNodes,但为了增加系统能够容忍的故障主机的数量,应该运行奇数个JNs。当运行N个JNs时,系统最多可以接受(N-1)/2个主机故障并能继续正常运行,所以Jounal Node集群本身是没有单点故障问题的。

引入了Journal Node集群以后,Active状态的NameNode实时的往Journal Node集群写元数据,StandBy状态的NameNode实时从Journal Node集群同步元数据,这样就保证了两个NameNode之间的元数据是一致的。

两个NameNode自动切换

目前虽然解决了单点故障的问题,但是目前假如Active NameNode出了问题,还需要我们人工的参与把Standby N ameNode切换成为Active NameNode,这个过程并不是自动化的,但是很明显这个过程我们需要自动化,接下来我们看HDFS2是如何解决自动切换问题的。为了解决自动切换问题,HDFS2引入了ZooKeeper集群和ZKFC进程。

ZKFC是DFSZKFailoverController的简称,这个服务跟NameNode的服务安装在同一台服务器上,主要的作用就是监控NameNode健康状态并向ZooKeeper注册NameNode,如果Active的NameNode挂掉后,ZKFC为StandBy的NameNode竞争锁(分布式锁),获得ZKFC锁的NameNode变为active,所以引入了ZooKeeper集群和ZKFC进程后就解决了NameNode自动切换的问题。

02 / 内存受限问题解决

前面我们虽然解决了高可用的问题,但是如果NameNode的元数据量很大,大到当前NameNode所在的服务器存不下,这个时候集群就不可用了,换句话说就是NameNode的扩展性有问题。为了解决这个问题,HDFS2引入了联邦的机制。

如上图所示这个是一个完整的集群,由多个namenode构成,namenode1和namenode2构成一套namenode,我们取名叫nn1,这两个namenode之间是高可用关系,管理的元数据是一模一样的;namenode3和namenode4构成一套namenode,假设我们取名叫nn2,这两个namenode之间也是高可用关系,管理的元数据也是一模一样的,但是nn1和nn2管理的元数据是不一样的,他们分别只是管理了整个集群元数据的一部分,引入了联邦机制以后,如果后面元数据又存不了,那继续扩nn3,nn4...就可以了。所以这个时候NameNode就在存储元数据方面提升了可扩展性,解决了内存受限的问题。

联邦这个名字是国外翻译过来的,英文名是Federation,之所以叫联邦的管理方式是因为Hadoop的作者是Doug cutting,在美国上学,美国是联邦制的国家,作者从国家管理的方式上联想到元数据的管理方式,其实这个跟我们国家的管理方式也有点类似,就好比我们整个国家是一个完整的集群,但是如果所有的元数据都由北京来管理的话,内存肯定不够,所以中国分了34个省级行政区域,各个区域管理自己的元数据,这行就解决了单服务器内存受限的问题。

HDFS2引入了联邦机制以后,我们用户的使用方式不发生改变,联邦机制对于用户是透明的,因为我们会在上游做一层映射,HDFS2的不同目录的元数据就自动映射到不同的namenode上。

03 / HDFS2的架构缺陷

缺陷一:高可用只能有两个namenode

为了解决单点故障问题,HDFS2设计了两个namenode,一个是active,另外一个是standby,但是这样的话,如果刚好两个NameNode连续出问题了,这个时候集群照样还是不可用,所以从这这个角度讲,NameNode的可扩展性还是有待提高的。

注意:这个时候不要跟联邦那儿混淆,联邦那儿是可以有无数个namenode的,咱们这儿说的只能支持两个namenode指的是是高可用方案。

缺陷二:副本为3,存储浪费了200%

其实这个问题HDFS1的时候就存在,而且这个问题跟NameNode的设计没关系,主要是DataNode这儿的问题,DataNode为了保证数据安全,默认一个block都会有3个副本,这样存储就会浪费了200%。

HDFS3

其实到了HDFS2,HDFS就已经比较成熟稳定了,但是HDFS3还是精益求精,再从架构设计上重新设计了一下。

01 / 高可用之解决只能有两个namenode

当时在设计HDFS2的时候只是使用了两个NameNode去解决高可用问题,那这样的话,集群里就只有一个NameNode是Standby状态,这个时候假设同时两个NameNode都有问题的话,集群还是存在不可用的风险,所以在设计HDFS3的时候,使其可支持配置多个NameNode用来支持高可用,这样的话就保证了集群的稳定性。

02 / 解决存储浪费问题

HDFS3之前的存储文件的方案是将一个文件切分成多个Block进行存储,通常一个Block 64MB或者128MB,每个Block有多个副本(replica),每个副本作为一个整体存储在一个DataNode上,这种方法在增加可用性的同时也增加了存储成本。ErasureCode通过将M个数据block进行编码(Reed-Solomon,LRC),生成K个校验(parity)block, 这M+K个block组成一个block group,可以同时容忍K个block失败,任何K个block都可以由其他M个block算出来. overhead是K/M。

以M=6,K=3为例,使用EC之前,假设block副本数为3,那么6个block一共18个副本,overhead是200%,使用EC后,9个block,每个block只需一个副本,一共9个副本,其中6个数据副本,3个校验副本,overhead是3/6=50%。

在存储系统中,纠删码技术主要是通过利用纠删码算法将原始的数据进行编码得到校验,并将数据和校验一并存储起来,以达到容错的目的。其基本思想是将k块原始的数据元素通过一定的编码计算,得到m块校验元素。对于这k+m块元素,当其中任意的m块元素出错(包括数据和校验出错),均可以通过对应的重构算法恢复出原来的k块数据。生成校验的过程被称为编码(encoding),恢复丢失数据块的过程被称为解码(decoding)。

Reed-Solomon(RS)码是存储系统较为常用的一种纠删码,它有两个参数k和m,记为RS(k,m)。如下图所示,k个数据块组成一个向量被乘上一个生成矩阵(Generator Matrix)GT从而得到一个码字(codeword)向量,该向量由k个数据块和m个校验块构成。如果一个数据块丢失,可以用(GT)-1乘以码字向量来恢复出丢失的数据块。RS(k,m)最多可容忍m个块(包括数据块和校验块)丢失。

它是社区最新的HDFS3内部的方案,需要对整个HDFS内部实现进行改造,包括DataNode,NameNode还有DFSClient,该方案同时支持在线和离线EC。

03 / 在线EC

当前HDFS block的副本作为一个整体连续(contiguous)的存储在一个DataNode上,在locality上具有一定的优势,特别是对于MapReduce这样的应用,但是这种方法不好做在线EC。当前社区方案不以block为单位进行EC,而是以strip为单位进行EC(HDFS依旧管理Block)设计思路参考了QFS。对于配置了EC的文件,客户端写入时将文件的数据切成一个个的64KB的strip,相邻的strip发往不同的DataNode,比如当前使用(6,3)-Reed-solomon编码,当前正在写的文件有6个strip: strip1, strip2, strip3, strip4, strip5, strip6, 那么这6个strip和相应的编码出来的3个校验strip共9个strip会并行的发往9个不同的DataNode。这种方式写入性能更好,但是也会对网卡出口带来一些压力,同时牺牲了locality。如果文件大小不是64KB * 6的整数倍(本文例子),那么最后一个strip group显然不是满的,这时客户端还会将最后一个strip group的长度记在校验块中,后续读的时候,可以根据这个长度和数据块长度还有文件长度来校验。

对于append和hflush操作,最后一个parity strip group很可能还没有切换成新的strip group,这就需要DataNode更新最后一个parity strip的数据。

读操作,丢失block时,只需要读9个DataNode中任意6个DataNode即可修复。修复过程需要读多个DataNode,耗费网络带宽和磁盘IO。

04 / 离线EC

该方案也支持离线EC,可以异步的将多副本文件转成EC文件,通过集成在NameNode中的ECManager和DataNode上的ECWorker来支持。命令行工具提供replication和ec之间的转换,可以通过命令行配置哪些文件/目录使用EC. 在转换方程中,不支持append。

这样的话,HDFS3靠就删码技术解决了存储浪费的问题。

尾声

好了,到目前为止我们看到HDFS,三个大的版本的演进的过程,一开始是HDFS1,HDFS1有问题,所以就有了HDFS2,HDFS2就是为了解决HDFS1架构缺陷的,同学们,我们回过头来想想,其实HDFS1的那些架构设计问题,是不是我们平时的项目当中也是存在的,所以以后大家在项目中遇到类似问题的时候,不妨可以参考借鉴一下HDFS2的解决的思路。HDFS3是对HDFS2的优化,其实HDFS3解决的这些问题,如果自己设计过文件系统的同学(本人自己设计过分布式图片服务器)也可用类似的思路去解决系统的高可用和副本造成存储浪费的问题。

希望能给大家带来收获,同学们加油!!!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构之美 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Hadoop分布式文件系统HDFS
为了保证数据的可靠性和容错性,HDFS会为每个数据块创建多个副本(默认为3个),并将这些副本分布到不同的DataNode上。当某个DataNode出现故障时,可以从其他DataNode上获取数据块的副本,从而确保数据的可靠性。
一身黑Lil
2024/05/10
1980
Hadoop分布式文件系统HDFS
Hadoop技术(一)分布式文件系统HDFS
明确 假设磁盘每秒读取500兆数据, 则1T内容需要2048s 约等于 30min
时间静止不是简史
2020/07/24
8620
深入理解HDFS 一
Hadoop的发展至今已经有十余年的历史了,其核心设计HDFS和MapReduce,分别解决了海量数据的存储和计算这两个问题。
soundhearer
2020/10/29
9160
深入理解HDFS 一
彻底理解大数据 HDFS 分布式文件系统,这篇就够了
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/03/04
7.4K0
分布式文件系统HDFS原理一网打尽
HDFS是一个分布式文件系统,具有良好的扩展性、容错性以及易用的API。核心思想是将文件切分成等大的数据块,以多副本的形式存储到多个节点上。HDFS采用了经典的主从软件架构,其中主服务被称为NameNode,管理文件系统的元信息,而从服务被称为DataNode,存储实际的数据块,DataNode与NameNode维护了周期性的心跳,为了防止NameNode出现单点故障,HDFS允许一个集群中存在主NameNode,并通过ZooKeeper完成Active NameNode的选举工作。HDFS提供了丰富的访问方式,用户可以通过HDFS shell,HDFS API,数据收集组件以及计算框架等存取HDFS上的文件。
大数据真好玩
2021/07/30
1.3K0
Hadoop HDFS分布式文件系统设计要点与架构
1、硬件错误是常态,而非异常情况,HDFS可能是有成百上千的server组成,任何一个组件都有可能一直失效,因此错误检测和快速、自动的恢复是HDFS的核心架构目标。 2、跑在HDFS上的应用与一般的应用不同,它们主要是以流式读为主,做批量处理;比之关注数据访问的低延迟问题,更关键的在于数据访问的高吞吐量。 3、HDFS以支持大数据集合为目标,一个存储在上面的典型文件大小一般都在千兆至T字节,一个单一HDFS实例应该能支撑数以千万计的文件。 4、 HDFS应用对文件要求的是write-one-read-many访问模型。一个文件经过创建、写,关闭之后就不需要改变。这一假设简化了数据一致性问 题,使高吞吐量的数据访问成为可能。典型的如MapReduce框架,或者一个web crawler应用都很适合这个模型。 5、移动计算的代价比之移动数据的代价低。一个应用请求的计算,离它操作的数据越近就越高效,这在数据达到海量级别的时候更是如此。将计算移动到数据附近,比之将数据移动到应用所在显然更好,HDFS提供给应用这样的接口。 6、在异构的软硬件平台间的可移植性。
黄规速
2022/04/14
5310
大数据技术入门:hdfs(分布式文件存储系统)
Hadoop分布式文件系统(HDFS)是指被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统(Distributed File System)。它和现有的分布式文件系统有很多共同点。但同时,它和其他的分布式文件系统的区别也是很明显的。HDFS是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。HDFS放宽了一部分POSIX约束,来实现流式读取文件系统数据的目的。HDFS在最开始是作为Apache Nutch搜索引擎项目的基础架构而开发的。HDFS是Apache Hadoop Core项目的一部分。----------来源于百度百科。
百思不得小赵
2022/12/01
7500
大数据技术入门:hdfs(分布式文件存储系统)
大数据存储技术(2)—— HDFS分布式文件系统
1、产生背景 随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。HDFS就是分布式文件管理系统中的一种。
Francek Chen
2025/01/22
1790
大数据存储技术(2)—— HDFS分布式文件系统
HDFS分布式文件存储系统详解
优点: 1.处理超大文件 能用来存储管理PB级的数据 1PB = 1024TB 2.处理非结构化数据、半结构化数据、结构化数据 流式的访问数据 一次写入、多次读取 3.运行于廉价的商用机器集群上 可运行在低廉的商用硬件集群上 故障时能继续运行且不让用户察觉到明显的中断
全栈程序员站长
2022/08/22
1.6K0
HDFS分布式文件存储系统详解
Hadoop HA 完全分布式工作机制
在 Hadoop 1.x 版本中,是没有 HA 实现方式的,它只有可以看做是冷备份的 SecondaryNameNode 来起到备份作用,因为 2NN 能够协助 NameNode 做一些检查点的工作,能同步磁盘镜像(FSImage)和日志(EditLog). 当 NN 挂掉,2NN 是没有办法立即启动起来继续为集群服务的,需要用手工的方式启动 2NN,这显然会产生服务中断,对业务连续性产生较大影响。
数人之道
2022/01/07
5730
Hadoop HA 完全分布式工作机制
大数据入门:HDFS架构演进之路
Hadoop的核心三大组件之一,HDFS主要负责分布式文件存储,将大规模的数据存储任务拆分成小块,分布到不同的机器上,从而以低成本的方式解决大数据存储问题。今天的大数据入门分享,我们就主要来讲讲伴随着Hadoop的迭代更新,HDFS架构是如何演进的。
成都加米谷大数据
2020/12/29
3420
大数据入门:HDFS架构演进之路
Hadoop分布式文件系统(HDFS)
HDFS (Hadoop Distributed File System)是 Hadoop 下的分布式文件系统,具有高容错、高吞吐量等特性,可以部署在低成本的硬件上。
大数据老哥
2021/03/23
1.5K0
分布式文件系统 HDFS 简介
文章目录 1. HDFS 简介 2. HDFS起源发展 3. HDFS设计目标 4. HDFS应用场景 5. HDFS重要特性--主从架构 6. HDFS重要特性--分块存储机制 7. HDFS重要特性--副本机制 8. HDFS重要特性--namespace 9. HDFS重要特性--元数据管理 10. HDFS重要特性--数据块存储 1. HDFS 简介 HDFS( Hadoop Distributed File System ),意为:Hadoop分布式文件系统。是Apache Hadoop核心组件之
兮动人
2021/06/11
1.5K0
分布式文件系统 HDFS 简介
2021年大数据Hadoop(七):HDFS分布式文件系统简介
在现代的企业环境中,单机容量往往无法存储大量数据,需要跨机器存储。统一管理分布在集群上的文件系统称为分布式文件系统 。
Lansonli
2021/10/11
5630
从入门到实战Hadoop分布式文件系统
当数据集的大小超过一台独立物理计算机的存储能力时,就有必要对它进行分区并存储到若干台独立的计算机上。管理网络中跨多台计算机存储的文件系统成为分布式文件系统。该系统架构与网络之上,势必会引入网络编程的复杂性,因此分布式文件系统比普通磁盘文件系统更为复杂。例如,使文件系统能够容忍节点故障且不丢失任何数据,就是一个极大的挑战。   Hadoop有一个成为HDFS的分布式系统,全程为hadoop distrubuted filesystem.在非正式文档中,有时也成为DFS,它们是一会儿事儿。HDFS是Hadoop的旗舰级文件系统,同事也是重点,但事件上hadoop是一个综合性的文件系统抽象。   **HDFS的设计**   HDFS以[流式数据访问模式](http://www.zhihu.com/question/30083497)来存储超大文件,运行于商用硬件集群上。关于超大文件:   一个形象的认识:   荷兰银行的20个数据中心有大约7PB磁盘和超过20PB的磁带存储,而且每年50%~70%存储量的增长,当前1T容量硬盘重约500克,计算一下27PB大约为 27648个1T容量硬盘的大小,即2万7千斤,约270个人重,上电梯要分18次运输(每次15人)。  1Byte = 8 Bit  1 KB = 1,024 Bytes   1 MB = 1,024 KB    1 GB = 1,024 MB  1 TB = 1,024 GB   **1 PB = 1,024 TB**   **1 EB = 1,024 PB**   **1 ZB = 1,024 EB**   **1 YB = 1,024 ZB** = 1,208,925,819,614,629,174,706,176 Bytes
MickyInvQ
2020/09/27
5260
从入门到实战Hadoop分布式文件系统
Hadoop 超燃之路
以前的存储手段跟分析方法现在行不通了!Hadoop 就是用来解决海量数据的 存储 跟海量数据的 分析计算 问题的,创始人 Doug Cutting 在创建 Hadoop 时主要思想源头是 Google 三辆马车
sowhat1412
2022/09/20
5390
Hadoop 超燃之路
分布式文件系统-HDFS
大数据技术主要要解决的问题的是大规模数据的计算处理问题,那么首先要解决的就是大规模数据的存储问题。大规模数据存储要解决的核心问题有三个方面:
王知无-import_bigdata
2019/04/24
1.4K0
分布式文件系统-HDFS
【史上最全】Hadoop 核心 - HDFS 分布式文件系统详解(上万字建议收藏)
Hadoop 分布式系统框架中,首要的基础功能就是文件系统,在 Hadoop 中使用 FileSystem 这个抽象类来表示我们的文件系统,这个抽象类下面有很多子实现类,究竟使用哪一种,需要看我们具体的实现类,在我们实际工作中,用到的最多的就是HDFS(分布式文件系统)以及LocalFileSystem(本地文件系统)了。
五分钟学大数据
2021/02/08
2.3K0
【史上最全】Hadoop 核心 - HDFS 分布式文件系统详解(上万字建议收藏)
HDFS文件系统介绍(1)
在Hadoop(CDH)分布式环境搭建(简单易懂,绝对有效!)这篇博客中,小菌在最后为大家带来了HDFS的初体验。一些大数据专业的粉丝私信小菌希望能再详细讲讲HDFS的相关内容。于是本次分享,小菌将为
大数据梦想家
2021/01/22
6350
HDFS文件系统介绍(1)
HDFS系列(1) | HDFS文件系统的简单介绍
在介绍文件系统之前我们首先需要了解HDFS的作用。我们都知道HDFS是Hadoop的一个核心组件,那在Hadoop中HDFS扮演着怎样的一个角色呢?我们可以通过下图直观的了解。
不温卜火
2020/10/28
1.3K0
HDFS系列(1) | HDFS文件系统的简单介绍
相关推荐
Hadoop分布式文件系统HDFS
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档