分布式文件系统
分布式文件系统是一个允许文件通过网络在多台节点上分享的文件系统, 多台计算机节点共同组成一个整体, 为更多的用户提供分享文件. 比如常见的网盘, 本质上就是一个分布式的文件存储系统. 虽然是一个分布式的文件系统, 但是对用户来说是透明的, 用户是用的时候就像是访问本地磁盘一样.
分布式文件系统可以提供冗余备份, 所以容错能力很高. 系统中有某些节点宕机, 但是整体文件服务不会停止, 还是能够为用户提供服务, 系统还是运作的, 数据也不会丢失.
分布式文件系统的可扩展性强, 增加或减少节点都很简单, 不会影响线上服务, 增加完毕后会发布到线上, 加入到集群中为用户提供服务.
分布式文件系统可以提供负载均衡能力, 在读取文件副本的时候可以由多个节点共同提供服务, 而且可以通过横向扩展来确保性能的提升.
- 分布式文件系统
- 搭建fastdfs文件服务器
- 整个第三方文件存储服务
- SpringBoot与文件服务的整合
单机文件上传的问题
- 单向存储.使用Tomcat实现文件目录的虚拟化或者使用nginx实现.
- 不支持集群.
- 文件数据冗余.某一节点挂掉后, 其他节点依旧可以提供服务.高可用.
- 可扩展差.
为什么要使用分布式文件系统
- 海量文件数据存储
- 文件数据高可用(冗余备份)
- 读写性能和负载均衡
FastDFS 与 HDFS
两者的定位和应用场景不一样
- Hadoop中的文件系统HDFS主要解决并行计算中分布式存储数据的问题.其单个数据文件通常很大, 采用了分块(切分)存储的方式, 适合数据大文件存储来使用的场景.
- FastDFS主要用于互联网网站, 为文件上传和下载提供在线服务.所以在负载均衡、动态扩容等方面都支持得比较好.FastDFS用于存储中小文件都是不错的, 比如用户头像啊, 一些较小的音视频文件啊等等都行.
什么是FastDFS
- FastDFS是一个开源的轻量级分布式文件系统, 它对文件进行管理, 功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等, 解决了大容量存储和负载均衡的问题.特别适合以文件为载体的在线服务, 如相册网站、视频网站等等.
- FastDFS为互联网量身定制, 充分考虑了冗余备份、负载均衡、线性扩容等机制, 并注重高可用、高性能等指标, 使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载服务.
- FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage).跟踪器主要做调度工作, 在访问上起负载均衡的作用.
- 存储节点存储文件, 完成文件管理的所有功能:就是这样的存储、同步和提供存取接口, FastDFS同时对文件的metadata进行管理.所谓的meta data就是文件的相关属性, 以键值对(key value)的方式表示.文件metadata就是文件的属性列表, 包括多个键值对.
- 跟踪器和存储节点都可以由一台或多台服务器构成.跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务.其中跟踪器中的所有服务都是对等的, 可以根据服务器的压力情况随时增加或减少.
- 为了支持大容量, 存储节点(服务器)采用了分卷(或分组)的组织方式.存储系统由一个或多个卷组成, 卷与卷之间的文件是相互独立的, 所有卷的文件容量累加就是存储系统中的文件容量.一个卷可以由一台或多台存储服务器组成, 一个卷下的存储服务器中的文件都是相同的, 卷中的多台存储服务器起到了冗余备份和负载均衡的作用.
- 在卷中增加服务器时, 同步已有的文件由系统自动完成, 同步完成后, 系统自动将新增服务器切换到线上提供服务.
- 当存储空间不足或即将耗尽时, 可以动态添加卷.只需要增加一台或多台服务器, 并将它们配置为一个新的卷, 这样就扩大了存储系统, 这样就扩大了存储系统的容量.
- FastDFS中的文件标识分为两个部分:卷名和文件名, 二者缺一不可.
– 摘自<百度百科>
FastDFS 架构
冗余备份.
storage 与 tracker 之间是定时有心跳检测的.
FastDFS 安装配置
安装 libfastcommo
# 编译环境安装
yum install git gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl-devel wget vim -y
# 安装libfastcommon
git clone https://github.com/happyfish100/libfastcommon.git --depth 1
cd libfastcommon/
./make.sh && ./make.sh install
libfastcommon安装完成之后
mkdir -p /usr/lib64
mkdir -p /usr/lib
mkdir -p /usr/include/fastcommon
install -m 755 libfastcommon.so /usr/lib64
install -m 644 common_define.h hash.h chain.h logger.h base64.h shared_func.h pthread_func.h ini_file_reader.h _os_define.h sockopt.h sched_thread.h http_func.h md5.h local_ip_func.h avl_tree.h ioevent.h ioevent_loop.h fast_task_queue.h fast_timer.h process_ctrl.h fast_mblock.h connection_pool.h fast_mpool.h fast_allocator.h fast_buffer.h skiplist.h multi_skiplist.h flat_skiplist.h skiplist_common.h system_info.h fast_blocked_queue.h php7_ext_wrapper.h id_generator.h char_converter.h char_convert_loader.h common_blocked_queue.h multi_socket_client.h skiplist_set.h uniq_skiplist.h fc_list.h json_parser.h buffered_file_writer.h server_id_func.h fc_queue.h fc_memory.h shared_buffer.h thread_pool.h fc_atomic.h /usr/include/fastcommon
if [ ! -e /usr/lib/libfastcommon.so ]; then ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so; fi
安装 fastdfs
# 下载源码
git clone https://github.com/happyfish100/fastdfs.git --depth 1
# 查看安装配置
vim make.sh
# 编译安装
cd fastdfs/
./make.sh && ./make.sh install
# 查看
ls /usr/bin/fdfs_*
# 相关配置文件
cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
# 客户端文件, 测试用
cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
# 供nginx访问使用
cp /home/software/fastdfs/conf/http.conf /etc/fdfs/
# 供nginx访问使用
cp /home/software/fastdfs/conf/mime.types /etc/fdfs/
# 或者直接拷贝源码下的conf所有文件
cp /home/software/fastdfs/conf/* /etc/fdfs
安装 fastdfs-nginx-module
git clone https://github.com/happyfish100/fastdfs-nginx-module.git --depth 1
# 拷贝配置文件
cp /fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs
# 修改配置文件 释放的目录不是 /usr/local/include , 而应该是 /usr/include
vim /src/config
使用 Nginx 访问 FastDFS
为什么使用 Nginx 访问
FastDFS 通过 Tracker 服务器, 将文件放在Storage服务器存储, 但是同组存储服务器之间需要进入文件复制, 有同步延迟的问题.
假设Tracker服务器将文件上传到了192.168.4.125, 上传成功后文件ID已经返回给客户端. 此时 FastDFS 存储集群机制会将这个文件同步到同组存储192.168.4.126, 在文件还没有复制完成的情况下, 客户端如果用这个文件ID在192.168.4.126上取文件,就会出现文件无法访问的错误.
而fastdfs-nginx-module
可以重定向文件连接到文件上传时的源服务器取文件, 避免客户端由于复制延迟导致的文件无法访问错误.
安装 Nginx
Nginx需要和storage安装在同一节点上 和 安装 fastdfs-nginx-module
.
# 创建nginx临时目录
mkdir /var/temp/nginx -p
# 进入目录编译安装
./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/src/
make && make install
# 报错
# ‘%s’ directive output may be truncated writing up to 510 bytes into a region of size between 111 and 127 [-Werror=format-truncation=]
vim /home/software/fastdfs-nginx-module/src/common.c
# 把 file_id[128] -> file_id[1024]
# 修改 mod_fastdfs 配置文件 参考 config/fastDFS/mod_fastdfs.conf
vim /etc/fdfs/mod_fastdfs.conf
# 修改nginx配置文件 参考 config/fastDFS/nginx.conf
vim /usr/local/nginx/conf/nginx.conf
# 启动服务
cd /usr/local/nginx/sbin
./nginx
配置 tracker
使用 192.168.123.26 作为tracker
# 修改 应用数据存储 和 日志 目录, base_path
vim /etc/fdfs/tracker.conf
mkdir -p /usr/local/fastdfs/tracker
ps -ef | grep fdfs
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
# or
systemctl start fdfs_trackerd
ps -ef | grep fdfs_trackerd
配置 storage
使用 192.168.123.197 作为storage
# 修改配置文件
# base_path 数据和日志文件存储根目录
# store_path0 第一个存储目录
# tracker_server tracker服务器IP和端口
vim /etc/fdfs/storage.conf
mkdir -p /usr/local/fastdfs/storage
# 启动 注意, 必须先启动 tracker
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf
# or
systemctl start fdfs_storaged
ps -ef | grep fdfs_storaged
配置 client
# 修改配置文件
vim /etc/fdfs/client.conf
mkdir -p /usr/local/fastdfs/client
# 测试
/usr/bin/fdfs_test /etc/fdfs/client.conf upload test.jpg
FastDFS 状态
# 查看当前storage状态
fdfs_monitor /etc/fdfs/storage.conf
# 查看client状态
fdfs_monitor /etc/fdfs/client.conf
FastDFS 缺点
- 水平扩容
- 运维复杂
- 开发复杂
使用第三方云存储服务.
云存储阿里OSS
- SDK使用简单
- 提供强大的文件处理功能
- 零运维成本
- 图形化管理控制台
- CDN加速
阿里OSS使用
购买阿里OSS的 下行流量包(中国大陆) 和 标准存储包(中国大陆) .
创建一个Bucket
创建 AccessKey
File配置
file.host=http://192.168.123.197:8888/
file.endpoint=http://oss-cn-guangzhou.aliyuncs.com
file.accessKeyId=******
file.accessKeySecret=******
file.bucketName=dev-lgq-buket
file.objectName=foodie-dev/images