FastDFS概念、安装、扩容

概念

FastDFS

FastDFS是用c语言编写的一款开源的分布式文件系统。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。由跟踪服务器(tracker server)、存储服务器(storage server)和客户端(client)组成。它主要解决的是海量数据存储的问题。

系统架构
跟踪服务器(TrackerServer)

跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的 storage server和 group,每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。

存储服务器(StorageServer)

存储服务器,主要提供容量和备份服务;以 group 为单位,每个 group 内可以有多台 storage server,数据互为备份。

客户端(Client)

客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。

image-20221102143953517

文件上传流程

FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用。

Storage Server会定期的向Tracker Server发送自己的存储信息。当Tracker Server Cluster中的Tracker Server不止一个时,各个Tracker之间的关系是对等的,所以客户端上传时可以选择任意一个Tracker。

当Tracker收到客户端上传文件的请求时,会为该文件分配一个可以存储文件的group,当选定了group后就要决定给客户端分配group中的哪一个storage server。当分配好storage server后,客户端向storage发送写文件请求,storage将会为文件分配一个数据存储目录。然后为文件分配一个fileid,最后根据以上的信息生成文件名存储文件。

文件下载流程

客户端uploadfile成功后,会拿到一个storage生成的文件名,接下来客户端根据这个文件名即可访问到该文件。

跟upload file一样,在downloadfile时客户端可以选择任意tracker server。tracker发送download请求给某个tracker,必须带上文件名信息,tracke从文件名中解析出文件的group、大小、创建时间等信息,然后为该请求选择一个storage用来服务读请求。

image-20221102144012765

单节点部署

安装
安装依赖
 yum  install -y gcc gcc-c++ perl perl-devel openssl openssl-devel pcre pcre-devel zlib zlib-devel libevent libevent-devel
安装libfastcommon库

下载地址:https://github.com/happyfish100/libfastcommon

tar  -xvf libfastcommon-1.0.43.tar.gz
cd libfastcommon-1.0.43/
./make.sh
./make.sh install
安装FastDFS
tar  -xvf fastdfs-6.06.tar.gz
cd fastdfs-6.06/
./make.sh
./make.sh  install
查看可执行文件
ll /usr/bin/fdfs*
查看配置文件
ll /etc/fdfs/
创建数据目录
mkdir -pv /data/fastdfs/tracker
mkdir  -p /data/fastdfs/storage
mkdir  -p /data/fastdfs/file
配置 tracker :
修改配置文件
cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf

vim /etc/fdfs/tracker.conf
base_path=/data/fastdfs/tracker #指定刚才配置的数据文件目录
配置 storage :
修改配置文件
cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf

vim  /etc/fdfs/storage.conf
base_path=/data/fastdfs/storage  #storage存储数据目录,基础路径,存储日志文件
store_path0=/data/fastdfs/file   #真正存放文件的目录,访问时使用该路径
tracker_server=10.55.1.216:22122 #注册当前存储节点的跟踪器地址
http.server_port=80  #访问端口
启动
启动tracker :
fdfs_trackerd /etc/fdfs/tracker.conf
##初次成功启动,会在配置的base_path下创建 data、logs 两个目录
启动 storage :
fdfs_storaged /etc/fdfs/storage.conf
重启
fdfs_trackerd /etc/fdfs/tracker.conf restart
fdfs_storaged /etc/fdfs/storage.conf restart
查看启动情况
netstat  -ntlp |grep fdfs
#查看 tracker 是否成功启动,22122 端口正在被监听,就算 tracker 启动成功
#查看 Storage 是否成功启动,23000 端口正在被监听,就算 Storage 启动成功
查看Storage和Tracker是否在通信bash
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
测试上传
  • 修改配置
cp /etc/fdfs/client.conf.sample  /etc/fdfs/client.conf 

vim /etc/fdfs/client.conf
base_path=/data/fastdfs/client #数据目录
tracker_server=10.55.1.216:22122  #Tracker端口
  • 上传
#创建目录和文件
mkdir -p /data/fastdfs/client
touch /data/fastdfs/client/1.log
#通过命令测试上传文件1.log
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf 1.log
#或者
fdfs_test /etc/fdfs/client.conf upload a.log

结果如下:

image-20221102144020764

上传成功后返回文件ID号:group1/M00/00/00/CjcB2GJ12qOAKLf_AAAAAAAAAAA002.log,返回的文件ID由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。

