fastdfs笔记Word文档下载推荐.docx
- 文档编号:19213494
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:38
- 大小:1.27MB
fastdfs笔记Word文档下载推荐.docx
《fastdfs笔记Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《fastdfs笔记Word文档下载推荐.docx(38页珍藏版)》请在冰豆网上搜索。
跟踪器主要做调度工作,在访问上起负载均衡的作用。
存储节点存储文件,完成文件管理的所有功能:
存储、同步和提供存取接口,FastDFS同时对文件的metadata进行管理。
所谓文件的metadata就是文件的相关属性,以键值对(keyvaluepair)方式表示,如:
width=1024,其中的key为width,value为1024。
文件metadata文件属性列表,可以包含多个键值对。
跟踪器和存储节点都可以由一台或多台服务器构成。
跟踪器和存储节点中的服务器均可以随是时增加或下线而不会影响线上服务。
其中跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。
为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。
存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。
一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。
在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。
当存储空间不足或即将耗尽时,可以动态添加卷。
只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。
FastDFS中的文件标识分为两个部分:
卷名和文件名,二者缺一不可。
FastDFSfileupload
上传文件交互过程:
1.client询问tracker(跟踪器)上传到的storage(存储节点),不需要附加参数;
2.tracker返回一台可用的storage;
3.client直接和storage通讯完成文件上传。
FastDFSfiledownload
下载文件交互过程:
1.client询问tracker下载文件的storage,参数为文件标识(卷名和文件名);
3.client直接和storage通讯完成文件下载。
需要说明的是,client为使用FastDFS服务的调用方,client也应该是一台服务器,它对tracker和storage的调用均为服务器间的调用。
Storageserver
Storageserver(后简称storage,存储节点)以组(卷,group或volume)为单位组织,一个group内包含多台storage机器(意思是多台服务器的storage可以是同一个group),数据互为备份,存储空间以group内容量最小的storage为准,所以建议group内的多个storage尽量配置相同,以免造成存储空间的浪费。
以group为单位组织存储能方便的进行应用隔离、负载均衡、副本数定制(group内storageserver数量即为该group的副本数),比如将不同应用数据存到不同的group就能隔离应用数据,同时还可根据应用的访问特性来将应用分配到不同的group来做负载均衡;
缺点是group的容量受单机存储容量的限制,同时当group内有机器坏掉时,数据恢复只能依赖group内地其他机器,使得恢复时间会很长。
group内每个storage的存储依赖于本地文件系统,storage可配置多个数据存储目录,比如有10块磁盘,分别挂载在/data/disk1-/data/disk10,则可将这10个目录都配置为storage的数据存储目录。
storage接受到写文件请求时,会根据配置好的规则(后面会介绍),选择其中一个存储目录来存储文件。
为了避免单个目录下的文件数太多,在storage第一次启动时,会在每个数据存储目录里创建2级子目录,每级256个,总共65536个文件,新写的文件会以hash的方式被路由到其中某个子目录下,然后将文件数据直接作为一个本地文件存储到该目录中。
Trackerserver
Tracker是FastDFS的协调者,负责管理所有的storageserver和group,每个storage在启动后会连接Tracker,告知自己所属的group等信息,并保持周期性的心跳,tracker根据storage的心跳信息,建立group==>
[storageserverlist]的映射表。
Tracker需要管理的元信息很少,会全部存储在内存中;
另外tracker上的元信息都是由storage汇报的信息生成的,本身不需要持久化任何数据,这样使得tracker非常容易扩展,直接增加tracker机器即可扩展为trackercluster来服务,cluster里每个tracker之间是完全对等的,所有的tracker都接受stroage的心跳信息,生成元数据信息来提供读写服务。
同步机制
1.文件同步只在同组内的storageserver之间进行,采用push方式,即源服务器同步给目标服务器
2.一组内storageserver之间是对等的。
文件上传等操作可以在任一台storage上进行
3.源头数据才需要同步,备份数据部需要再次同步
Uploadfile(上传文件的过程)
FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用。
选择trackerserver(跟踪服务器)
当集群中不止一个trackerserver时,由于tracker之间是完全对等的关系,客户端在upload文件时可以任意选择一个trakcer。
选择存储的group(存储服务器的卷)
当tracker接收到uploadfile的请求时,会为该文件分配一个可以存储该文件的group,支持如下选择group的规则:
1.Roundrobin,所有的group间轮询
2.Specifiedgroup,指定某一个确定的group
3.3.Loadbalance,剩余存储空间多多group优先
选择storageserver(卷下的storage)
当选定group后,tracker会在group内选择一个storageserver给客户端,支持如下选择storage的规则:
1.Roundrobin,在group内的所有storage间轮询
2.Firstserverorderedbyip,按ip排序
3.Firstserverorderedbypriority,按优先级排序(优先级在storage上配置)
选择storagepath
当分配好storageserver后,客户端将向storage发送写文件请求,storage将会为文件分配一个数据存储目录,支持如下规则:
1.Roundrobin,多个存储目录间轮询
2.剩余存储空间最多的优先
生成Fileid
选定存储目录之后,storage会为文件生一个Fileid,由storageserverip、文件创建时间、文件大小、文件crc32和一个随机数拼接而成,然后将这个二进制串进行base64编码,转换为可打印的字符串。
选择两级目录
当选定存储目录之后,storage会为文件分配一个fileid,每个存储目录下有两级256*256的子目录,storage会按文件fileid进行两次hash(猜测),路由到其中一个子目录,然后将文件以fileid为文件名存储到该子目录下。
生成文件名
当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个文件名,文件名由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。
文件同步
写文件时,客户端将文件写至group内一个storageserver即认为写文件成功,storageserver写完文件后,会由后台线程将文件同步至同group内其他的storageserver。
每个storage写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文件名等元信息,这份binlog用于后台同步,storage会记录向group内其他storage同步的进度,以便重启后能接上次的进度继续同步;
进度以时间戳的方式进行记录,所以最好能保证集群内所有server的时钟保持同步。
storage的同步进度会作为元数据的一部分汇报到tracker上,tracke在选择读storage的时候会以同步进度作为参考。
Downloadfile(下载文件的过程)
客户端uploadfile成功后,会拿到一个storage生成的文件名,接下来客户端根据这个文件名即可访问到该文件。
跟uploadfile一样,在downloadfile时客户端可以选择任意trackerserver。
tracker(跟踪服务器)发送download请求给某个tracker,必须带上文件名信息,tracke从文件名中解析出文件的group、大小、创建时间等信息,然后为该请求选择一个storage用来服务读请求。
由于group内的文件同步时在后台异步进行的,所以有可能出现在读到时候,文件还没有同步到某些storageserver上,为了尽量避免访问到这样的storage,tracker按照如下规则选择group内可读的storage。
1.该文件上传到的源头storage-源头storage只要存活着,肯定包含这个文件,源头的地址被编码在文件名中。
2.文件创建时间戳==storage被同步到的时间戳且(当前时间-文件创建时间戳)>
文件同步最大时间(如5分钟)-文件创建后,认为经过最大同步时间后,肯定已经同步到其他storage了。
3.文件创建时间戳<
storage被同步到的时间戳。
-同步时间戳之前的文件确定已经同步了
4.(当前时间-文件创建时间戳)>
同步延迟阀值(如一天)。
-经过同步延迟阈值时间,认为文件肯定已经同步了。
小文件合并存储
将小文件合并存储主要解决如下几个问题:
1.本地文件系统inode数量有限,从而存储的小文件数量也就受到限制。
2.多级目录+目录里很多文件,导致访问文件的开销很大(可能导致很多次IO)
3.按小文件存储,备份与恢复的效率低
FastDFS在V3.0版本里引入小文件合并存储的机制,可将多个小文件存储到一个大的文件(trunkfile),为了支持这个机制,FastDFS生成的文件fileid需要额外增加16个字节
每个trunkfile由一个id唯一标识,trunkfile由group内的trunkserver负责创建(trunkserver是tracker选出来的),并同步到group内其他的storage,文件存储合并存储到trunkfile后,根据其offset(类似指针移动长度)就能从trunkfile读取到文件。
文件在trunkfile内的offset编码到文件名,决定了其在trunkfile内的位置是不能更改的,也就不能通过compact的方式回收trunkfile内删除文件的空间。
但当trunkfile内有文件删除时,其删除的空间是可以被复用的,比如一个100KB的文件被删除,接下来存储一个99KB的文件就可以直接复用这片删除的存储空间。
HTTP访问支持
FastDFS的tracker和storage都内置了http协议的支持,客户端可以通过http协议来下载文件,tracker在接收到请求时,通过http的redirect机制将请求重定向至文件所在的storage上;
除了内置的http协议外,FastDFS还提供了通过apache或nginx扩展模块下载文件的支持。
其他特性
FastDFS提供了设置/获取文件扩展属性的接口(setmeta/getmeta),扩展属性以key-value对的方式存储在storage上的同名文件(拥有特殊的前缀或后缀),比如/group/M00/00/01/some_file为原始文件,则该文件的扩展属性存储在/group/M00/00/01/.some_file.meta文件(真实情况不一定是这样,但机制类似),这样根据文件名就能定位到存储扩展属性的文件。
以上两个接口作者不建议使用,额外的meta文件会进一步“放大”海量小文件存储问题,同时由于meta非常小,其存储空间利用率也不高,比如100bytes的meta文件也需要占用4K(block_size)的存储空间。
FastDFS还提供appenderfile的支持,通过upload_appender_file接口存储,appenderfile允许在创建后,对该文件进行append操作。
实际上,appenderfile与普通文件的存储方式是相同的,不同的是,appenderfile不能被合并存储到trunkfile。
FastDFS用两个AVL平衡二叉树管理blocks:
一个用于管理空闲blocks(V3.05后
采用AVL管理),一个用于检查block是否存在区域重叠,防止意外情况发生。
(防止文件冲突)
和memcached这些分布式系统不同。
Fastdfs的分布式算法是在服务端实现,HappyFish也在不断改良着算法。
最新的是avl树。
不过貌似有整rbtree的趋势。
从HappyFish那里了解到最新消息,FastDFS最新版本已经支持了Nginx和Apache扩展,对于文件下载通过Ngingx或Apache支持,性能会有很大的提升,Fish强烈推荐使用Nginx或Apahce扩展。
FastDFS目前尚存在如下问题(欢迎探讨)。
数据安全性
1.写一份即成功:
从源storage写完文件至同步到组内其他storage的时间窗口内,一旦源storage出现故障,就可能导致用户数据丢失,而数据的丢失对存储系统来说通常是不可接受的。
2.缺乏自动化恢复机制:
当storage的某块磁盘故障时,只能换存磁盘,然后手动恢复数据;
由于按机器备份,似乎也不可能有自动化恢复机制,除非有预先准备好的热备磁盘,缺乏自动化恢复机制会增加系统运维工作。
3.数据恢复效率低:
恢复数据时,只能从group内其他的storage读取,同时由于小文件的访问效率本身较低,按文件恢复的效率也会很低,低的恢复效率也就意味着数据处于不安全状态的时间更长。
4.缺乏多机房容灾支持:
目前要做多机房容灾,只能额外做工具来将数据同步到备份的集群,无自动化机制。
存储空间利用率
1.单机存储的文件数受限于inode(节点)数量
2.每个文件对应一个storage本地文件系统的文件,平均每个文件会存在block_size/2的存储空间浪费。
3.文件合并存储能有效解决上述两个问题,但由于合并存储没有空间回收机制,删除文件的空间不保证一定能复用,也存在空间浪费的问题
负载均衡
1.group机制本身可用来做负载均衡,但这只是一种静态的负载均衡机制,需要预先知道应用的访问特性;
同时group机制也导致不可能在group之间迁移数据来做动态负载均衡。
相对于MogileFS,FastDFS具有如下特点和优势:
fastDFS的函数
upload:
上传普通文件,包括主文件
upload_appender:
上传appender文件
upload_slave:
上传从文件
download:
下载文件
delete:
删除文件
append:
在已有文件后面追加内容
set_metadata:
设置文件附加属性
get_metadata:
获取文件附加属性
FastDFS服务器端运行时目录结构如下:
${base_path}
|__data:
存放数据文件
|__logs:
存放日志文件
其中,${base_path}由配置文件中的参数“base_path”设定。
2.2.1trackerserver结构
trackerserver目录及文件结构:
|__data
|
|__storage_groups.dat:
存储分组信息
|__storage_servers.dat:
存储服务器列表
|__logs
|__trackerd.log:
trackerserver日志文件
数据文件storage_groups.dat和storage_servers.dat中的记录之间以换行符(\n)分隔,字段之间以西文逗号(,)分隔。
storage_groups.dat中的字段依次为:
(1)group_name:
组名
(2)storage_port:
storageserver端口号
storage_servers.dat中记录storageserver相关信息,字段依次为:
所属组名
(2)ip_addr:
ip地址
(3)status:
状态
(4)sync_src_ip_addr:
向该storageserver同步已有数据文件的源服务器
(5)sync_until_timestamp:
同步已有数据文件的截至时间(UNIX时间戳)
(6)stat.total_upload_count:
上传文件次数
(7)stat.success_upload_count:
成功上传文件次数
(8)stat.total_set_meta_count:
更改metadata次数
(9)stat.success_set_meta_count:
成功更改metadata次数
(10)stat.total_delete_count:
删除文件次数
(11)stat.success_delete_count:
成功删除文件次数
(12)stat.total_download_count:
下载文件次数
(13)stat.success_download_count:
成功下载文件次数
(14)stat.total_get_meta_count:
获取metadata次数
(15)stat.success_get_meta_count:
成功获取metadata次数
(16)stat.last_source_update:
最近一次源头更新时间(更新操作来自客户端)
(17)stat.last_sync_update:
最近一次同步更新时间(更新操作来自其他storageserver的同步)
2.2.2storageserver结构
storageserver目录及文件结构:
|__.data_init_flag:
当前storageserver初始化信息
|__storage_stat.dat:
当前storageserver统计信息
|__sync:
存放数据同步相关文件
|__binlog.index:
当前的binlog(更新操作日志)文件索引号
|__binlog.###:
存放更新操作记录(日志)
|__${ip_addr}_${port}.mark:
存放向目标服务器同步的完成情况
|
|__一级目录:
256个存放数据文件的目录,目录名为十六进制字符,如:
00,1F
|__二级目录:
0A,CF
|__storaged.log:
storageserver日志文件
.data_init_flag文件格式为ini配置文件方式,各个参数如下:
#storage_join_time:
本storageserver创建时间;
#sync_old_done:
本storageserver是否已完成同步的标志(源服务器向本服务器同步已有数据);
#sync_src_server:
向本服务器同步已有数据的源服务器IP地址,没有则为空;
#sync_until_timestamp:
同步已有数据文件截至时间(UNIX时间戳);
storage_stat.dat文件格式为ini配置文件方式,各个参数如下:
#total_upload_count:
#success_upload_count:
#total_set_meta_count:
#success_set_meta_count:
#total_delete_count:
#success_delete_count:
#total_download_count:
#success_download_count:
#total_get_meta_count:
#success_get_meta_count:
#last_source_update:
#last_sync_update:
最近一次同步更新时间(更新操作来自其他storageserver)
bi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- fastdfs 笔记