同学们好!在上节课,我们已经成功地将用户的头像数据,以字节序列的形式,传递到了名为UploadAvatar的后端微服务中。从打印出的字节数来看,与浏览器上传的本地图像文件的大小完全一致。为了使后端微服务能够将头像数据保存下来,这节课我们将亲手搭建一个,基于FastDFS和Nginx的分布式文件存储服务器。
首先我们需要对FastDFS和Nginx做一个概要性的介绍,接着我们会在VMware中安装一台Ubuntu虚拟机,并在虚拟机中安装、配置和启动FastDFS及Nginx,最后是对我们搭建的文件服务器做测试和验证。
我们先来了解一下FastDFS和Nginx。
完整的FastDFS系统包括跟踪服务器(Tracker)、存储服务器(Storage)和客户机(Client)三个重要角色,以及组(Group)、元数据(Meta Data)等逻辑对象。跟踪服务器相当于FastDFS的大脑,不论是上传还是下载,都要由跟踪服务器来分配资源。客户机可借助Nginx等静态服务器,使用和缓存跟踪服务器上的服务和数据。存储服务器被划分为若干组或卷,组与组平行,可依资源使用情况增减。每个组内的多台存储服务器,彼此同步,互为备份,以利容灾。
跟踪服务器的主要任务是调度协调和负载均衡,同时也是客户机与存储服务器之间数据传输的枢纽。跟踪服务器负责管理所有存储服务器和组。每台存储服务器启动后,都会与跟踪服务器建立连接,向其通告自己所隶属的组,并保持周期性心跳。跟踪服务器据此维护组——存储服务器映射表。跟踪服务器需要管理的元数据很少,全部由存储服务器汇报产生,仅在内存中,无需持久化。直接增加跟踪服务器主机即可扩容跟踪服务器集群。集群中的每台跟踪服务器完全对等,同时接收来自存储服务器的周期性心跳,生成元数据,提供文件存取服务。
存储服务器直接将文件的内容数据和元数据保存在计算机的文件系统中。整个存储集群以组为单位组织存储。每个组内包含一到多台存储服务器,互为备份。组的存储容量由组内容量最小的存储服务器决定。建议组内配置容量相同的存储服务器,以免造成存储空间的浪费。每台存储服务器都将文件保存到本地文件系统中,可根据需要配置多个存储目录。比如有十块硬盘,分别挂载到/M00,/M01,直到/M09目录下,可将这十个目录都配置为存储目录。存储服务器接收到写文件请求时,会根据事先配置好的规则,选择一个存储目录。为了避免单个目录下文件数过多,服务器首次启动时,会在每个存储目录下创建两级子目录,每级256个,共65536个子目录。新文件会以散列的方式被路由到其中某个特定子目录下,保存为本地文件。
作为业务请求的发起方,客户机通过专有接口,使用TCP/IP协议与跟踪服务器和存储服务器通信。客户机以库函数的形式,提供访问文件的接口,如upload、download、append、delete等。
当客户机需要上传文件时,会首先向跟踪服务器发起上传文件请求。跟踪服务器在其维护的有关存储服务器的信息中查询可用的存储服务器。跟踪服务器向发起上传请求的客户机响应以可用存储服务器的IP地址和端口号。客户机根据接收到的IP地址和端口号向特定存储服务器上传文件的内容数据和元数据。存储服务器根据接收到的文件数据生成文件凭证。存储服务器将接收到的文件内容数据保存到文件系统的特定目录下。存储服务器向客户机返回文件凭证。客户机保存从存储服务器接收到的文件凭证。
当客户机需要下载文件时,会首先向跟踪服务器发起下载文件请求,其中包含欲下载文件的文件凭证。跟踪服务器根据文件凭证中的信息,查询可用的存储服务器。跟踪服务器向发起下载请求的客户机响应以可用存储服务器的IP地址和端口号。客户机根据接收到的IP地址和端口号向特定存储服务器提交文件凭证。存储服务器根据接收到的文件凭证,在其文件系统中查找该文件。存储服务器向客户机返回文件的内容数据。客户机处理或保存从存储服务器接收到的文件内容数据。
在《我家租房网》项目中,上传头像时,后端微服务会直接调用FastDFS客户机提供的API,将图像数据保存到FastDFS中,同时得到文件凭证。后端微服务一方面会将文件凭证保存到数据库中,另一方面将其组织成URL返回给前端服务器及浏览器。浏览器将包含文件凭证的URL发送给Nginx服务器,后者再将文件凭证递送给FastDFS客户机,并将下载得到的图像数据返回给浏览器,完成用户头像的显示。
我们的基于FastDFS和Nginx的分布式文件存储服务器需要部署在Linux系统中。为此,需要在VMware中安装一台Ubuntu虚拟机。
需要强调的是,为了让我们的Windows宿主机能够访问VMware中的Ubuntu虚拟机,需要把VMware的虚拟网卡配置成NAT模式,并记下网关的IP地址,比如192.168.0.2。
有关在VMware中安装Ubuntu虚拟机的方法,网上资料颇多,此处无需赘述。
虚拟机的网络设置,默认为自动获得IP地址,这里需要改为手动配置静态IP,比如192.168.0.111,并将网关和DNS指定为VMware虚拟网卡的网关地址,比如192.168.0.2。
为了在Ubuntu虚拟机中编译FastDFS和Nginx源码并编辑配置文件,需要安装文本编辑器vim、C语言编译器gcc、C++语言编译器g++和构建工具make。
在完成所有这些准备工作后,我们将在Ubuntu虚拟机中安装、配置并启动FastDFS。
第一步,从GitHub上下载并安装FastCommon。
第二步,从GitHub上下载并安装ServerFrame。
第三步,从GitHub上下载并安装FastDFS。
第四步,分别为跟踪服务器、存储服务器和客户机创建工作目录。
第五步,以管理员身份编辑跟踪服务器配置文件,为其指定工作目录。
第六步,以管理员身份编辑存储服务器配置文件,为其指定工作目录、存储目录和跟踪服务器的IP地址及端口。
第七步,以管理员身份编辑客户机配置文件,为其指定工作目录、最大连接数和跟踪服务器的IP地址及端口。
第八步,启动跟踪服务器和存储服务器,检查服务器进程是否存在。
下面我们将在Ubuntu虚拟机中安装、配置并启动Nginx。
第一步,安装PCRE运行时及开发包。
第二步,从GitHub上下载并解压Nginx的FastDFS模块,从Nginx官网下载并安装Nginx,配置时指定FastDFS模块的源码路径。
第三步,以管理员身份编辑FastDFS模块配置文件,为其指定连接超时、跟踪服务器的IP地址及端口、带组名的URL和存储目录。
第四步,以管理员身份复制HTTP配置文件和MIME类型文件,同时编辑Nginx配置文件,为其指定侦听端口、服务器名和FastDFS模块等。
第五步,启动Nginx服务器,检查服务器进程是否存在。
最后,我们要对所搭建的文件服务器和Web网关进行功能测试。
第一步,在VMware中启动Ubuntu虚拟机,如其已经启动,则跳过这一步。
第二步,在Ubuntu虚拟机中启动FastDFS的跟踪服务器和存储服务器,以及Nginx服务器,如其已经启动,则跳过这一步。
第三步,在Ubuntu虚拟机中准备一张图片。
第四步,执行FastDFS客户机的上传文件命令,将我们准备好的图片文件上传至FastDFS服务器。如上传成功,该命令会打印出文件凭证字符串。
第五步,在Windows宿主机上打开浏览器,地址栏中输入包含文件凭证的URL,浏览器窗口中应显示出我们方才上传的图片。
谢谢大家,我们下节课再见!