image-20221102144028600

  • 查看文件位置
ls /data/fastdfs/file/data/00/00/
  • 删除文件
fdfs_delete_file  /etc/fdfs/client.conf group1/M00/00/00/CjcB2GJ1AkKASVd1AAAAAAAAAAA195.txt
注意
  • 没有搭建集群默认只有一个组group1
  • 后缀名包含-m的为属性文件(meta)
  • 在Linux中并没有磁盘一说,M00是虚拟的,它其实就是data目录
外部访问
下载 fastdfs-nginx-module
下载地址:https://github.com/happyfish100/fastdfs-nginx-module/tags 
这里下载的是fastdfs-nginx-module-1.22.tar.gz
解压 fastdfs-nginx-module
tar  -xvf fastdfs-nginx-module-1.22.tar.gz
cd fastdfs-nginx-module-1.22/src/
/root/fastdfs-nginx-module-1.22/src  #需要记录这个路径
安装nginx
yum  install  -y pcre openssl-devel  pcre-devel gcc-c++ make
useradd nginx -s /sbin/nologin
mkdir /var/tmp/nginx/

tar -xvf nginx-1.14.2.tar.gz
cd nginx-1.14.2/

./configure  --prefix=/usr/local/nginx  --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --error-log-path=/usr/local/nginx/logs/error.log  --http-log-path=/usr/local/nginx/logs/access.log  --pid-path=/usr/local/nginx/logs/nginx.pid --lock-path=/usr/local/nginx/logs/lock/nginx.lock  --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client/ --http-proxy-temp-path=/var/tmp/nginx/proxy/ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre  --add-module=/root/fastdfs-nginx-module-1.22/src
#--add-module=/root/fastdfs-nginx-module-1.22/src 增加fastdfs-nginx-module 模块

make
make install
配置mod_fastdfs
mkdir -p /data/fastdfs/nginx_mod  #创建目录
cp fastdfs-nginx-module-1.22/src/mod_fastdfs.conf  /etc/fdfs/

vim /etc/fdfs/mod_fastdfs.conf

base_path=/data/fastdfs/nginx_mod ##mod_fastdfs存储数据目录
tracker_server=10.55.1.216:22122
store_path0=/data/fastdfs/file
url_have_group_name = true #如果文件ID的uri中包含/group**,则要设置为true

