分布式存储系统FastDFS.docx
《分布式存储系统FastDFS.docx》由会员分享,可在线阅读,更多相关《分布式存储系统FastDFS.docx(16页珍藏版)》请在冰豆网上搜索。
分布式存储系统FastDFS
分布式存储系统FastDFS
1.FastDFS原理
1.1功能简介
FastDFS是一个开源的轻量级分布式文件系统,她对文件进行管理,功能包括:
文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。
特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
1.2适用的业务场景
1.存储后不做改动;
2.视频或其他文件的断点存取;
3.存储文件的关系度不复杂(如果跟统计项目类似存储文件间关系复杂则不适用);
4.存储总量预计在500Tb范围内的应用。
1.3系统基本结构特征
1.2.1轻量级
FastDFS服务端只有两个角色:
跟踪器(tracker)和存储节点(storage)。
跟踪器主要做调度工作,在访问上起负载均衡的作用。
存储节点存储文件,完成文件管理的所有功能:
存储、同步和提供存取接口,FastDFS同时对文件的metadata进行管理。
所谓文件的metadata就是文件的相关属性,以键值对(keyvaluepair)方式表示,如:
width=1024,其中的key为width,value为1024。
文件metadata是文件属性列表,可以包含多个键值对。
1.2.2分组方式
为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。
存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。
一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。
在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。
当存储空间不足或即将耗尽时,可以动态添加卷。
只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。
FastDFS中的文件标识分为两个部分:
卷名和文件名,二者缺一不可。
1.2.3对等结构
跟踪器和存储节点都可以由一台或多台服务器构成。
跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务。
其中跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。
1.4FastDFS上传文件
上传文件交互过程:
(1)client询问tracker上传到的storage,不需要附加参数;
(2)tracker返回一台可用的storage;
(3)client直接和storage通讯完成文件上传。
1.5FastDFS下载文件
下载文件交互过程:
(1)client询问tracker下载文件的storage,参数为文件标识(卷名和文件名);
(2)tracker返回一台可用的storage;
(3)client直接和storage通讯完成文件下载。
1.6Http方式下载文件
1.5.1方式一tracker跳转
1.5.2方式二非tracker跳转
(1)redirect
(2)proxy
1.7FastDFS文件名策略
FastDFS中的文件名是在向StorageServer存储文件时由系统指定的,文件名中包含了VolumeID和FileID。
也就是说,当客户要读取某个文件时,通过在客户端对文件名进行解析,就可以知道该文件存储在哪个Volume上和它在StorageServer中的FileID。
但是此时用户还不能读取文件,因为他不知道Volume内各个StorageServer的ip地址,也不知道应该从Volume内的哪个StorageServer中读取。
所以用户需手持欲访问的文件的VolumeID向TrackerServer询问,TrackerServe会均衡当前各StorageServer的IO负载状况,返回一个最佳的StorageServer的ip地址。
最后用户与该StorageServer连接,出示欲访问文件的FileID,StorageServer上会维持一个FileID对应偏移量的表,从而得到欲访问文件的偏移量。
文件名包含:
源头storageIP地址和文件创建时间戳、文件大小、随机数、文件拓展名
FastDFS的文件名策略将文件存储位置信息隐含在文件名中,从而减少了元数据量,达到了优化小文件存储性能的作用。
1.8FastDFS同步机制
在FastDFS的服务器端配置文件中,bind_addr这个参数用于需要绑定本机IP地址的场合。
只有这个参数和主机特征相关,其余参数都是可以统一配置的。
在不需要绑定本机的情况下,为了便于管理和维护,建议所有trackerserver的配置文件相同,同组内的所有storageserver的配置文件相同。
trackerserver的配置文件中没有出现storageserver,而storageserver的配置文件中会列举出所有的trackerserver。
这就决定了storageserver和trackerserver之间的连接由storageserver主动发起,storageserver为每个trackerserver启动一个线程进行连接和通讯。
trackerserver会在内存中保存storage分组及各个组下的storageserver,并将连接过自己的storageserver及其分组保存到文件中,以便下次重启服务时能直接从本地磁盘中获得storage相关信息。
storageserver会在内存中记录本组的所有服务器,并将服务器信息记录到文件中。
trackerserver和storageserver之间相互同步storageserver列表:
1.如果一个组内增加了新的storageserver或者storageserver的状态发生了改变,trackerserver都会将storageserver列表同步给该组内的所有storageserver。
以新增storageserver为例,因为新加入的storageserver主动连接trackerserver,trackerserver发现有新的storageserver加入,就会将该组内所有的storageserver返回给新加入的storageserver,并重新将该组的storageserver列表返回给该组内的其他storageserver;
2.如果新增加一台trackerserver,storageserver连接该trackerserver,发现该trackerserver返回的本组storageserver列表比本机记录的要少,就会将该trackerserver上没有的storageserver同步给该trackerserver。
同一组内的storageserver之间是对等的,文件上传、删除等操作可以在任意一台storageserver上进行。
文件同步只在同组内的storageserver之间进行,采用push方式,即源服务器同步给目标服务器。
以文件上传为例,假设一个组内有3台storageserverA、B和C,文件F上传到服务器B,由B将文件F同步到其余的两台服务器A和C。
我们不妨把文件F上传到服务器B的操作为源头操作,在服务器B上的F文件为源头数据;文件F被同步到服务器A和C的操作为备份操作,在A和C上的F文件为备份数据。
同步规则总结如下:
1.只在本组内的storageserver之间进行同步;
2.源头数据才需要同步,备份数据不需要再次同步,否则就构成环路了;
3.上述第二条规则有个例外,就是新增加一台storageserver时,由已有的一台storageserver将已有的所有数据(包括源头数据和备份数据)同步给该新增服务器。
storageserver有7个状态,如下:
#FDFS_STORAGE_STATUS_INIT :
初始化,尚未得到同步已有数据的源服务器
#FDFS_STORAGE_STATUS_WAIT_SYNC:
等待同步,已得到同步已有数据的源服务器
#FDFS_STORAGE_STATUS_SYNCING :
同步中
#FDFS_STORAGE_STATUS_DELETED :
已删除,该服务器从本组中摘除(注:
本状态的功能尚未实现)
#FDFS_STORAGE_STATUS_OFFLINE :
离线
#FDFS_STORAGE_STATUS_ONLINE :
在线,尚不能提供服务
#FDFS_STORAGE_STATUS_ACTIVE :
在线,可以提供服务
当storageserver的状态为FDFS_STORAGE_STATUS_ONLINE时,当该storageserver向trackerserver发起一次heartbeat时,trackerserver将其状态更改为FDFS_STORAGE_STATUS_ACTIVE。
组内新增加一台storageserverA时,由系统自动完成已有数据同步,处理逻辑如下:
1.storageserverA连接trackerserver,trackerserver将storageserverA的状态设置为FDFS_STORAGE_STATUS_INIT。
storageserverA询问追加同步的源服务器和追加同步截至时间点,如果该组内只有storageserverA或该组内已成功上传的文件数为0,则没有数据需要同步,storageserverA就可以提供在线服务,此时tracker将其状态设置为FDFS_STORAGE_STATUS_ONLINE,否则trackerserver将其状态设置为FDFS_STORAGE_STATUS_WAIT_SYNC,进入第二步的处理;
2.假设trackerserver分配向storageserverA同步已有数据的源storageserver为B。
同组的storageserver和trackerserver通讯得知新增了storageserverA,将启动同步线程,并向trackerserver询问向storageserverA追加同步的源服务器和截至时间点。
storageserverB将把截至时间点之前的所有数据同步给storageserverA;而其余的storageserver从截至时间点之后进行正常同步,只把源头数据同步给storageserverA。
到了截至时间点之后,storageserverB对storageserverA的同步将由追加同步切换为正常同步,只同步源头数据;
3.storageserverB向storageserverA同步完所有数据,暂时没有数据要同步时,storageserverB请求trackerserver将storageserverA的状态设置为FDFS_STORAGE_STATUS_ONLINE;
4当storageserverA向trackerserver发起heartbeat时,trackerserver将其状态更改为FDFS_STORAGE_STATUS_ACTIVE。
2.FastDFS优缺点
2.1优点
•分组存储,灵活简洁
•对等结构,不存在单点
•文件ID由FastDFS生成,作为文件访问凭证。
FastDFS不需要传统的nameserver
•和流行的webs