FASTDFS,开源轻量级分布式文件系统
- 开源轻量级分布式文件系统
- 大量数据存储及负载均衡
- 不对文件进行分块存储
- 适合4KB-500M范围内的小文件
集群架构
- 架构图
- 架构角色说明
- tracker server ,调度服务,做均衡,记录存储组及存储服务状态信息,数据交互的纽带
- storage server,存储服务器,维护文件元数据及文件数据,利用OS文件系统调用管理文件
- client,业务请求发起,基于TCP/IP协议与tracker server及 storage server进行数据交互
集群安装,参考https://github.com/happyfish100/fastdfs/blob/master/INSTALL
- libfastcommon 公共依赖模块安装
- 下载源码 https://github.com/happyfish100/libfastcommon
- ./make.sh
- ./make.sh install
- 下载源码 https://github.com/happyfish100/libfastcommon
- fastdfs 安装
- 下载源码 https://github.com/happyfish100/fastdfs.git
- tar -zxf fastdfs-5.09.tar.gz
- ./make.sh
- ./make.sh install
- 修改配置文件
- storage.conf
port=23000 store_path0=/data/fastdfs tracker_server=192.168.113.129:22122 http.server_port=8888
- tracker.conf
port=22122
- client.conf
tracker_server=192.168.113.129:22122
- 启动
- tracker ./fdfs_trackerd ../conf/tracker.conf start
- stroage ./fdfs_storaged /app/fastdfs-5.09/conf/storage.conf start
- 测试
- ./fdfs_test /app/fastdfs-5.09/conf/client.conf upload image/a, 返回结果如下:
tracker_query_storage_store_list_without_group: server 1. group_name=, ip_addr=192.168.113.129, port=23000 group_name=group1, ip_addr=192.168.113.129, port=23000 storage_upload_by_filename group_name=group1, remote_filename=M00/00/00/wKhxgVjRDqWAAeRsAAUkO3TI18Q4484168 source ip address: 192.168.113.129 file timestamp=2017-03-21 07:29:41 file size=336955 file crc32=1959319492 example file url: http://192.168.113.129/group1/M00/00/00/wKhxgVjRDqWAAeRsAAUkO3TI18Q4484168 storage_upload_slave_by_filename group_name=group1, remote_filename=M00/00/00/wKhxgVjRDqWAAeRsAAUkO3TI18Q4484168_big source ip address: 192.168.113.129 file timestamp=2017-03-21 07:29:41 file size=336955 file crc32=1959319492 example file url: http://192.168.113.129/group1/M00/00/00/wKhxgVjRDqWAAeRsAAUkO3TI18Q4484168_big
- 答疑
- 文件定位
- 文件id,Storage server生成,组名+相对路径+文件名,不需要存储文件索引信息
- 分组存储
- 集群由一个或者多个组构成
- 同组内多台Storage Server之间互备,同组存储服务器上的文件完全一致,组的存储容量为该组内存储服务器容量最小的
- 纵向扩容,组内增加服务器[缓解压力],增加组[扩充存储能力]
- 对等架构
- Tracker Server之间对等
- 组内Storage Server之间对等
- 实现细节
- Client 和 Storage Server主动连接 Tracker Server
- Storage Server 主动向Tracker Server报告状态信息,一个线程对应一个Tracker Server,一个组内的Storage Server是通过Tracker Server获取的
- Storage Server 采用binlong 文件记录文件操作,只记录文件名
- 组内文件同步以PUSTH方式进行,一般由源头发起,组内新成员由一台Storage Server全量复制
- 文件同步采用增量同步方式,对组内除自己外的每台服务器启动一个线程同步文件
- 同步延迟
- 组内多个Storage Server必然存在同步延迟
- 更新操作
- 优先选择源 Storage Server,避免延迟及可能的时序错乱
- 下载操作
- 优先选择源Storage Server下载
- Tracker Server选择 Storage Server
- 源服务器
- 文件创建时间戳< Storage Server被同步到的文件时间戳
- 文件创建时间戳=Storage Server 被同步到的文件时间戳&&[当前时间-文件创建时间]>一个文件同步完成需要的最大时间
- [当前时间-文件创建时间戳]>文件同步阀值
- 同步标识
- Tracker Server需要知道组内文件文件的同步情况,以便并发操作
- Storage Server向Tracker Server向组内其它Storage Server同步到的文件时间戳
- Tracker Server依次找出组内Storage Servr被同步到的最小文件时间戳
- 作为Storage Server的属性记录
- 文件定位
- Java Client调用
- 源码下载编译,https://github.com/happyfish100/fastdfs-client-java.git
- 文件下载示例,需要将client配置文件拿到客户端,此外可硬编码实现.
public class App {
public static void main(String[] args) throws FileNotFoundException, IOException, MyException {
ClientGlobal.init("F:\\work_d\\fastdfs_test\\src\\main\\java\\client.conf");
TrackerClient tc = new TrackerClient();
try {
TrackerServer ts = tc.getConnection();
StorageClient sc = new StorageClient(ts, tc.getStoreStorage(ts));
byte[] image = sc.download_file("group1", "M00/00/00/wKhxgVjRDqWAAeRsAAUkO3TI18Q4484168");
System.out.println(image.length);
} catch (Exception e) {
e.printStackTrace();
}
}
}
未完待续.......