目录
一、介绍
二、FastDFS原理
三、FastDFS部署
1.资源清单
2.修改主机名
3.安装libfastcommon(tracker01、tracker02、storage1、storage2)
4.安装编译FastDFS(tracker01、tracker02、storage1、storage2)
5.配置tracker服务器(tracker01、tracker02)
6.配置Storage服务(storage1、storage2)
7.配置client(tracker01)
8.测试上传文件(tracker01)
9.在所有storage节点安装fastdfs-nginx-module和nginx(storage1、storage2)
10.部署代理(nginx)
一、介绍
1.FastDFS是一个开源的轻量级分布式文件系统,他对文件进行管理
2.功能:文件存储、文件同步、文件访问等
3.解决了大容量存储和负载均衡的问题,特别适合以文件为载体的在线服务
二、FastDFS原理
1.FastDFS架构
a.Tracker server
- 跟踪服务器,主要做调度工作,起到均衡的作用
- 负责管理所有的storage server和group,每个storage在启动后会连接Tracker,告知自己所属group等信息,并保持周期性心跳
b.Storage server
- 存储服务器,主要提供容量和备份服务;以group为单位每个Group内部可以由多台storage server,数据互为备份
- 客户端上传的文件最终存储在storage服务器上,Storage server没有实现自己的文件系统,而是利用操作系统的文件系统来管理文件,可以将stroage称为存储服务器
c.Client
- 客户端,上传下载数据的服务器
- FastDFS向使用者提供基本文件访问接口,以客户端库的方式提供给用户使用
2.文件的上传
a.选择tracker server
- 当集群中不止一个tracker server时,由于tracker之间时完全对等的关系,客户端在uoload文件时可以任意选择一个tracker。当tracker接收到upload file的请求时,会为该文件分配一个可以存储该文件的group,支持选择group的规则:
- Round robin:所有的group间轮询
- Spcifind group:指定某一个确定的group
- Load balance:剩余存储空间多group优先
b.选择storage server
- 当选定group后,tracker会在geoup内选择一个storage内选择一个storage server给客户端,支持选择storage的规则:
- Round robin:在group内的所有storage间轮询
- First server ordered by ip:按ip排序
- First server ordered by priority:按优先级排序
c.选择storage path
- 当分配好storage server后,客户端向storage发送写文件请求,storage将会为文件分配一个数据存储目录,支持规则如下:
- Round robin:多个存储目录间轮询
- 剩余存储空间最多的优先
d.生成Fileid(文件标识)
- 选定存储目录后,storage会为文件生一个Fileid,由storage server IP、文件创建时间、文件大小、文件crc32和一个随机数拼接而成,然后将这个二进制串进行base64编码,转换为可打印的字符串
e.生成文件名
- 当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个文件名,文件名由group、存储目录、两级子目录、fileid、文件后缀名拼接而成
3.文件的下载
a.定位文件
- 客户端上传文件后存储服务器会将文件ID返回给客户端,将此文件ID用于以后访问该文件的索引信息。
- 文件索引信息包括:组名、虚拟磁盘路径、数据两级目录、文件名
b.定位文件所在的group
- 通过组名tracker能够很快的定位到客户端要访问的存储服务器组,并将选择合适的存储服务器提供客户端访问
c.定位文件位置
- 存储服务器根据“文件存储虚拟磁盘路径”和“数据文件两级目录”可以很快定位到文件所在目录,并根据文件名找到客户端需要访问的文件
4.同步时间管理
a.写文件时,客户端将文件写至group内一个storage server即认为写文件成功,storageserver写完文件后,会由后台线程将文件同步至同group内其他的storage server。
b.每个storage写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文件名等元信息,这份binlog用于后台同步,storage会记录向group内其他storage同步的进度,以便重启后能接上次的进度继续同步;进度以时间戳的方式进行记录,所以最好能保证集群内所有server的时钟保持同步。
c.storage 的同步进度会作为元数据的一部分汇报到tracker上,tracke 在选择读storage的时候会以同步进度作为参考。比如一个group内有A、B、C三个storage server,A向C同步到进度为T1(T1以前写的文件都已经同步到B上了),B向C同步到时间戳为T2(T2>T1),tracker接收到这些同步进度信息时,就会进行整理,将最小的那个做为C的同步时间戳,本例中T1即为C的同步时间戳为T1(即所有T1以前写的数据都已经同步到C上了);同理,根据上述规则,tracker会为A、B生成一个同步时间戳。
5.集成Nginx
a.fastdfs-nginx-module可以重定向文件连接到文件上传时的源服务器取文件,避免客户端由于延迟导致的文件无法访问错误
b.使用nginx反向代理后,后端可以以HTTP请求的方式来访问文件资源。访问nginx反向代理+上传文件时的ID
三、FastDFS部署
1.资源清单
操作系统 | 主机名 | IP | 备注 |
OpenEuler 24.03 | tracker01 | 192.168.16.142 | 跟踪服务器1 |
OpenEuler 24.03 | tracker02 | 192.168.16.143 | 跟踪服务器2 |
OpenEuler 24.03 | storage1 | 192.168.16.144 | 存储服务器1 |
OpenEuler 24.03 | storage2 | 192.168.16.145 | 存储服务器2 |
OpenEuler 24.03 | nginx | 192.168.16.146 | 代理服务器 |
2.修改主机名
hostnamectl set-hostname tracker01
hostnamectl set-hostname tracker02
hostnamectl set-hostname storage1
hostnamectl set-hostname storage2
hostnamectl set-hostname nginx
3.安装libfastcommon(tracker01、tracker02、storage1、storage2)
dnf install -y zlib-devel gcc* libtool pcre-devel libevent tar
tar zxf libfastcommon-1.0.36.tar.gz
cd libfastcommon-1.0.36
./make.sh #编译
./make.sh install #安装
cd /usr/lib64/
ll libfast* #查看所有以libfast开头的内容
cp libfastcommon.so /usr/lib #覆盖原有模块文件
4.安装编译FastDFS(tracker01、tracker02、storage1、storage2)
tar zxf fastdfs-5.11.tar.gz
cd fastdfs-5.11
./make.sh
./make.sh install
5.配置tracker服务器(tracker01、tracker02)
cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
vi /etc/fdfs/tracker.confdisabled=false # (4行)启用配置文件
port=22122 # (11行)tracker服务器端口(默认22122)
base_path=/fastdfs/tracker # (22行)存储日志和数据的根目录
store_group=group1 #(53行)设置存储组名称mkdir -p /fastdfs/tracker
/etc/init.d/fdfs_trackerd start
6.配置Storage服务(storage1、storage2)
cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
vi /etc/fdfs/storage.confdisabled=false #4行
port=23000 #24行
base_path=/fastdfs/storage #41行
store_path0=/fastdfs/storage #109行
tracker_server=192.168.16.142:22122 #118行,Tracker1节点的IP
tracker_server=192.168.16.143:22122 #119行,Tracker2节点的IP
roup_name=group1 #11行
http.server_port=8888 #285行mkdir -p /fastdfs/storage
/etc/init.d/fdfs_storaged start
ps -ef | grep fdfs_storaged
7.配置client(tracker01)
cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
mkdir -p /fastdfs/tracker
vi /etc/fdfs/client.confbase_path=/fastdfs/tracker #10行
tracker_server=192.168.16.142:22122 #14行
tracker_server=192.168.16.143:22122 #15行
8.测试上传文件(tracker01)
fdfs_upload_file /etc/fdfs/client.conf libfastcommon-1.0.36.tar.gz
group1/M00/00/00/wKgQkGgmoPyAFz-aAAaiufaB4zI.tar.gz
9.在所有storage节点安装fastdfs-nginx-module和nginx(storage1、storage2)
a.安装fastdfs-nginx-module
tar zxvf fastdfs-nginx-module_v1.16.tar.gz
cd fastdfs-nginx-module/srcvi config ngx_addon_name=ngx_http_fastdfs_module
HTTP_MODULES="$HTTP_MODULES ngx_http_fastdfs_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_fastdfs_module.c"
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
CORE_LIBS="$CORE_LIBS -L/usr/lib -lfastcommon -lfdfsclient"
CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='256*1024' -DFDFS_MOD_CONF_FILENAME='\"/etc/fdfs/mod_fastdfs.conf\"'"
b.安装Nginx
dnf -y install pcre-devel zlib-devel gcc*
tar zxvf nginx-1.19.5.tar.gz
useradd nginx
cd nginx-1.19.5
cp /usr/include/fastcommon/* /usr/include/fastdfs/
./configure \
--prefix=/usr/local/nginx \
--add-module=/root/fastdfs-nginx-module/src/ --with-cc-opt="-Wno-error=format-truncation"
make && make install
ln -s /usr/local/nginx/sbin/* /usr/local/sbin
c.配置FastDFS
#复制文件到/etc/fdfs目录
cp /root/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
#修改配置文件
vi /etc/fdfs/mod_fastdfs.conf connect_timeout=10 #3行
base_path=/tmp #10行,用户存储日志的
tracker_server=192.168.16.142:22122 #40行
tracker_server=192.168.16.143:22122
url_have_group_name = true #54行
group_name=group1 #48行
storage_server_port=23000 #45行
store_path_count=1 #58行
store_path0=/fastdfs/storage #63行#复制FastDFS的部分配置文件到/etc/fdfs目录
cp /root/fastdfs-5.11/conf/http.conf /etc/fdfs
cp /root/fastdfs-5.11/conf/mime.types /etc/fdfs
#创建软链接
ln -s /fastdfs/storage/data /fastdfs/storage/M00
d.配置Nginx
vi /usr/local/nginx/conf/nginx.conf#user nobody;
worker_processes 1;#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;#pid logs/nginx.pid;events {worker_connections 1024;
}http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;server {listen 80;server_name localhost;location / {root html;index index.html index.htm;}location /group1/M00 {ngx_fastdfs_module;
}
}
}#启动服务
nginx -t
/usr/local/nginx/sbin/nginx#访问http://192.168.16.144/group1/M00/00/00/wKgQkGgmoPyAFz-aAAaiufaB4zI.tar.gz
10.部署代理(nginx)
#编译安装
dnf -y install pcre-devel zlib-devel gcc* tar
tar zxvf nginx-1.19.5.tar.gz
cd nginx-1.19.5
useradd nginx
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin#修改配置文件
vi /usr/local/nginx/conf/nginx.conf#user nobody;
worker_processes 1;#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;#pid logs/nginx.pid;events {worker_connections 1024;
}http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;upstream storage_server_group1{server 192.168.16.144:80 weight=10; #storage1节点的Ipserver 192.168.16.145:80 weight=10; #storage2节点的Ip}server {listen 80;server_name localhost;location / {proxy_pass http://storage_server_group1;}
}
}#启动服务
nginx -t
/usr/local/nginx/sbin/nginx#访问http://192.168.16.146/group1/M00/00/00/wKgQkGgmoPyAFz-aAAaiufaB4zI.tar.gz