一、基本介绍
1.含义
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理。
2.功能
文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。 FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
3.适用场景
特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
4.角色分配及作用
1)跟踪器:(tracker)
做调度工作,在访问上起负载均衡的作用。
2)存储节点:(storage server)
完成文件管理的所有功能。就是这样的存 储、同步和提供存取接口,FastDFS同时对文件的metadata进行管理。 所谓文件的meta data就是文件的相关属性,以键值对(key value)方式表示,如:width=1024,其中的key为width,value为1024。 文件metadata是文件属性列表,可以包含多个键值对。
3)二者的部署
跟踪器和存储节点:可以由一台或者多台服务器构成。可随时增加或者减少数量,而不影响线上服务。
5.存储节点的组成【storage server】
为支持大容量,采用分卷【分组:group volume】的组织方式。
存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。
一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。
在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。
6.如何进行扩大容量
当存储空间不足或即将耗尽时,可以动态添加卷。 只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。
7.文件标识
分为两种:卷名+文件名【缺一不可】
8.上传交互过程
-
client询问tracker上传到的storage,不需要附加参数;
-
tracker返回一台可用的storage;
-
client直接和storage通讯完成文件上传。
9.下载交互过程
-
client询问tracker下载文件的storage,参数为文件标识(卷名和文件名);
-
tracker返回一台可用的storage;
-
client直接和storage通讯完成文件下载。
#####需要说明的是,client为使用FastDFS服务的调用方,client也应该是一台服务器,它对tracker和storage的调用均为服务器间的调用。
二、fastdfs的应用
1.架构
FastDFS服务有三个角色:跟踪服务器(tracker server)、存储服务器(storage server)和客户端(client)
1)跟踪服务器,tracker server
主要做调度工作,起到均衡的作用;负责管理所有的 storage server 和 group,每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳, Tracker根据storage心跳信息,建立group--->[storage server list]的映射表;tracker管理的元数据很少,会直接存放在内存;tracker 上的元信息都是由 storage 汇报的信息生成的,本身不需要持久化任何数据,tracker 之间是对等关系,因此扩展 tracker 服务非常容易,之间增加 tracker服务器即可,所有tracker都接受stroage心跳信息,生成元数据信息来提供读写服务(与 其他 Master-Slave 架构的优势是没有单点,tracker 也不会成为瓶颈,最终数据是和一个可用的 Storage Server进行传输的)
2)存储服务器storage server
主要提供容量和备份服务;以 group 为单位,每个 group 内可以包含多台storage server,数据互为备份,存储容量空间以group内容量最小的storage为准;建 议group内的storage server配置相同;以group为单位组织存储能够方便的进行应用隔离、负载均衡和副本数定制;
缺点是 group 的容量受单机存储容量的限制,同时 group 内机器坏掉,数据 恢复只能依赖 group 内其他机器重新同步(坏盘替换,重新挂载重启 fdfs_storaged 即可)
3)客户端client
主要是上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。每个客户端服务器都需要安装Nginx
3)多个group之间的存储策略
有3种策略:round robin(轮询)、load balance(选择最大剩余空 间的组上传文件)、specify group(指定group上传)
group 中 storage 存储依赖本地文件系统,storage 可配置多个数据存储目录,磁盘不做 raid, 直接分别挂载到多个目录,将这些目录配置为 storage 的数据目录即可。 storage 接受写请求时,会根据配置好的规则,选择其中一个存储目录来存储文件;为避免单个目录下的文件过多,storage 第一次启时,会在每个数据存储目录里创建 2 级子目录,每级 256 个,总共 65536 个,新写的文件会以 hash 的方式被路由到其中某个子目录下,然后将文件数据直 接作为一个本地文件存储到该目录中
总结:1.高可靠性:无单点故障 2.高吞吐性:只要Group足够多,数据流量是足够分散的。
2.工作流程
fastdfs提供基本的文件访问接口,如:upload、download、append、delete等
1)上传
0.storage server会周期性的向tracker 发送状态信息。
1.客户端发送上传请求到tracker
2.tracker 向storage进行筛选,筛选完成后选择分配group和storage传给tracker
3.tracker会返回给clientstorage的地址和端口
4.client上传文件【file content和metadata】给storage
5.storage生成file_id将上传内容写入磁盘
6.storage返回file_id【路径信息和文件名】给client
7.client端完成存储文件信息
2)下载
0.storge会定期向tracker上传状态信息
1.client发出下载链接请求给tracker
2.tracker检查可用的storage【检查同步状态】
3.tracker返回信息给client【包括storage的IP和端口】
5.storage收到来自client端的信息后,查找文件
6.将查找到的文件file_content返回给client
3)生成的文件诠释
FastDFS生成的一个文件ID示例:
磁盘部分M后面的两位数字,表示基于0的磁盘序号。
文件名(不含后缀名)采用Base64编码,包含如下5个字段(每个字段均为4字节整数):
* 源storage server ID或IP地址
* 文件创建时间戳
* 文件大小
* 文件内容CRC32校验码
* 随机数
引入随机数的目的是防止生成重名文件。
如果采用了合并存储,生成的文件ID将变长,文件名后面多了16个字节。
这部分同样采用Base64编码,包含如下3个字段(每个字段均为4字节整数):
* 存放到的trunk file ID
* 文件偏移量(offset)
* 占用的空间大小
根据前两个字段,可以知道文件存放的trunk file及偏移位置。
FastDFS不需要文件索引,省掉了传统的name server角色,使得FastDFS更加简洁高效。
3.命令的使用
#基础命令:
/usr/local/fastdfs-5.05/stop.sh|start.sh /etc/fdfs/storage.conf 开启关闭
/usr/local/fastdfs-5.05/stop.sh|start.sh /etc/fdfs/tracker.conf 开启关闭
/etc/init.d/fdfs_trackerd stop|start|restart 开启关闭
/etc/init.d/fdfs/fdfs_storaged stop|start|restart 开启关闭
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf 重读配置
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf 重读配置
/usr/bin/fdfs_monitor /etc/storage.conf 查看状态
/usr/bin/fdfs_upload_file /etcc/fdfs/storage.conf xxx.txt 上传文件
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf delete group1 ip 删除节点
INIT :初始化,尚未得到同步已有数据的源服务器
WAIT_SYNC :等待同步,已得到同步已有数据的源服务器
SYNCING :同步中
DELETED :已删除,该服务器从本组中摘除
OFFLINE :离线
ONLINE :在线,尚不能提供服务
ACTIVE :在线,可以提供服务
4.如何解决数据一致性的问题
FastDFS以简洁高效著称,适用于轻量级定位以及应用场景。因此FastDFS放弃强一致性,采用弱一致性和最终一致的做法。
FastDFS的文件ID是服务端生成的,其中包含了storage ID或IP地址、文件创建时间、CRC32校验码、文件大小和随机数等字段。FastDFS文件ID的生成机制决定了可以在任意一台storage server上传文件而不用担心文件名和同组的其他storage server生成的文件冲突。
出于性能和简洁考虑,FastDFS复制文件采用异步方式,这是保证数据最终一致的做法。
FastDFS为了支持文件修改,引入了appender这一文件类型。FastDFS支持对appender类型的文件进行修改和追加等操作。如果在两台storage server上修改同一个appender文件(即使在顺序修改的情况下),可能就会因为时序问题导致数据不一致的现象发生。为了解决这个问题,FastDFS采取的做法是,对appender文件的修改以及对文件的删除只能在源storage server上进行。
FastDFS直接借助底层文件系统来存储和管理文件。在文件复制过程中,为了避免应用端读到不完整的数据,storage server采用先写临时文件,完成后再改名的做法。为了保证数据完整性以及在异常情况下不覆盖上个版本的数据,tracker server和storage server写入重要的数据文件时,均采用了先写临时文件,然后改名的做法。
5.fastdfs的误解
#误解一 、FastDFS不能存储大文件
因为FastDFS没有对大文件做特殊处理和支持,FastDFS非常适合存储小文件(10MB以下),也适合存储中型文件(小于1GB),可以存储大文件(小于10GB),不太适合存储超大文件(大于10GB)。
FastDFS上传大文件时,可以先上传appender类型的文件,然后以分片方式(比如每次64MB)调用append方法,完成上传后可以调用V6.02开始支持的regenerate_appender_filename方法将文件改名为普通文件。
FastDFS支持指定文件偏移量和下载的内容大小,使用这一特性可以支持大文件断点续传,也可以支持多线程方式下载大文件。
#误解二、FastDFS限制存储的文件数
为了防止一个目录下的文件数过多影响访问性能,FastDFS采用两级目录来保存文件。每一级目录最大256个子目录(默认配置为256,可以酌情改小),两级目录对应的存储目录数为 256 * 256 = 65536。如果平均一个目录下保存1k个文件,那么存储的文件总数将超过6kw。
为什么大家会认为FastDFS将限制存储的文件数呢?是因为FastDFS的一种做法让大家产生了误解,这就是默认的按目录轮流存储方式(参数file_distribute_to_path为0,即轮流存储方式,默认设置就是0)。此时还有一个参数file_distribute_rotate_count来设置存储到多少个文件后轮转到下一个目录。需要澄清的是,轮转到下一个目录的依据,不是当前目录已存储的文件数(实际存放文件数),而是本轮已存储的文件数。这是个内存计数器,在有更新的情况下会定期刷到文件中。引入这两个参数的目的,是让存储目录下的文件尽可能分散(防止文件过度集中),但又不保证绝对平均分布。比如可能一个目录下存在的文件数为200(两台storage server均可以上传文件的情况下),但另外一个目录下的文件数却只有180(本来存放了200个文件,其中20个文件后来被删除了)。
6.特点
##FastDFS特点如下:
1)分组存储,简单灵活;
2)对等结构,不存在单点;
3)文件ID由FastDFS生成,作为文件访问凭证。FastDFS不需要传统的name server或meta server;
4)大、中、小文件均可以很好支持,可以存储海量小文件;
5)一台storage支持多块磁盘,支持单盘数据恢复;
6)提供了nginx扩展模块,可以和nginx无缝衔接;
7)支持多线程方式上传和下载文件,支持断点续传;
8)存储服务器上可以保存文件附加属性。
7.专业术语
1、tracker server:中心服务器,FastDFS server端两大主角之一。tracker server作为FastDFS集群管理中心,管理集群拓扑结构,对storage server文件上传和文件下载起到负载均衡调度作用。使用命令fdfs_monitor可以查看集群状态。
2、storage server:存储服务器,FastDFS server端两大主角之二。文件相关功能都通过storage server来完成,包括文件上传、下载、文件同步等等。
3、合并存储:为了防止文件系统inode耗尽,若干小文件合并存储到一个大文件(trunk file)中。V3开始支持合并存储特性,如果单台storage server存储的文件数超过一千万,可以考虑开启合并存储功能。
4、trunk server:V3合并存储引入了trunk server这一角色。trunk server用于管理trunk文件可用空间,由一个group的一台storage server兼任,trunk server由tracker leader指定。
5、base_path:FastDFS基路径,配置文件tracker.conf和storage.conf中均需要配置。fastdfs运行时不会自动创建base_path目录,需要事先建好。FastDFS自身的数据文件存储在$base_path/data目录下,日志文件存储在 $base_path/logs目录下。storage server在$base_path/data/sync目录下存放文件上传、删除等更改操作的binglog,可能会占用base_path较大的存储空间。
6、store_path:存储路径,通常对应一块硬盘或RAID盘。FastDFS支持多个存储路径,最多支持256个。多个store_path配置在storage.conf中,第一个为store_path0,第二个为store_path1,以此类推。多个store_path的顺序很重要,一个group的多台storage server的store_path是按顺序对应的,并且生成的文件ID中包含了store_path顺序号,因此不要随意调整配置文件中的store_path顺序。
7、文件ID:上传文件时由storage server生成访问该文件的凭证,包括group名称、存储路径顺序号以及包含两级目录的文件名,应用程序(调用方)需要将文件ID保存到数据库等存储介质中。一个文件ID示例:group1/M00/01/32/wKgCaFx1982ENxLWAAAAAA0e5-o982.txt
8、主从文件:文件名存在关联的一组文件。从文件名在主文件名的基础上增加后缀。
主文件:组名 + 带路径的文件名 + 文件后缀
从文件:组名 + 带路径的文件名 + 从文件后缀名 + 文件后缀
从文件与主文件的组名、带路径的文件名 以及 文件后缀均相同。
友情提示:从文件后缀名最长为16字节,文件后缀最长为6,比如.tar.gz。
例如:
主文件:
group1/M00/00/00/oYYBAF25iTmIYXVYAAAIF0b_gq8AAAAVgAAAAAAAAgv40322.jpg
从文件:
group1/M00/00/00/oYYBAF25iTmIYXVYAAAIF0b_gq8AAAAVgAAAAAAAAgv40322_big.jpg
9、appender类型文件:FastDFS将上传文件分为普通文件和appender类型文件。普通文件上传后不能被修改,而针对appender类型文件后续可以进行append和modify等修改操作。使用合并存储特性的情况下,FastDFS依然会将一个appender类型文件保存为一个单独的文件。
8.使用的注意事项
1. FastDFS适用的场景以及不适用的场景
FastDFS是为互联网应用量身定做的一套分布式文件存储系统,非常适合用来存储图片、音频、视频、文档等文件。对于互联网应用,简洁高效的FastDFS和其他分布式文件系统相比,优势非常明显。具体情况大家可以查阅相关介绍文档,如:FastDFS架构设计文档等等。
出于简洁考虑,FastDFS没有对文件做分块存储,因此不太适合分布式计算场景。
2. 服务器时间必须保持一致
因为FastDFS的精巧设计不需要存储文件索引,FastDFS通过比较时间戳来判断文件是否同步完成。因此集群内的服务器时间要保持一致,各台服务器的时间差值不要超过1秒。建议采用NTP对时服务。
3. too many open files错误解决方法
日志中报打开文件过多的错误,是因为系统允许一个进程打开的文件数设置太小了。Linux环境下的解决办法,修改文件/etc/security/limits.conf,在文件尾部添加如下代码(如果已经存在则修改相应数值):
root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535
注:只配置最后两行不就可以了吗,为啥还要单独为root用户配置呢?查了网上资料,说是*这样的通配符对root用户无效,所以root需要单独配置(嗯,阿里云ECS就配置了上面这4行)。
4. FastDFS服务启停
FastDFS server程序自带start、stop和restart指令,命令行示例如下:
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf [start | stop | restart]
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf [start | stop | restart]
###可以使用kill或者killall正常杀掉 fdfs_trackerd 和 fdfs_storaged 进程,但
千万不要加上-9参数强杀,否则可能会导致binlog数据丢失等问题。
5. FastDFS支持断点续传吗?
上传和下载文件均可支持。
对于文件上传,需要先上传appender类型的文件,然后使用apend方法。
如果要上传超过1GB的大文件,建议采用append方式分多次上传,比如每次上传64MB。需要先创建appender类型的文件,可以创建空的appender文件。
对于超大文件,如果想支持多线程上传以加快上传速度,可以采用如下3个步骤实现:
1)上传appender类型的文件;
2) 调用truncate方法将该appender文件设置为最终文件大小;
3)调用modify方法并发上传文件分片。
对于文件下载,FastDFS可以指定文件偏移量和获取的文件内容大小。利用这个特性,文件下载可以实现断点续传以及多线程下载。
6. Java SDK非线程安全
FastDFS提供的Java SDK是非线程安全的,有人已经踩过这个坑了。包括负责与tracker server交互的TrackerClient、与storage server直接通信的StorageClient 和 StorageClient1 这三个类均是非线程安全的。
为啥会出现两个StorageClient字样的类名呢?二者实现功能完全一样,StorageClient是group和filename分离的用法,StorageClient1是group和filename合体用法(文件ID)。通常使用StorageClient1就好。
9.性能调优
众所周知,软件性能调优不是一撮而就的事情,它是一个反复磨合的过程。下面介绍FastDFS几个性能调优相关的重要参数,供大家参考。
1. 最大并发连接数
配置文件:tracker.conf 和 storage.conf
参数名:max_connections
缺省值:256,默认配置:1024
FastDFS为一个连接分配一个task buffer,为了提升分配效率,FastDFS采用内存池的做法。FastDFS老版本直接事先分配 max_connections 个buffer,这个做法显然不是太合理,在max_connections 设置过大的情况下太浪费内存。v5.04对预分配采用增量方式,tracker一次预分配1024个,storage一次预分配256个。task buffer实际内存占用情况测算如下:
改进前:max_connections * buffer_size
改进后:预分配buffer数 * buffer_size
使用v5.04及后续版本,可以根据实际需要将 max_connections 设置为一个较大的数值,比如 10240 或65535 甚至更大。
友情提示:此时需要将一个进程允许打开的最大文件数调大到超过max_connections,否则FastDFS server启动会报错。
2. 工作线程数
配置文件:tracker.conf 和 storage.conf
参数名:work_threads
缺省值:4
work threads主要负责网络IO处理,一个线程通过epoll这样的机制处理若干个网络连接。work threads理论上不会消耗太多CPU,不建议配置得过大。
为了减少CPU上下文切换的开销,以及不必要的资源消耗,不建议将本参数设置得过大。为了充分发挥出多个CPU的效能,系统中的线程数总和,建议不要超过CPU总数的2倍。
对于tracker server,公式为:
work_threads + 2 <= 2 * CPU总数
对于storage server,公式为:
work_threads + 1 + 本组storage server数 + (disk_reader_threads + disk_writer_threads) * store_path_count <= 2 * CPU总数
3. storage磁盘读写线程数
配置文件:storage.conf
1)disk_rw_separated:磁盘读写是否分离,缺省值为 true
2)disk_reader_threads:单个磁盘文件读取线程数,缺省值为 1
3)disk_writer_threads:单个磁盘文件写入线程数,缺省值为 1
注:单个(或一个)磁盘对应storage server的一个store path。
如果磁盘读写混合,单个磁盘读写线程总数为读取线程数 与 写入线程数之和。
对于单盘挂载方式,磁盘读写线程分别设置为 1 即可。
如果磁盘做了RAID,比如RAID5或RAID10,那么需要酌情加大读写线程数,这样才能最大程度地发挥磁盘IO能力。
4. storage同步延迟相关设置
配置文件:storage.conf
1)sync_binlog_buff_interval:将binlog buffer写入磁盘的时间间隔,单位为秒,取值大于0,缺省值为60,建议设置为1。
2)sync_wait_msec:如果没有需要同步的文件,对binlog进行轮询的时间间隔,单位为毫秒,取值大于0,缺省值为200,建议设置为50。
3)sync_interval:同步完一个文件后,休眠的毫秒数,缺省值为0,通常设置为0即可。
为了尽快完成文件同步,将上述3个参数适当调小即可。
友情提示:上面给出的建议值基本就是最佳实践了。
三、实操
1.安装
1.1 *fasdfs部署*
1.1.1 *软件部署*
# 创建目录
mkdir /server/tools -p
mkdir /home/deploy -p
1.1.1.1 *安装 libfastcommon*
yum -y install cmake bison git ncurses-devel gcc gcc-c++
# 下载
mkdir -p /server/tools
cd /server/tools
wget https://github.com/happyfish100/libfastcommon/archive/V1.0.7.tar.gz
# 解压
tar -zxvf V1.0.7.tar.gz
cd libfastcommon-1.0.7
# 编译安装
./make.sh
./make.sh install
# 创建软连接
ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so
ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so
ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so
1.1.1.2 *安装FastDFS*
# 下载
cd /server/tools
wget https://github.com/happyfish100/fastdfs/archive/V5.05.tar.gz
# 解压
tar -zxvf V5.05.tar.gz
cd fastdfs-5.05
# 编译安装
./make.sh
./make.sh install
# 配置变量:FastDFS 服务脚本设置的 bin 目录是 /usr/local/bin, 但实际命令安装在 /usr/bin/ 下
sed -i 's#/usr/local/bin#/usr/bin#g' /etc/init.d/fdfs_storaged
# vim /etc/init.d/fdfs_storaged
# 使用查找替换命令进统一修改
sed -i 's#/usr/local/bin#/usr/bin#g' /etc/init.d/fdfs_trackerd
# 创建软连接
ln -s /usr/bin/fdfs_trackerd /usr/local/bin
ln -s /usr/bin/fdfs_storaged /usr/local/bin
ln -s /usr/bin/stop.sh /usr/local/bin
ln -s /usr/bin/restart.sh /usr/local/bin
1.1.2 *软件配置*
1.1.2.1 *配置FastDFS跟踪器(Tracker)*
#进入 /etc/fdfs,复制 FastDFS 跟踪器样例配置文件 tracker.conf.sample,并重命名为 tracker.conf
cd /etc/fdfs
cp tracker.conf.sample tracker.conf
# 配置文件是否不生效,false 为生效
# disabled=false
# 提供服务的端口
# port=22122
# Tracker 数据和日志目录地址(根目录必须存在,子目录会自动创建)
sed -i 's#/home/yuqing/fastdfs#/home/fastdfs/tracker#g' tracker.conf
# HTTP 服务端口
sed -i 's#http.server_port=8080#http.server_port=80#g' tracker.conf
# 创建tracker基础数据目录,即base_path对应的目录
mkdir -p /home/fastdfs/tracker
# 启动Tracker
# 初次成功启动,会在 /home/fastdfs/tracker (配置的base_path)下创建 data、logs 两个目录
/etc/init.d/fdfs_trackerd start
# 检查是否启动:22122端口正在被监听,则算是Tracker服务安装成功
netstat -unltp|grep fdfs
# 设置Tracker开机启动
chkconfig fdfs_trackerd on
1.1.2.2 配置 FastDFS 存储 (Storage)
# 进入 /etc/fdfs 目录,复制 FastDFS 存储器样例配置文件 storage.conf.sample,并重命名为 storage.conf
cd /etc/fdfs
cp storage.conf.sample storage.conf
# Storage 数据和日志目录地址(根目录必须存在,子目录会自动生成)
sed -i 's#base_path=/home/yuqing/fastdfs#base_path=/home/fastdfs/storage#g' storage.conf
# Storage 数据和日志目录地址(根目录必须存在,子目录会自动生成)
sed -i 's#store_path0=/home/yuqing/fastdfs#store_path0=/home/fastdfs/file#g' storage.conf
# tracker_server 的列表 ,会主动连接 tracker_server
# 有多个 tracker server 时,每个 tracker server 写一行,本机ip地址
IP_ADDR=$(hostname -I|grep -v '127.0.0.1'|awk '{print $1}')
sed -i "s#192.168.209.121#$IP_ADDR#g" /etc/fdfs/storage.conf
# 访问端口
sed -i 's#http.server_port=8888#http.server_port=80#g' storage.conf
*storage.conf* *配置文件讲解*
*#* *编辑storage.conf: 标红的需要修改,其它的默认即可。*
*# 配置文件是否不生效,false 为生效*
*disabled=false*
*# 指定此 storage server 所在 组(卷)*
*group_name=group1*
*# storage server 服务端口*
*port=23000*
*# 心跳间隔时间,单位为秒 (这里是指主动向 tracker server 发送心跳)*
*heart_beat_interval=30*
*# Storage 数据和日志目录地址(根目录必须存在,子目录会自动生成)*
*base_path=/home/fastdfs/storage*
*# 存放文件时 storage server 支持多个路径。这里配置存放文件的基路径数目,通常只配一个目录。*
*store_path_count=1*
*# 逐一配置 store_path_count 个路径,索引号基于 0。*
*# 如果不配置 store_path0,那它就和 base_path 对应的路径一样。*
*store_path0=/home/fastdfs/file*
*# FastDFS 存储文件时,采用了两级目录。这里配置存放文件的目录个数。*
*# 如果本参数只为 N(如: 256),那么 storage server 在初次运行时,会在 store_path 下自动创建 N * N 个存放文件的子目录。*
*subdir_count_per_path=256*
*# tracker_server 的列表 ,会主动连接 tracker_server*
*# 有多个 tracker server 时,每个 tracker server 写一行**,本机ip地址*
*tracker_server=59.188.82.54:22122** ** **# 允许系统同步的时间段 (默认是全天) 。一般用于避免高峰同步产生一些问题而设定。** **sync_start_time=00:00** **sync_end_time=23:59*
*# 访问端口** **http.server_port=80*
# 创建Storage基础数据目录,对应base_path目录
mkdir -p /home/fastdfs/storage
# 这是配置的store_path0路径
mkdir -p /home/fastdfs/file
mkdir /home/fastdfs/client -p
# 启动 Storage:启动Storage前确保Tracker是启动的。初次启动成功,会在 /ljzsg/fastdfs/storage 目录下创建 data、 logs 两个目录。
# 可以用这种方式启动
/etc/init.d/fdfs_storaged start
# 也可以用这种方式,后面都用这种
service fdfs_storaged restart
查看 Storage 是否成功启动,23000 端口正在被监听,就算 Storage 启动成功。
netstat -unltp|grep fdfs
# 查看Storage和Tracker是否在通信:
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
# 设置 Storage 开机启动
chkconfig fdfs_storaged on
1.1.2.3 *文件上传测试*
# 修改 Tracker 服务器中的客户端配置文件
cd /etc/fdfs
cp client.conf.sample client.conf
#修改如下配置即可,其它默认。
# Client 的数据和日志目录
sed -i 's#/home/yuqing/fastdfs#/home/fastdfs/client#g' client.conf
# Tracker端口,本机ip
IP_ADDR=$(hostname -I|grep -v '127.0.0.1'|awk '{print $1}')
sed -i "s#192.168.0.197#$IP_ADDR#g" client.conf
# 上传测试
# 在linux内部执行如下命令上传 namei.jpeg 图片
#cd /home/fastdfs/file/
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf 图片名
上传成功后返回文件ID号:group1/M00/00/00/wKgz6lnduTeAMdrcAAEoRmXZPp870.jpeg
1.1.2.4 *安装Nginx*
上面将文件上传成功了,但我们无法下载。因此安装Nginx作为服务器以支持Http方式访问文件。同时,后面安装FastDFS的Nginx模块也需要Nginx环境。
Nginx只需要安装到StorageServer所在的服务器即可,用于访问文件。我这里由于是单机,TrackerServer和StorageServer在一台服务器上。
cd /server/tools/
yum -y install gcc gcc-c++ autoconf automake
yum -y install zlib zlib-devel openssl openssl-devel pcre-devel
tar -zxvf nginx-1.14.2.tar.gz #解压nginx代码
cd /server/tools/nginx-1.14.2/
#配置编译
./configure --prefix=/home/deploy/nginx --with-http_stub_status_module --with-http_ssl_module
make
make install
#添加环境变量
echo "#########set for nginx ###########" >>/etc/profile
echo "PATH=$PATH:/home/deploy/nginx/sbin/" >>/etc/profile
source /etc/profile
nginx -V
# 检查
# nginx.conf配置文件
##user www www;
worker_processes 1;
error_log /home/deploy/nginx/logs/error.log error;
pid /home/deploy/nginx/logs/nginx.pid;
worker_rlimit_nofile 65535;
events
{
use epoll;
worker_connections 65535;
}
http
{
include mime.types;
default_type application/octet-stream;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 50m;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
fastcgi_connect_timeout 600;
fastcgi_send_timeout 600;
fastcgi_read_timeout 600;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 256k;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
gzip_disable "MSIE [1-6].";
server_tokens off;
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
include vhost/*.conf;
}
# 创建目录
mkdir -p /home/deploy/nginx/conf/vhost
# fdfs.conf配置文件 ,将 /group1/M00 映射到 /home/fastdfs/file/data
server {
listen 80;
server_name localhost;
access_log /home/deploy/nginx/logs/fdfs.log combined;
# location ~/group([0-9])/M00 {
# ngx_fastdfs_module;
#}
location /group1/M00 {
#alias /home/fastdfs/storage/data;
alias /home/fastdfs/file/data;
}
}
# 重启nginx
/home/deploy/nginx/sbin/nginx -s reload
# 在浏览器访问之前上传的图片、成功。
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf 图片名
172.16.23.63/group1/M00/00/00/rBAIP12FmQmADCI4AALiJdG3JWQ829.jpg
1.1.2.5 *配置 Nginx 模块*
# 下载 fastdfs-nginx-module、解压
cd /server/tools
# 这里这么长一串,是因为最新版的master与当前nginx有些版本问题。
# 解压
yum install -y unzip
unzip 5e5f3566bbfa57418b5506aaefbe107a42c9fcb1.zip
# 重命名
mv fastdfs-nginx-module-5e5f3566bbfa57418b5506aaefbe107a42c9fcb1 fastdfs-nginx-module-master
# 配置Nginx,在nginx中添加模块
# 先停掉nginx服务 /home/deploy/nginx/sbin/nginx -s stop # 进入解压包目录
cd /server/tools/nginx-1.14.2/
# 添加模块
#./configure --add-module=../fastdfs-nginx-module-master/src --prefix=/home/deploy/nginx/
/server/tools/nginx-1.14.2/configure
--prefix=/home/deploy/nginx --error-log-path=/home/deploy/nginx/logs/error.log
--group=www --user=www --with-http_ssl_module --with-http_flv_module
--http-log-path=/home/deploy/nginx/logs/access.log
--http-proxy-temp-path=/var/tmp/nginx/proxy
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi
--with-http_gzip_static_module
--with-http_stub_status_module
--with-http_realip_module
--add-module=../fastdfs-nginx-module-master/src
# 重新编译、安装
make && make install
# 查看Nginx的模块
/home/deploy/nginx/sbin/nginx -V
# 有下面这个就说明添加模块成功
# 复制 fastdfs-nginx-module 源码中的配置文件到/etc/fdfs 目录, 并修改
cd /server/tools/fastdfs-nginx-module-master/src cp mod_fastdfs.conf /etc/fdfs/
# 修改如下配置,其它默认
IP_ADDR=$(hostname -I|grep -v '127.0.0.1'|awk '{print $1}')
sed -i "s#=tracker:22122#=$IP_ADDR:22122#g" /etc/fdfs/mod_fastdfs.conf
sed -i 's#url_have_group_name = false#url_have_group_name = true#g' /etc/fdfs/mod_fastdfs.conf
sed -i 's#/home/yuqing/fastdfs#/home/fastdfs/file#g' /etc/fdfs/mod_fastdfs.conf
*#* *mod_fastdfs.conf**配置文件讲解*
*# Tracker Server*
*tracker_server=59.188.82.54:22122*
*#* *连接超时时间*
*connect_timeout=2** *
*# StorageServer 默认端口*
*storage_server_port=23000*
*# 如果文件ID的uri中包含/group**,则要设置为true*
*url_have_group_name = true*
*# Storage 配置的store_path0路径,必须和storage.conf中的一致*
*store_path0=* */home/fastdfs/storage*
# 复制 FastDFS 的部分配置文件到/etc/fdfs 目录
cd /server/tools/fastdfs-5.05/conf/
cp anti-steal.jpg http.conf mime.types /etc/fdfs/
# 配置nginx,修改fdfs.conf在80端口下添加fastdfs-nginx模块
server {
listen 80;
server_name _;
location ~/group([0-9])/M00 {
alias /home/fastdfs/file/data;
ngx_fastdfs_module;
}
}
# 启动nginx
useradd -s /sbin/nologin www
mkdir -p /var/tmp/nginx/proxy
/home/deploy/nginx/sbin/nginx
打印处如下就算配置成功
http://113.10.152.94/group1/M00/00/00/cQqYXltlLauAa8xBAAAwQWTCx2Q059.png
1.1.2.6 *配置文件*
# 创建目录
mkdir -p /home/deploy/nginx/conf/vhost
# nginx.conf配置文件
worker_processes 1;
#error_log /var/log/nginx/nginx_error.log error;
#pid /home/deploy/nginx/logs/nginx.pid;
worker_rlimit_nofile 65535;
events
{
use epoll;
worker_connections 65535;
}
http
{
include mime.types;
default_type application/octet-stream;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 50m;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
fastcgi_connect_timeout 600;
fastcgi_send_timeout 600;
fastcgi_read_timeout 600;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 256k;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
gzip_disable "MSIE [1-6].";
server_tokens off;
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
include vhost/*.conf;
}
# 配置文件Fdfs
cat /home/deploy/nginx/conf/vhost/fdfs.conf
server {
listen 81;
server_name tfdfs.yygame.cloud;
access_log logs/fdfs.log combined;
rewrite ^(.*)$ https://$server_name$1 permanent;
}
server {
listen 443 ssl;
server_name tfdfs.yygame.cloud;
ssl on;
ssl_certificate /home/deploy/nginx/conf/https/STAR.yygame.cloud.crt;
ssl_certificate_key /home/deploy/nginx/conf/https/STAR.yygame.cloud.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://10.3.81.215:80;
proxy_ignore_headers Expires Cache-Control;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}