分布式文件系统
随着文件数据的越来越多,通过 tomcat 或 nginx 虚拟化的静态资源文件在单一的一个服务器节点内是存不下的,如果用多个节点来存储就会不利于管理和维护,所以需要一个系统来管理多态计算机节点上的文件数据,这就是 分布式文件系统。
分布式文件系统是一个允许文件通过网络在多态节点上分享的文件系统,多台计算机节点共同组成一个整体。
它的优点:
- 提供 冗余备份,所以容错能力高,系统中某个节点宕机了,整体的文件服务不会停止,数据也不会丢失。
- 它的可扩展性强,增加或减少节点简单
- 提供负载均衡能力,在读取文件副本的时候可以有多个节点共同服务,而且可以通过横向扩展确保性能的提升与负载。
FastDFS
FastDFS 是一个轻量级分布式文件系统,它的功能有:文件存储、文件同步,文件访问(文件的上传、下载)。
FastDFS 服务端有两个角色,跟踪器tracker
和 存储节点 storage
:
- 跟踪器主要做调度工作,在访问上起到负载均衡的作用
- 存储节点,完成文件管理的所有功能,如存储、同步和提供存取接口等,同时对文件的
metaData
进行管理(metaData
就是文件的相关属性,以键值对的方式表示)
跟踪器和存储节点都可以有一台或多台服务器构成,跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务。
为了支持大容量,存储节点服务器采用 分卷 的组织方式,存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量,一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件是相同的,卷中的多个存储服务器起到了冗余备份和负载均衡的作用。
下图是 FastDFS 架构图:
- FastDFS 中的文件标识分为两个部分:卷名和文件名,二者缺一不可
storage
和tracker
之间会有定时发送心跳服务,storage
会定时地向tracker
提交、同步相应的状态信息,因此要先启动tracker
后再启动storage
下面是 FastDFS 的上传下载流程解析图:
1 安装 FastDFS
环境准备:
libfastcommon
:FastDFS 分离出的一些公用函数包,github下载地址,这里下载1.0.42
版本FastDFS
:FastDFS 本体,github下载地址,这里下载6.04
版本fastdfs-nginx-module
:FastDFS 和 nginx 的关联模块,github下载地址,这里下载1.22
版本
然后在两台Linux下(tracker
和 storage
)执行一下操作:
- 安装基础环境
yum install -y gcc gcc-c++
yum install -y libevent
- 安装
libfastcommon
函数库
tar -zxvf libfastcommon-1.0.42.tar.gz
进入解压文件夹,编译并安装
./make.sh
./make.sh install
安装完成后,在控制台会输出安装的目录,如:
- 安装 FastDFS 主程序
tar -zxvf fastdfs-6.04.tar.gz
进入解压文件夹,编译并安装
./make.sh
./make.sh install
同样在安装完成后,在控制台会输出安装的目录,如:
上图的 /etc/fdfs
路径是配置文件路径,将解压缩的文件下的 conf
目录下的所有配置文件拷贝到 /etc/fdfs
目录下,准备接下来的 tracker
或 storage
配置
cp /home/software/fastdfs-6.04/conf/* /etc/fdfs/
tracker
和storage
都是同一个 FastDFS 的主程序的两个不同概念,配置不同的配置文件就可以设定为tracker
或者storage
1.1 配置 tracker 服务
上面安装的时候就说过 /etc/fdfs
目录下是一些配置文件,要配置 tracker 服务则配置 tracker.conf
文件即可,这里修改 base_path
属性(修改之后需要手动创建对应的目录 mkdir /usr/local/fastdfs/tracker -p
),它表示 tracker 的工作目录:
# the base path to store data and log files
base_path=/usr/local/fastdfs/tracker
启动 tracker 服务:
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
关闭 tracker 服务:
/usr/bin/stop.sh /etc/fdfs/tracker.conf
防火墙要开对应的默认端口
22122
1.2 配置 storage 服务
如下修改 storage 配置文件 /etc/fdfs/storage.conf
,同时记得添加对应的文件目录 mkdir /usr/local/fastdfs/storage -p
# 修改卷名(组名),其它 storage 配置了相同卷名和相同 tracker时,它们之间的文件数据就会同步,启动一个数据冗余的效果
group_name=seiei
# 修改 storage 的工作空间
base_path=/usr/local/fastdfs/storage
# 修改 storage 的存储空间
store_path0=/usr/local/fastdfs/storage
# 修改 tracker 的地址和端口号(即上述的配置的 tracker 服务器地址和端口号)
# 用于发送心跳检测
# 可以配置多个
# 如果设置为本地地址,不能设置为 127.0.0.1,而是 ipv4
tracker_server=192.168.1.153:22122
# 后续结合 nginx,对外服务端的端口号
http.server_port=8888
启动 storage 服务,必须首先启动 tracker
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf
防火墙要开启默认的端口
23000
1.2.1 使用客户端测试上传文件
在配置 storage
的节点服务器上修改 client.conf
配置文件(配置好 client,conf
后可以实现上传功能),并创建对应目录 mkdir /usr/local/fastdfs/client -p
base_path=/usr/local/fastdfs/client
# 如果设置为本地地址,不能设置为 127.0.0.1,而是 ipv4
tracker_server=192.168.1.153:22122
上传文件 logo.jpg
到 storage
上:
/usr/bin/fdfs_test /etc/fdfs/client.conf upload /home/software/logo.jpg
它会返回一些相应上传后的文件信息,如:
http://192.168.253.4/seiei/M00/00/00/wKj9BGJqe4OAcn7yAADUNagDX6M333_big.jpg
其中:
seiei
表示卷名(组名)M00
表示虚拟路径,如果是按照上述的配置,指向的就是/usr/local/fastdfs/storage/data/
这个目录- 再进入到
/usr/local/fastdfs/storage/data/00/00
这个目录下,就可以发现对应的上传文件了
不过此时在外部直接输入 url 访问,是无法访问的,它需要借助 nginx。
1.3 配置 nginx Fastdfs 实现文件服务器
- 解压、配置 nginx 插件
解压 Nginx 的 Fastdfs 的压缩包
tar -zxvf fastdfs-nginx-module-1.22.tar.gz
解压之后,进入到对应解压目录如 /home/software/fastdfs-nginx-module-1.22/src
,复制 mod_fastdfs.conf
配置文件到 /etc/fdfs
目录下
cp mod_fastdfs.conf /etc/fdfs
- 修改
mod_fastdfs.conf
配置文件
# the base path to store log files
base_path=/usr/local/fastdfs/tmp
# FastDFS tracker_server can ocur more than once, and tracker_server format is
# "host:port", host can be hostname or ip address
# valid only when load_fdfs_parameters_from_tracker is true
tracker_server=192.168.253.5:22122
# the group name of the local storage server
group_name=seiei
# if the url / uri including the group name
# set to false when uri like /M00/00/00/xxx
# set to true when uri like ${group_name}/M00/00/00/xxx, such as group1/M00/xxx
# default value is false
url_have_group_name = true
# store_path#, based 0, if store_path0 not exists, it's value is base_path
# the paths must be exist
# must same as storage.conf
store_path0=/usr/local/fastdfs/storage
- 修改
/home/software/fastdfs-nginx-module-1.22/src/config
文件,主要是以下两个变量
ngx_module_incs="/usr/include"
CORE_INCS="/usr/include"
- Nginx 添加对应模块配置
在 Nginx 的源文件目录(即解压缩的文件目录),使用 configure
命令,后面的具体操作参考 这里
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi \
--with-http_ssl_module \
--add-module=/home/software/fastdfs-nginx-module-1.22/src
最后在 Nignx 配置文件添加虚拟主机:
server {
listen 8888; // 在配置 storage 的配置文件时,对外服务端的端口号
server_name localhost;
// seiei 是卷名,MOO 是虚拟路径
location /seiei/MOO {
ngx_fastdfs_module; // Fastdfs 的 Nginx 扩展模块
}
}
重新启动 Nginx 后,查看一下上述上传的图片,访问 url 如下:
http://192.168.253.4:8888/seiei/M00/00/00/wKj9BGJqe4OAcn7yAADUNagDX6M333.jpg