这是我参与「第四届青训营 」笔记创作活动的的第2天
前几天在看完b站的视频,加上上手实操运行一些代码后对于我们小组需要开发的系统有了一个大概的了解。
总的来说,这个分布式系统主要分为三个部分,分别是NameNode, DataNode和Client。因为我发现好多资料介绍都是用一些术语来解释术语,对于新手是非常不友好,下面我来通俗的解释一下他们的作用与概念。
- NameNode
NameNode又叫命名节点、元数据服务模块,我们可以把它看作这个系统的大脑,它负责接收用户(即Client)的请求,并提供不同的服务,比如用户可以上传、下载、修改,删除,重命名文件等。 - DataNode
DataNode又叫数据节点、存储引擎模块,这个是专门负责干活的程序,他所在的机器主要用来存储文件,在磁盘上持久化。 - Client
Client节点与用户直接交互,接收用户请求并返回,这个相当于我们手机上的App,你需要什么服务就点击对应的按钮,后台就会执行对应的命令来提供服务。
它们的关系如下:
下面讨论一下这套系统需要的技术,开发过程需要解决的问题。
首先NameNode整个系统只有一个, DataNode和Client可能有多个,他们都需要部署在不同的机器上,对应的程序运行时会监听来自其他节点的请求,因为他们之间需要相互通信,于是我们需要一个网络通信框架,在前一篇文章中提到的开源项目用的就是Netty这个基于NIO的客户、服务器端编程框架。
其次,因为同一时间可能会有多个Client向NameNode发出请求,因此并发编程是必须掌握的,由于NameNode为客户提供服务的过程中会对本身的文件目录树进行反复的修改,我们对于各种锁的应用也要熟练。
再者,项目要求我们可以容忍单点故障,实现文件备份,这就需要我们采取相应的策略如何应对节点宕机,显然NameNode在这个系统中发挥着至关重要的在作用,开发是我们需要考虑如何对系统进行优化,提高NameNode的性能。
这里放一个开源项目的总体架构以供参考