https://github.com/happyfish100/fastdfs
Tracker Server
: 跟踪服务器,主要做调度工作,起到均衡的作用。负责管理所有的 storage server
和 group
,每个 storage
在启动后会连接Tracker
,告知自己所属 group
等信息,并保持周期性心跳。Storage Server
: 存储服务器,主要提供容量和备份服务;以 group
为单位,每个group
内可以有多台 storage server
,数据互为备份。client
: 客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。Storage Server
会定期的向Tracker Server
发送存储信息如果Tracker Server
是集群形式,则每个Tracker
之间的关系是对等的,客户端上传时选择任意一个Tracker
即可。Tracker
进行上传操作时,会获取存储服务器相关信息,主要包括IP和端口。根据返回信息上传文件,通过存储服务器写入磁盘,并返回给客户端file_id、路径信息、文件名等信息。Tracker
收到客户端上传文件的请求时,会为该文件分配一个可以存储文件的group
,当选定了group后就要决定给客户端分配group
中的哪一个storage server
。storage server
后,客户端向storage
发送写文件请求,storage
将会为文件分配一个数据存储目录。然后为文件分配一个fileid
最后根据以上的信息生成文件名存储文件。storage
服务器返回,需要客户端自行保存。storage
配置的虚拟路径,与磁盘选项 store_path*
对应。如果配置了store_path0
则是 M00,如果配置了store_path1
则是M01,以此类推。storage
服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。group
内一个storage server
即认为写文件成功,storage server
写完文件后,会由后台线程将文件同步至同group
内其他的storage server
。storage
写文件后,同时会写一份binlog
,binlog
里不包含文件数据,只包含文件名等元信息,这份binlog
用于后台同步,storage
会记录向group
内其他storage
同步的进度,以便重启后能接上次的进度继续同步,进度以时间戳的方式进行记录,所以最好能保证集群内所有server
的时钟保持同步。storage
的同步进度会作为元数据的一部分汇报到traker
上,tracke
在选择读storage
的时候会以同步进度作为参考。Tracker server
。Tracker
,Tracker
从文名中解析出文件的group
、大小、创建时间等信息,然后选择一个storage
用来服务处理请求,返回对应文件。名称 | 说明 |
---|---|
centos | 7.X |
libfastcommon | FastDFS分离出的一些公用函数包 |
FastDFS | FastDFS本体 |
fastdfs-nginx-module | FastDFS和nginx的关联模块 |
nginx | nginx-1.16.1 |
yum -y install git gcc gcc-c++ make automake autoconf 1ibtool pcre pcre-devel zlib zlib-devel openssl-devel wget vim
说明 | 位置 |
---|---|
所有安装包 | /usr/local/soft/ |
数据存储位置 | /data/fastdfs/ |
mkdir /usr/local/soft/
cd /usr/local/soft
#下载libfastcommon源码包
wget https://github.com/happyfish100/libfastcommon/archive/V1.0.7.tar.gz
tar -xf libfastcommon-1.0.7.tar.gz
cd libfastcommon-1.0.7
#编译安装:
./make.sh && ./make.sh insta11
cd /usr/local/soft
#下载fastdfs源码包
wget https://github.com/happyfish100/fastdfs/archive/V5.05.tar.gz
cd fastdfs-5.05/
#编译安装
./make.sh && ./make.sh insta11
#供nginx访问使用
cp -r /usr/local/soft/fastdfs-5.05/conf/http.conf /etc/fdfs/
cp -r /usr/local/soft/fastdfs-5.05/conf/mime.types /etc/fdfs/
fastdfs-nginx-module下载
#下载nginx模块:
tar -xf fastdfs-nginx-module_v1.16.tar.gz
cp -r /usr/local/soft/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
#下载nginx源码
wget https://nginx.org/download/nginx-1.16.1.tar.gz
tar -xf nginx-1.16.1.tar.gz
cd nginx-1.16.1/
#预编译添加fastdfs-nginx-module模块
./configure --add-module=/usr/local/soft/fastdfs-nginx-module/src/
#编译安装
make && make install
In file included from /usr/local/soft/fastdfs-nginx-module/src//common.c:26:0,
from /usr/local/soft/fastdfs-nginx-module/src//ngx_http_fastdfs_module.c:6:
/usr/include/fastdfs/fdfs_define.h:15:27: fatal error: common_define.h: No such file or directory
#include "common_define.h"
^
compilation terminated.
fastdfs-nginx-module/src/config
中CORE_INCS="$CORE_INCS /usr/local/include/fastdfs /usr/local/include/fastcommon/"
去掉local
vim /usr/local/soft/fastdfs-nginx-module/src/config
...
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
...
cd /usr/local/soft/nginx-1.16.1
#预编译添加fastdfs-nginx-module模块
./configure --add-module=/usr/local/soft/fastdfs-nginx-module/src/
#编译安装
make && make install
#添加域名方便管理
vim /etc/hosts
192.168.2.10 fastdfs.com
mkdir -p /data/fastdfs/
cp -r /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
vim /etc/fdfd/tracker.conf
修改如下:
base_path=/data/fastdfs/
disabled=false #标识是否禁用,这里设置为 false 表示启用
bind_addr= #绑定地址,留空表示绑定所有可用地址
port=22122 #监听端口号
connect_timeout=30 #连接超时时间,单位为秒
network_timeout=60 #网络超时时间,单位为秒
base_path=/data/fastdfs/ #存储文件的基本路径
max_connections=256 #最大连接数
accept_threads=1 #接受连接的线程数
work_threads=4 #工作线程数
store_lookup=2 #存储查找方式
store_group=group2 #存储组名
store_server=0 #存储服务器编号
store_path=0 #存储路径编号
download_server=0 #下载服务器编号
reserved_storage_space = 10% #保留存储空间的百分比
log_level=info #日志级别,这里设置为 info
run_by_group= #运行用户组
run_by_user= #运行用户名
allow_hosts=* #允许连接的主机,这里设置为全部允许
sync_log_buff_interval = 10 #同步日志缓冲间隔,单位为秒
check_active_interval = 120 #检查活跃状态的间隔时间,单位为秒
thread_stack_size = 64KB #线程栈大小
storage_ip_changed_auto_adjust = true #存储 IP 变化自动调整的开关,这里设置为 true
storage_sync_file_max_delay = 86400 #存储同步文件最大延迟时间,单位为秒
storage_sync_file_max_time = 300 #存储同步文件最大时间,单位为秒
use_trunk_file = false #是否使用扩展文件
slot_min_size = 256 #槽位最小尺寸
slot_max_size = 16MB #槽位最大尺寸
trunk_file_size = 64MB #扩展文件大小
trunk_create_file_advance = false #是否提前创建扩展文件
trunk_create_file_time_base = 02:00 #扩展文件创建时间的基准,这里设置为凌晨 2 点
trunk_create_file_interval = 86400 #扩展文件创建间隔,单位为秒
trunk_create_file_space_threshold = 20G #扩展文件空间阈值
trunk_init_check_occupying = false #初始化检查扩展文件占用情况的开关
trunk_init_reload_from_binlog = false #是否从 binlog 重载初始化数据
trunk_compress_binlog_min_interval = 0 #扩展文件压缩的最小时间间隔,单位为秒
use_storage_id = false #是否使用存储 ID
storage_ids_filename = storage_ids.conf #存储 ID 配置文件名
id_type_in_filename = ip #文件名中的 ID 类型,这里设置为 IP
store_slave_file_use_link = false #从节点是否使用链接方式
rotate_error_log = false #是否轮转错误日志
error_log_rotate_time=00:00 #错误日志轮转时间
rotate_error_log_size = 0 #错误日志轮转大小
log_file_keep_days = 0 #保留日志文件的天数
use_connection_pool = false #是否使用连接池
connection_pool_max_idle_time = 3600 #连接池最大空闲时间,单位为秒
http.server_port=8080 #HTTP 服务器监听端口号
http.check_alive_interval=30 #检查存活状态的间隔时间,单位为秒
http.check_alive_type=tcp #检查存活状态的类型,这里设置为 TCP
http.check_alive_uri=/status.html #检查存活状态的 URI
cp -r /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
vim /etc/fdfs/storage.conf
...
port=23000 #storage服务端口,默认23000一般不修改
base_path=/data/fastdfs/ #数据和日志文件存放根目录
store_path0=/data/fastdfs/ #第一存储目录
tracker_server=fastdfs.com:22122 #tracker服务IP和端口号
http.server_port=8888 #http访问文件的端口(默认8888,和nginx保持一致)
disabled=false #标识是否禁用,这里设置为 false 表示启用
group_name=group1 #FastDFS 的分组名称
bind_addr= #绑定地址,留空表示绑定所有可用地址
client_bind=true #客户端是否绑定地址的开关,这里设置为 true
port=23000 #监听端口号
connect_timeout=30 #连接超时时间,单位为秒
network_timeout=60 #网络超时时间,单位为秒
heart_beat_interval=30 #心跳间隔时间,单位为秒
stat_report_interval=60 #状态报告间隔时间,单位为秒
base_path=/data/fastdfs/ #存储文件的基本路径
max_connections=256 #最大连接数
buff_size = 256KB #缓冲区大小
accept_threads=1 #接受连接的线程数
work_threads=4 #工作线程数
disk_rw_separated = true #磁盘读写是否分离的开关,这里设置为 true
disk_reader_threads = 1 #磁盘读取线程数
disk_writer_threads = 1 #磁盘写入线程数
sync_wait_msec=50 #同步等待时间,单位为毫秒
sync_interval=0 #同步间隔时间,单位为秒
sync_start_time=00:00 #同步开始时间
sync_end_time=23:59 #同步结束时间
write_mark_file_freq=500 #写入标记文件的频率
store_path_count=1 #存储路径个数
store_path0=/data/fastdfs/ #存储路径
subdir_count_per_path=256 #每个存储路径的子目录个数
tracker_server=fastdfs.com:22122 #Tracker 服务器地址
log_level=info #日志级别,这里设置为 info
run_by_group= #运行用户组
run_by_user= #运行用户名
allow_hosts=* #允许连接的主机,这里设置为全部允许
file_distribute_path_mode=0 #文件分布路径模式
file_distribute_rotate_count=100 #文件分布轮转计数
fsync_after_written_bytes=0 #写入多少字节后执行 fsync
sync_log_buff_interval=10 #同步日志缓冲间隔,单位为秒
sync_binlog_buff_interval=10 #同步二进制日志缓冲间隔,单位为秒
sync_stat_file_interval=300 #同步统计文件间隔,单位为秒
thread_stack_size=512KB #线程栈大小
upload_priority=10 #上传优先级
if_alias_prefix= #接口别名前缀
check_file_duplicate=0 #检查文件重复性的开关
file_signature_method=hash #文件签名方法
key_namespace=FastDFS #键命名空间
keep_alive=0 #保持连接的时间,单位为秒
use_access_log = false #是否使用访问日志
rotate_access_log = false #是否轮转访问日志
access_log_rotate_time=00:00 #访问日志轮转时间
rotate_error_log = false #是否轮转错误日志
error_log_rotate_time=00:00 #错误日志轮转时间
rotate_access_log_size = 0 #访问日志轮转大小
rotate_error_log_size = 0 #错误日志轮转大小
log_file_keep_days = 0 #保留日志文件的天数
file_sync_skip_invalid_record=false #是否跳过无效记录进行文件同步的开关
use_connection_pool = false #是否使用连接池
connection_pool_max_idle_time = 3600 #连接池最大空闲时间,单位为秒
http.domain_name= #HTTP 服务器的域名
http.server_port=8888 #HTTP 服务器监听端口号
#启动tracker服务:
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
#启动storage服务:
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf
# 重启storage服务:
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
cp -r /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
vim /etc/fdfs/client.conf
...
base_path=/data/fastdfs #存储文件路径
tracker_server=fastdfs.com:22122 #指定tracker服务IP地址和端口号
...
#测试上传图片,下载一张图片上传至/root/下
ls
anaconda-ks.cfg pcindex_small.png
#上传图片:
fdfs_upload_file /etc/fdfs/client.conf /root/pcindex_small.png
group1/M00/00/00/wKgCCmUQWBeAOIRdAAAYqekVITI126.png --这是存放图片的路径
#查看一下图片:
ls /data/fastdfs/data/00/00/wKgCCmUQWBeAOIRdAAAYqekVITI126.png
/data/fastdfs/data/00/00/wKgCCmUQWBeAOIRdAAAYqekVITI126.png
#删除图片:
fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKgCCmUQWBeAOIRdAAAYqekVITI126.png
#查看图片是否存在:
ls /data/fastdfs/data/00/00/
#修改mod_fastdfs.conf
vim /etc/fdfs/mod_fastdfs.conf
tracker_server=fastdfs.com:22122 #Tracker 服务器的地址和端口号
url_have_group_name = true #URL 是否包含分组名称的开关,设置为 true 表示 URL 包含分组名称
store_path0=/data/fastdfs #存储路径的配置。FastDFS 是一个分布式文件系统,数据会保存在多个存储路径中。store_path0 表示第一个存储路径,/data/fastdfs 是具体的路径。可以根据实际情况配置多个存储路径,每个存储路径使用不同的 store_pathX 配置项,例如 store_path1=/path/to/another/store
#配置nginx.config
vim /usr/local/nginx/conf/nginx.conf
...
server {
listen 8888; #该端口为storage.conf中的http.server_port相同
server_name localhost;
location ~/group[0-9]/ {
ngx_fastdfs_module;
}
#启动nginx
/usr/local/nginx/sbin/nginx
#重启nginx
/usr/local/nginx/sbin/nginx -s reload
#停止nginx
/usr/local/nginx/sbin/nginx -s stop
#上传一张图片
fdfs_upload_file /etc/fdfs/client.conf /root/pcindex_small.png
group1/M00/00/00/wKgCCmUQYGmAC88HAAAYqekVITI560.png
vim /etc/hosts
192.168.2.10 fastdfs.com
192.168.2.20 fastdfs2.com
192.168.2.30 fastdfs3.com
#在每台服务器执行如下命令修改主机名,注意不同服务器的网卡不同需要根据现场情况修改:
hostname `cat /etc/hosts|grep $(ifconfig ens33|grep broadcast|awk '{print $2}')|awk '{print $2}'`;su
vim /etc/fdfs/tracker.conf
#需要修改的内容如下
port=22122 # tracker服务器端口(默认22122,一般不修改)
base_path=/data/fastdfs # 存储日志和数据的根目录
vim /etc/fdfs/storage.conf
#需要修改的内容如下
port=23000 # storage服务端口(默认23000,一般不修改)
base_path=/data/fastdfs # 数据和日志文件存储根目录
store_path0=/data/fastdfs # 第一个存储目录
tracker_server=fastdfs.com:22122 # 服务器1
tracker_server=fastdfs2.com:22122 # 服务器2
tracker_server=fastdfs3.com:22122 # 服务器3
http.server_port=8888 # http访问文件的端口(默认8888,看情况修改,和nginx中保持一致)
#启动tracker服务:
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
#启动storage服务:
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf
vim /etc/fdfs/client.conf
#需要修改的内容如下
base_path=/data/fastdfs
tracker_server=fastdfs.com:22122 # 服务器1
tracker_server=fastdfs2.com:22122 # 服务器2
tracker_server=fastdfs3.com:22122 # 服务器3
# 下载一张图片上传至/root/下
[root@fastdfs ~]# ls
28e70ebf91667f0c9b04be96bc730c49.jpeg anaconda-ks.cfg pcindex_small.png
#上传图片
fdfs_upload_file /etc/fdfs/client.conf /root/28e70ebf91667f0c9b04be96bc730c49.jpeg
group1/M00/00/00/wKgCCmUWboKAJ2IPAAEnsjF1S3g58.jpeg
#任意一台验证:
ls /data/fastdfs/data/00/00/
wKgCCmUQYGmAC88HAAAYqekVITI560.png wKgCCmUWboKAJ2IPAAEnsjF1S3g58.jpeg
vim /etc/fdfs/mod_fastdfs.conf
#需要修改的内容如下
tracker_server=fastdfs.com:22122 # 服务器1
tracker_server=fastdfs2.com:22122 # 服务器2
tracker_server=fastdfs3.com:22122 # 服务器3
url_have_group_name=true
store_path0=/data/fastdfs
#配置nginx.config
vim /usr/local/nginx/conf/nginx.conf
#添加如下配置
server {
listen 8888; ## 该端口为storage.conf中的http.server_port相同
server_name localhost;
location ~/group[0-9]/ {
ngx_fastdfs_module;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#启动nginx
/usr/local/nginx/sbin/nginx -s reload
ngx_http_fastdfs_set pid=25197
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
# 会显示会有几台服务器 有3台就会 显示 Storage 1-Storage 3的详细信息