FASTDFS 分布式文件系统 入门

FASTDFS,开源轻量级分布式文件系统

  • 开源轻量级分布式文件系统
  • 大量数据存储及负载均衡
  • 不对文件进行分块存储
  • 适合4KB-500M范围内的小文件

集群架构

  • 架构图

FASTDFS 分布式文件系统 入门_第1张图片

  • 架构角色说明
    • tracker server ,调度服务,做均衡,记录存储组及存储服务状态信息,数据交互的纽带
    • storage server,存储服务器,维护文件元数据及文件数据,利用OS文件系统调用管理文件
    • client,业务请求发起,基于TCP/IP协议与tracker server及 storage server进行数据交互

集群安装,参考https://github.com/happyfish100/fastdfs/blob/master/INSTALL 

  1. libfastcommon 公共依赖模块安装
    • 下载源码 https://github.com/happyfish100/libfastcommon
    • ./make.sh
    • ./make.sh install
  2. fastdfs 安装
    • 下载源码 https://github.com/happyfish100/fastdfs.git
    • tar -zxf fastdfs-5.09.tar.gz
    • ./make.sh
    • ./make.sh install
  3. 修改配置文件
    • 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
  4. 启动
    • tracker   ./fdfs_trackerd   ../conf/tracker.conf  start
    • stroage  ./fdfs_storaged  /app/fastdfs-5.09/conf/storage.conf  start
  5. 测试
    • ./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
      


  6. 答疑
    • 文件定位
      • 文件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的属性记录
  7. 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();
		}
	}
}

未完待续.......



你可能感兴趣的:(FastDFS)