1,FastDFS基本介绍:FastDFS 系统有三个角色,跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)。
- Tracker Server: 跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的 storage server
和 group,每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。 - Storage Server:存储服务器,主要提供容量和备份服务;以 group 为单位,每个 group 内可以有多台 storage server,数据互为备份。
- Client:客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。这里免不了放一张余庆老师介绍 FastDFS 的 PPT 中的一张架构图,清晰的说明了上述职责及关系:
- 这里免不了放一张余庆老师介绍 FastDFS 的 PPT 中的一张架构图,清晰的说明了上述职责及关系:
上述架构优点:1.高可靠性:无单点故障 2.高吞吐性:只要 Group 足够多,数据流量将足够分散。
那么怎么上传下载以及同步文件这么操作呢?我在这就不详细说全部流程了,大概上传流程就是客户端发送上传请求到Tracker Server服务器,接着Tracker Server服务器分配group和Storage Server,当然这是有一定规则的,选择好Storage Server后再根据一定规则选择存储在这个服务器会生成一个file_id,这个file_id 包含字段包括:storage server ip、文件创建时间、文件大小、文件 CRC32 校验码和随机数;每个存储目录下有两个 256 * 256 个子目录,后边你会知道一个Storage Server存储目录下有好多个文件夹的,storage 会按文件file_id进行两次 hash ,路由到其中一个子目录,然后将文件存储到该子目录下,最后生成文件路径:group 名称、虚拟磁盘路径、数据两级目录、file_id和文件后缀就是一个完整的文件地址。
2,FastDFS 在 CentOS 下配置安装部署
一、安装 libfastcommon 和 FastDFS
1,下载安装 libfastcommon ,这里是通过wget下载:
wget https://github.com/happyfish100/libfastcommon/archive/V1.0.7.tar.gz
解压 libfastcommon,命令:
tar -zxvf V1.0.7.tar.gz
移动解压目录到/usr/local下:
mv libfastcommon-1.0.7 /usr/local/
编译,进入libfastcommon-1.0.7目录,命令:
cd /usr/local/libfastcommon-1.0.7
./make.sh
安装,命令:
./make.sh install
显示这样的画面,就是安装 libfastcommon 成功啦。
2,下载安装 FastDFS,这里也是通过wget下载
wget https://github.com/happyfish100/fastdfs/archive/V5.05.tar.gz
解压 FastDFS ,命令:
tar -zxvf V5.05.tar.gz
移动解压目录到/usr/local下:
mv fastdfs-5.05/ /usr/local/
编译,进入fastfds-5.05目录,命令:
cd /usr/local/fastdfs-5.05
./make.sh
安装,命令:
./make.sh install
显示这样的画面,就是安装 FastDFS 成功啦。
二、配置 Tracker 服务
上述安装成功后,在/etc/目录下会有一个fdfs的目录,进入它。会看到三个.sample后缀的文件,这是作者给我们的示例文件,我们需要把其中的tracker.conf.sample文件改为tracker.conf配置文件并修改它。参照以下命令:
cd /etc/fdfs/
cp tracker.conf.sample tracker.conf
vim tracker.conf
// 编辑tracker.conf文件,找到你需要修改的两个参数就可以了,我这里不做修改,用默认的
# the base path to store data and log files // 数据和日志的存放目录
base_path=/home/yuqing/fastdfs
# HTTP port on this tracker server // http服务端口
http.server_port=8070
修改完成后我们需要建立tracker的工作目录,不然启动报错(上面base_path配置的目录)
mkdir -p /home/yuqing/fastdfs
启动tracker服务:
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start
查看监听:
ps -ef|grep fdfs 或 netstat -lnpt|grep fdfs
看到trackerd服务正常启动后,这时候就算 Tracker服务安装成功啦!
三、配置 Storage 服务
现在开始配置 Storage 服务,由于我这是单机器测试,你把 Storage 服务放在多台服务器也是可以的,它有 Group(组)的概念,同一组内服务器互备同步,这里不再演示。直接开始配置,依然是进入/etc/fdfs的目录操作,首先进入它。会看到三个.sample后缀的文件,我们需要把其中的storage.conf.sample文件改为storage.conf配置文件并修改它。参照以下命令:
cd /etc/fdfs/
cp storage.conf.sample storage.conf
vim storage.conf
打开storage.conf文件后,找到下面参数进行修改:
# the base path to store data and log files // 数据和日志的存放目录
base_path=/home/yuqing/fastdfs
# path(disk or mount point) count, default value is 1 // storage在存储文件时支持多路径,默认只设置一个(下面store_path0配置的数量个数)
store_path_count=1
# store_path#, based 0, if store_path0 not exists, it's value is base_path // 配置多个store_path路径,从0开始,如果store_path0不存在,则base_path必须存在
# the paths must be exist
// 此处可以配置多个路径,如:store_path0=xx, store_path1=xx,store_path2=xx
// 多个项目的文件按照文件夹分割,通过/usr/bin/fdfs_upload_file <config_file> <local_filename> [storage_ip:port] [store_path_index] 选择storage服务器和store_path角标上传到相应的项目下
store_path0=/home/yuqing/fastdfs
# tracker_server can ocur more than once, and tracker_server format is // 设置tracker_server
# "host:port", host can be hostname or ip address
tracker_server=192.168.2.121:22122
修改完成后我们需要建立tracker的工作目录,不然启动报错(上面base_path配置的目录和store_path0配置的目录)
mkdir -p /home/yuqing/fastdfs
启动storage服务:
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start
查看监听:
ps -ef|grep fdfs 或 netstat -lnpt|grep fdfs
很好,22122 和 23000端口都在监听了,这个时候你去/home/yuqing/fastdfs文件夹下看的话,会出现一大堆文件夹,而且进去还有一大堆,哈哈,这就是存放文件的啦!
到这里,我们安装配置并启动了 Tracker 和 Storage 服务,也没有报错了。那他俩是不是在通信呢?我们可以监视一下:
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
看到我红线处ACTIVE这样就 ok 啦!
四、配置 fdfs_upload_file 上传文件
依然是进入/etc/fdfs的目录操作,首先进入它。会看到三个.sample后缀的文件,我们需要把其中的client.conf.sample文件改为client.conf配置文件并修改它。参照以下命令:
cd /etc/fdfs/
cp client.conf.sample client.conf
vim client.conf
找到下面参数进行修改:
# the base path to store log files // 日志的存放目录
base_path=/home/yuqing/fastdfs
# tracker_server can ocur more than once, and tracker_server format is // tracker_server服务的地址和端口号
# "host:port", host can be hostname or ip address
tracker_server=192.168.2.121:22122
修改完成后我们就可以通过/usr/bin/fdfs_upload_file命令上传文件了,/usr/bin/fdfs_upload_file 命令用法:
[root@localhost fdfs]# /usr/bin/fdfs_upload_file
Usage: /usr/bin/fdfs_upload_file <config_file> <local_filename> [storage_ip:port] [store_path_index]
// 命令 配置文件 上传的文件 storage_ip和端口 store_path角标
文件上传后会返回文件所在路径,我们只要把这路径保存起来,后续集成Nginx我们就可以访问到上传的文件了
总结一下
这篇文章只是进行了 FastDFS 的安装与配置,没有任何难度可言,只要按照步骤一步步走下去就可以搞定。可能中间过程中我们会由于不细心经历各种错误,只要仔细看日志信息都能解决掉的。
由于余老师在 V4.05 以后的版本就把内置 HTTP服务去掉了,推荐大家结合 Nginx 使用 fastdfs-nginx-module 模块,所以,就算这篇你测试上传成功了,你也访问不了,下一篇分布式文件系统 - FastDFS 配置 Nginx 模块及访问测试中会进行配合 Nginx 完成全部FastDFS的安装测试上传下载等等全部工作。
FastDFS 配置 Nginx 模块及访问测试点击进入
以下附带 tracker.conf 和 storage.conf 的具体配置注释
1,tracker.conf
tracker.conf 配置文件分析:
// 配置tracker.conf这个配置文件是否生效,因为在启动fastdfs服务端进程时需要指定配置文件,所以需要使次配置文件生效。false是生效,true是屏蔽。
disabled=false
// 程序的监听地址,如果不设定则监听所有地址
bind_addr=
// tracker监听的端口
port=22122
// 链接超时设定
connect_timeout=30
// tracker在通过网络发送接收数据的超时时间
network_timeout=60
// 数据和日志的存放地点
base_path=/opt/fdfs
// 服务所支持的最大链接数
max_connections=256
// 工作线程数一般为cpu个数
work_threads=4
// 在存储文件时选择group的策略,0:轮训策略 1:指定某一个组 2:负载均衡,选择空闲空间最大的group
store_lookup=2
// 如果上面的store_lookup选择了1,则这里需要指定一个group
// store_group=group2
// 在group中的哪台storage做主storage,当一个文件上传到主storage后,就由这台机器同步文件到group内的其他storage上,0:轮训策略 1:根据ip地址排序,第一个 2:根据优先级排序,第一个
store_server=0
// 选择那个storage作为主下载服务器,0:轮训策略 1:主上传storage作为主下载服务器
download_server=0
// 选择文件上传到storage中的哪个(目录/挂载点),storage可以有多个存放文件的base path 0:轮训策略 2:负载均衡,选择空闲空间最大的
store_path=0
// 系统预留空间,当一个group中的任何storage的剩余空间小于定义的值,整个group就不能上传文件了
reserved_storage_space = 4GB
// 日志信息级别
log_level=info
// 进程以那个用户/用户组运行,不指定默认是当前用户
run_by_group=
run_by_user=
// 允许那些机器连接tracker默认是所有机器
allow_hosts=*
// 设置日志信息刷新到disk的频率,默认10s
sync_log_buff_interval = 10
// 检测storage服务器的间隔时间,storage定期主动向tracker发送心跳,如果在指定的时间没收到信号,tracker人为storage故障,默认120s
check_active_interval = 120
// 线程栈的大小,最小64K
thread_stack_size = 64KB
// storage的ip改变后服务端是否自动调整,storage进程重启时才自动调整
storage_ip_changed_auto_adjust = true
// storage之间同步文件的最大延迟,默认1天
storage_sync_file_max_delay = 86400
// 同步一个文件所花费的最大时间
storage_sync_file_max_time = 300
// 是否用一个trunk文件存储多个小文件
use_trunk_file = false
// 最小的solt大小,应该小于4KB,默认256bytes
slot_min_size = 256
// 最大的solt大小,如果上传的文件小于默认值,则上传文件被放入trunk文件中
slot_max_size = 16MB
// trunk文件的默认大小,应该大于4M
trunk_file_size = 64MB
// http服务是否生效,默认不生效
http.disabled=false
// http服务端口
http.server_port=8080
// 检测storage上http服务的时间间隔,<=0表示不检测
http.check_alive_interval=30
// 检测storage上http服务时所用请求的类型,tcp只检测是否可以连接,http必须返回200
http.check_alive_type=tcp
// 通过url检测storage http服务状态
http.check_alive_uri=/status.html
// if need find content type from file extension name
http.need_find_content_type=true
// 用include包含进http的其他设置
// include http.conf
2,storage.conf配置文件分析
storage.conf配置文件分析:
// 同tracker.conf
disabled=false
// 这个storage服务器属于那个group
group_name=group1
// 同tracker.conf
bind_addr=
// 连接其他服务器时是否绑定地址,bind_addr配置时本参数才有效
client_bind=true
// 同tracker.conf
port=23000
connect_timeout=30
network_timeout=60
// 主动向tracker发送心跳检测的时间间隔
heart_beat_interval=30
// 主动向tracker发送磁盘使用率的时间间隔
stat_report_interval=60
// 同tracker.conf
base_path=/opt/fdfs
max_connections=256
// 接收/发送数据的buff大小,必须大于8KB
buff_size = 256KB
// 同tracker.conf
work_threads=4
// 磁盘IO是否读写分离
disk_rw_separated = true
// 是否直接读写文件,默认关闭
disk_rw_direct = false
// 混合读写时的读写线程数
disk_reader_threads = 1
disk_writer_threads = 1
// 同步文件时如果binlog没有要同步的文件,则延迟多少毫秒后重新读取,0表示不延迟
sync_wait_msec=50
// 同步完一个文件后间隔多少毫秒同步下一个文件,0表示不休息直接同步
sync_interval=0
// 表示这段时间内同步文件
sync_start_time=00:00
sync_end_time=23:59
// 同步完多少文件后写mark标记
write_mark_file_freq=500
// storage在存储文件时支持多路径,默认只设置一个
store_path_count=1
// 配置多个store_path路径,从0开始,如果store_path0不存在,则base_path必须存在
store_path0=/opt/fdfs
// store_path1=/opt/fastdfs2
// subdir_count * subdir_count个目录会在store_path下创建,采用两级存储
subdir_count_per_path=256
// 设置tracker_server
tracker_server=x.x.x.x:22122
// 同tracker.conf
log_level=info
run_by_group=
run_by_user=
allow_hosts=*
// 文件在数据目录下的存放策略,0:轮训 1:随机
file_distribute_path_mode=0
// 当问及是轮训存放时,一个目录下可存放的文件数目
file_distribute_rotate_count=100
// 写入多少字节后就开始同步,0表示不同步
fsync_after_written_bytes=0
// 刷新日志信息到disk的间隔
sync_log_buff_interval=10
// 同步storage的状态信息到disk的间隔
sync_stat_file_interval=300
// 线程栈大小
thread_stack_size=512KB
// 设置文件上传服务器的优先级,值越小越高
upload_priority=10
// 是否检测文件重复存在,1:检测 0:不检测
check_file_duplicate=0
// 当check_file_duplicate设置为1时,次值必须设置
key_namespace=FastDFS
// 与FastDHT建立连接的方式 0:短连接 1:长连接
keep_alive=0
// 同tracker.conf
http.disabled=false
http.domain_name=
http.server_port=8888
http.trunk_size=256KB
http.need_find_content_type=true
// include http.conf