[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/data/fastdfs/file
配置nginx
cd fastdfs-6.06/conf
cp http.conf  mime.types  /etc/fdfs/

vim  /usr/local/nginx/conf/nginx.conf

location ~ /group[1-9]/M0[0-9] {
    ngx_fastdfs_module;
}

/usr/local/nginx/sbin/nginx

image-20221102144034782

集群部署

安装

首先需要在所有机器安装Fastdfs和nginx

ip部署
10.55.1.221nginx  tracker
10.55.1.222nginx  tracker
10.55.1.215nginx  client
10.55.1.217group1 nginx  storage1
10.55.1.218group1 nginx  storage2
10.55.1.219group2 nginx  storage3
10.55.1.220group2 nginx  storage4

image-20221102144039949

配置 tracker
mkdir -pv /data/fastdfs/tracker
cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf

vim /etc/fdfs/tracker.conf

base_path=/data/fastdfs/tracker
配置 storage
  • 修改group1 的 storage
mkdir  -p /data/fastdfs/storage
mkdir  -p /data/fastdfs/file

cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf

vim  /etc/fdfs/storage.conf
group_name = group1
base_path=/data/fastdfs/storage  #storage存储数据目录
store_path0=/data/fastdfs/file   #真正存放文件的目录
tracker_server=10.55.1.221:22122 #注册当前存储节点的跟踪器地址
tracker_server=10.55.1.222:22122
http.server_port=80  #访问端口
  • 修改group2 的 storage
mkdir  -p /data/fastdfs/storage
mkdir  -p /data/fastdfs/file

cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf

vim  /etc/fdfs/storage.conf
group_name = group2
base_path=/data/fastdfs/storage  #storage存储数据目录
store_path0=/data/fastdfs/file   #真正存放文件的目录
tracker_server=10.55.1.221:22122 #注册当前存储节点的跟踪器地址
tracker_server=10.55.1.222:22122
http.server_port=80  #访问端口
配置mod_fastdfs
  • 修改group1 的 mod_fastdfs
mkdir -p /data/fastdfs/nginx_mod 
cp fastdfs-nginx-module-1.22/src/mod_fastdfs.conf  /etc/fdfs/

vim /etc/fdfs/mod_fastdfs.conf

base_path=/data/fastdfs/nginx_mod ##mod_fastdfs存储数据目录
tracker_server=10.55.1.221:22122
tracker_server=10.55.1.222:22122
store_path0=/data/fastdfs/file
url_have_group_name = true #如果文件ID的uri中包含/group**,则要设置为true
group_name=group1 #重点修改组名
group_count = 2   #修改组的个数

[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/data/fastdfs/file

[group2]
group_name=group2  #组名
storage_server_port=23000   #端口
store_path_count=1   #存储路径个数
store_path0=/data/fastdfs/file  #存储路径
  • 修改group2 的 mod_fastdfs
mkdir -p /data/fastdfs/nginx_mod 
cp fastdfs-nginx-module-1.22/src/mod_fastdfs.conf  /etc/fdfs/

vim /etc/fdfs/mod_fastdfs.conf

base_path=/data/fastdfs/nginx_mod ##mod_fastdfs存储数据目录
tracker_server=10.55.1.221:22122
tracker_server=10.55.1.222:22122
store_path0=/data/fastdfs/file
url_have_group_name = true #如果文件ID的uri中包含/group**,则要设置为true
group_name=group2         #重点修改组名
group_count = 2           #修改组的个数

[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/data/fastdfs/file

[group2]
group_name=group2  #组名
storage_server_port=23000   #端口
store_path_count=1   #存储路径个数
store_path0=/data/fastdfs/file  #存储路径
配置nginx
cd fastdfs-6.06/conf
cp http.conf  mime.types  /etc/fdfs/

vim  /usr/local/nginx/conf/nginx.conf

location ~ /group[1-9]/M0[0-9] {
    ngx_fastdfs_module;
}
tracker nginx配置
vim /usr/local/nginx/conf/nginx.conf

    upstream fastdfs_storage_server {
        server 10.55.1.217:80;
        server 10.55.1.218:80;
        server 10.55.1.219:80;
        server 10.55.1.220:80;
    }
server {
    ... #内容省略
    location ~ /group[1-9]/M0[0-9] {
        proxy_pass http://fastdfs_storage_server;
    }
  }
启动
启动两个tracker:
fdfs_trackerd /etc/fdfs/tracker.conf
启动四个storage:
fdfs_storaged /etc/fdfs/storage.conf
启动四个storage上的nginx:
/usr/local/nginx/sbin/nginx
启动两个tracker上的nginx:
/usr/local/nginx/sbin/nginx
配置Client
mkdir -p /data/fastdfs/client
echo "1.txt" > /data/fastdfs/client/1.txt

vim /etc/fdfs/client.conf
base_path = /data/fastdfs/client
tracker_server = 10.55.1.221:22122
tracker_server = 10.55.1.222:22122

#通过命令测试上传文件1.log
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /data/fastdfs/client/1.txt
#或者
fdfs_test /etc/fdfs/client.conf upload /data/fastdfs/client/1.txt

扩容

纵向扩容

纵向扩容 指在同一个group组中增加服务器,实现数据冗余,数据备份。同一个group中最大容量取决于最小的storage的存储容量,因此如果还想继续使用此group,则需要对此group对应的所有服务器挂载同样容量的磁盘,指定store_path1……,但这样做的话成本相当的高。

适合于单机部署,创建时由于规划不合理,磁盘存储空间逐渐不够,需要添加磁盘的情况,fastdfs在一台服务器支持多个store_path,每个store_path指向一个存储路径(如果没有配置store_path,就使用base_path的路径),添加了硬盘后,通过把新的store_path指向新硬盘的挂载点,再修改配置文件,就能实现group的扩容。

停止服务
fdfs_trackerd /etc/fdfs/tracker.conf stop
fdfs_storaged /etc/fdfs/storage.conf stop

/usr/local/nginx/sbin/nginx -s stop
修改tracker.conf
vim  /etc/fdfs/tracker.conf
store_path=2

# 0 - 代表轮询进行存储,意思是在一个storage中配置的store_path0、store_path1……之间进行轮询存储文件
# 1 - 代表选择storage中存储路径中空闲空间最大的进行保存文件
# 2 - 负载均衡时,选择上传文件的最大可用空间路径
修改storage.conf
vim /etc/fdfs/storage.conf

store_path_count=2  #修改为2,指的是当前一个storage有几个存储文件的目录
store_path1=/data1/fastdfs/file  #新增,存储文件路径,对应上传后文件名为M01/xxxxxx
修改mod_fastdfs.conf
vim /etc/fdfs/mod_fastdfs.conf

store_path_count=2  #修改为2,默认为1,与storage.conf一致
store_path1=/data1/fastdfs/file  #新增,与storage.conf一致
nginx修改
#如果配置如下则无需修改,如果单独匹配M0..M1等,则需要新增
vim  /usr/local/nginx/conf/nginx.conf

location ~ /group[1-9]/M0[0-9] {
    ngx_fastdfs_module;
}
启动服务
fdfs_trackerd /etc/fdfs/tracker.conf 
fdfs_storaged /etc/fdfs/storage.conf 

/usr/local/nginx/sbin/nginx
检查挂载服务是否正常
fdfs_monitor /etc/fdfs/client.conf

image-20221102144047902

横向扩容
单机部署新增group
#上传数据
fdfs_test /etc/fdfs/client.conf upload /data/fastdfs/client/old-data1.txt
#返回
example file url: http://10.55.1.216/group1/M00/00/00/CjcB2GJ6F8aAQtCUAAAACl7auSc009.txt
example file url: http://10.55.1.216/group1/M00/00/00/CjcB2GJ6F8aAQtCUAAAACl7auSc009_big.txt #big是副本

查看未新增之前的状态

fdfs_monitor /etc/fdfs/client.conf

image-20221102144052241

新增服务器并部署fastdfs
#创建数据目录,这里使用单机的tracker,因此不创建tarcker的数据目录
mkdir -pv /data/fastdfs/tracker #不创建
mkdir  -p /data/fastdfs/storage
mkdir  -p /data/fastdfs/file

cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf

vim  /etc/fdfs/storage.conf
group_name = group2
base_path=/data/fastdfs/storage  #storage存储数据目录,基础路径,存储日志文件
store_path0=/data/fastdfs/file   #真正存放文件的目录,访问时使用该路径
tracker_server=10.55.1.216:22122 #注册当前存储节点的跟踪器地址,如果多个tracker也可以在下面新增一行
http.server_port=80  #访问端口
更改旧节点mod_fastdfs
vim /etc/fdfs/mod_fastdfs.conf
group_count =2 #修改组的个数
group_name=group1 #组名

[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/data/fastdfs/file

[group2]
group_name=group2
storage_server_port=23000
store_path_count=1
store_path0=/data/fastdfs/file
更改新节点mod_fastdfs
vim /etc/fdfs/mod_fastdfs.conf
group_count = 2 #修改组的个数
group_name=group2 #组名

[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/data/fastdfs/file

[group2]
group_name=group2
storage_server_port=23000
store_path_count=1
store_path0=/data/fastdfs/file
启动storage
fdfs_storaged /etc/fdfs/storage.conf
启动nginx
/usr/local/nginx/sbin/nginx #新节点启动
/usr/local/nginx/sbin/nginx -s reload  #旧节点重启
查看挂载
fdfs_monitor /etc/fdfs/client.conf
tracker修改(测试)
vim /etc/fdfs/tracker.conf
store_lookup = 2 #选择upload的group,0:表示所有的group以轮询方式选择;1:指定group,该group的名称由store_group配置指定;2:负载均衡,表示选择空余容量最大的group。

store_lookup=1
store_group=group2 #指定上传组

fdfs_trackerd /etc/fdfs/tracker.conf restart

参考:http://t.csdn.cn/WtupI
上传
fdfs_test /etc/fdfs/client.conf upload /data/fastdfs/client/new-data1.txt

http://10.55.1.223/group2/M00/00/00/CjcB32J6I1SAVOk2AAAACo5YM0o858.txt
http://10.55.1.223/group2/M00/00/00/CjcB32J6I1SAVOk2AAAACo5YM0o858_big.txt
访问
http://10.55.1.223/group2/M00/00/00/CjcB32J6I1SAVOk2AAAACo5YM0o858.txt

image-20221102144102225

http://10.55.1.216/group2/M00/00/00/CjcB32J6I1SAVOk2AAAACo5YM0o858.txt

image-20221102144107055

参考

https://www.cnblogs.com/chiangchou/p/fastdfs.html
http://t.csdn.cn/e0QbN
http://t.csdn.cn/S9ibn
http://t.csdn.cn/ahuAR
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值