FastDFS 的特性
分组存储,灵活简洁,对等结构,不存在单点。
文件 ID 由 FastDFS 生成,作为文件访问凭证。FastDFS 不需要传统的 name server
和流行的 web server 无缝衔接,FastDFS 已提供 apache 和 nginx 扩展模块。
大,中,小文件均可以很好支持,支持海量小文件存储。
支持多块磁盘,支持单盘数据恢复。
支持相同文件内容只保存一份,节省存储空间。
存储服务器上可以保存文件附加属性
下载文件支持多线程方式,支持断点续传。
只有两个角色,tracker server 和 storage server, 不需要存储文件的索引信息。
所有服务器都是对等的,不存在 master-slave 关系
存储服务器采用分组方式,同组内存储服务器上的文件完全相同。
不同组的 storage server 之间不会相互通信。
由 storage server 主动向 tracker server 报告状态信息,tracker server 之间通常不会相互通信。
FastDFS 上传文件的流程
client 询问 tracker 上传的 storage
tracker 返回一台可用的 storage
client 直接和 storage 通信完成文件上传,storage 返回文件的 ID。
FastDFS 下载文件流程
client 询问 tracker 下载文件的 storage, 参数为文件 ID(组名和文件名)
tracker 返回一台可用的 storage
client 直接和 storage 通信完成文件下载。
FastDFS 同步机制
采用 binlog 文件记录更新操作,根据 binlog 进行文件同步
同一组内的 storage server 之间是对等的,文件上传,删除等操作可以在任意一台 storage server 上进行。
文件同步只在同组内的 storage server 之间进行,采用 push 方式,即源服务器同步给目标服务器。
当新增一台 storage server 时,由已有的一台 storage server 将已有的所有数据(包括源头数据和备份数据)同步给新增服务器。
FastDFS 的核心组件介绍
tracker: 调度器,负责维持集群的消息。
storage server: 以 group 为单位进行组织,任何一个 storage server 都应该属于某个 group,一个 group 应该包含多个 storage server;在同一个 group 内部,各 storage server 的数据互相冗余.
FastDFS 实现分布式存储
分别在 tracker server 和 storage server 的节点上安装如下软件包。
fastdfs-5.0.11-1.el7.centos.x86_64.rpm
fastdfs-debuginfo-5.0.11-1.el7.centos.x86_64.rpm
fastdfs-server-5.0.11-1.el7.centos.x86_64.rpm
fastdfs-tool-5.0.11-1.el7.centos.x86_64.rpm
libfastcommon-1.0.36-1.el7.centos.x86_64.rpm
libfastcommon-devel-1.0.36-1.el7.centos.x86_64.rpm
libfdfsclient-5.0.11-1.el7.centos.x86_64.rpm
libfdfsclient-devel-5.0.11-1.el7.centos.x86_64.rpm
配置 tracker 节点的文件:主要配置内容如下
[root@centos7 ~]#mkdir -p /data/fastdfs/tracker
[root@centos7 ~]# cd /etc/fdfs
- disabled=false(默认为false,表示是否无效)
- port=22122(默认为22122)
- base_path=/data/fastdfs/tracker
- [root@centos7 fdfs]# /etc/init.d/fdfs_trackerd start
- Starting fdfs_trackerd (via systemctl): [ OK ]
- [root@centos7 fastdfs]# ps -ef |grep fdfs
- root 5573 1 0 17:42 ? 00:00:00 /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
配置 storage 节点的文件:配置内容大致如下
[root@centos7 ~]#mkdir -p /data/fastdfs/storage
- disabled=false(默认为false,表示是否无效)
- group_name=group1(定义组)
- port=23000(默认为23000)
- base_path=/data/fastdfs/storage
- tracker_server=172.16.250.97:22122
- store_path0=/data/fastdfs/storage(真正存储数据的路径)
- http.server_port=8888(默认为8888,nginx中配置的监听端口那一致)
- [root@centos7 fdfs]# /etc/init.d/fdfs_storaged start
- Starting fdfs_storaged (via systemctl): [ OK ]
- [root@centos7 fdfs]# ps -ef |grep fdfs
- root 3431 1 0 18:01 ? 00:00:00 /usr/bin/fdfs_storaged /etc/fdfs/storage.conf
配置 tracker 节点的 client.conf 文件
- base_path=/data/fastdfs/tracker
- tracker_server=172.16.250.97:22122
- 查看存储节点状态
- [root@centos7 fdfs]# fdfs_monitor /etc/fdfs/client.conf
- [2017-12-16 20:08:46] DEBUG - base_path=/data/fastdfs/tracker, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0
- server_count=1, server_index=0
- tracker server is 172.16.250.97:22122
- group count: 2
- Group 1:
- group name = group1
- disk total space = 99951 MB
- disk free space = 93419 MB
- trunk free space = 0 MB
- storage server count = 1
- active server count = 1
- storage server port = 23000
- storage HTTP port = 8888
- store path count = 1
- subdir count per path = 256
- current write server index = 0
- current trunk file id = 0
- Storage 1:
- id = 172.16.252.16
- ip_addr = 172.16.252.16 ACTIVE
- http domain =
- version = 5.11
- join time = 2017-12-16 19:25:52
- up time = 2017-12-16 18:01:23
- total storage = 99951 MB
- free storage = 93419 MB
- upload priority = 10
- store_path_count = 1
- subdir_count_per_path = 256
- storage_port = 23000
- storage_http_port = 8888
- current_write_path = 0
- source storage id =
- if_trunk_server = 0
- connection.alloc_count = 256
- connection.current_count = 0
- connection.max_count = 0
- total_upload_count = 0
- success_upload_count = 0
- total_append_count = 0
- success_append_count = 0
- total_modify_count = 0
- success_modify_count = 0
- total_truncate_count = 0
- success_truncate_count = 0
- total_set_meta_count = 0
- success_set_meta_count = 0
- total_delete_count = 0
- success_delete_count = 0
- total_download_count = 0
- success_download_count = 0
- total_get_meta_count = 0
- success_get_meta_count = 0
- total_create_link_count = 0
- success_create_link_count = 0
- total_delete_link_count = 0
- success_delete_link_count = 0
- total_upload_bytes = 0
- success_upload_bytes = 0
- total_append_bytes = 0
- success_append_bytes = 0
- total_modify_bytes = 0
- success_modify_bytes = 0
- stotal_download_bytes = 0
- success_download_bytes = 0
- total_sync_in_bytes = 0
- success_sync_in_bytes = 0
- total_sync_out_bytes = 0
- success_sync_out_bytes = 0
- total_file_open_count = 0
- success_file_open_count = 0
- total_file_read_count = 0
- success_file_read_count = 0
- total_file_write_count = 0
- success_file_write_count = 0
- last_heart_beat_time = 2017-12-16 20:08:37
- last_source_update = 1970-01-01 08:00:00
- last_sync_update = 1970-01-01 08:00:00
- last_synced_timestamp = 1970-01-01 08:00:00
- Group 2:
- group name = group2
- disk total space = 99951 MB
- disk free space = 93027 MB
- trunk free space = 0 MB
- storage server count = 2
- active server count = 2
- storage server port = 2399
- storage HTTP port = 8888
- store path count = 1
- subdir count per path = 256
- current write server index = 0
- current trunk file id = 0
- Storage 1:
- id = 172.16.252.15
- ip_addr = 172.16.252.15 ACTIVE
- http domain =
- version = 5.11
- join time = 2017-12-16 19:31:27
- up time = 2017-12-16 19:31:27
- total storage = 99951 MB
- free storage = 93027 MB
- upload priority = 10
- store_path_count = 1
- subdir_count_per_path = 256
- storage_port = 2399
- storage_http_port = 8888
- current_write_path = 0
- source storage id =
- if_trunk_server = 0
- connection.alloc_count = 256
- connection.current_count = 1
- connection.max_count = 1
- total_upload_count = 0
- success_upload_count = 0
- total_append_count = 0
- success_append_count = 0
- total_modify_count = 0
- success_modify_count = 0
- total_truncate_count = 0
- success_truncate_count = 0
- total_set_meta_count = 0
- success_set_meta_count = 0
- total_delete_count = 0
- success_delete_count = 0
- total_download_count = 0
- success_download_count = 0
- total_get_meta_count = 0
- success_get_meta_count = 0
- total_create_link_count = 0
- success_create_link_count = 0
- total_delete_link_count = 0
- success_delete_link_count = 0
- total_upload_bytes = 0
- success_upload_bytes = 0
- total_append_bytes = 0
- success_append_bytes = 0
- total_modify_bytes = 0
- success_modify_bytes = 0
- stotal_download_bytes = 0
- success_download_bytes = 0
- total_sync_in_bytes = 0
- success_sync_in_bytes = 0
- total_sync_out_bytes = 0
- success_sync_out_bytes = 0
- total_file_open_count = 0
- success_file_open_count = 0
- total_file_read_count = 0
- success_file_read_count = 0
- total_file_write_count = 0
- success_file_write_count = 0
- last_heart_beat_time = 2017-12-16 20:08:32
- last_source_update = 1970-01-01 08:00:00
- last_sync_update = 1970-01-01 08:00:00
- last_synced_timestamp = 1970-01-01 08:00:00
- Storage 2:
- id = 172.16.252.16
- ip_addr = 172.16.252.16 ACTIVE
- http domain =
- version = 5.11
- join time = 2017-12-16 19:25:52
- up time = 2017-12-16 19:35:46
- total storage = 99951 MB
- free storage = 93419 MB
- upload priority = 10
- store_path_count = 1
- subdir_count_per_path = 256
- storage_port = 2399
- storage_http_port = 8888
- current_write_path = 0
- source storage id = 172.16.252.15
- if_trunk_server = 0
- connection.alloc_count = 256
- connection.current_count = 1
- connection.max_count = 1
- total_upload_count = 0
- success_upload_count = 0
- total_append_count = 0
- success_append_count = 0
- total_modify_count = 0
- success_modify_count = 0
- total_truncate_count = 0
- success_truncate_count = 0
- total_set_meta_count = 0
- success_set_meta_count = 0
- total_delete_count = 0
- success_delete_count = 0
- total_download_count = 0
- success_download_count = 0
- total_get_meta_count = 0
- success_get_meta_count = 0
- total_create_link_count = 0
- success_create_link_count = 0
- total_delete_link_count = 0
- success_delete_link_count = 0
- total_upload_bytes = 0
- success_upload_bytes = 0
- total_append_bytes = 0
- success_append_bytes = 0
- total_modify_bytes = 0
- success_modify_bytes = 0
- stotal_download_bytes = 0
- success_download_bytes = 0
- total_sync_in_bytes = 0
- success_sync_in_bytes = 0
- total_sync_out_bytes = 0
- success_sync_out_bytes = 0
- total_file_open_count = 0
- success_file_open_count = 0
- total_file_read_count = 0
- success_file_read_count = 0
- total_file_write_count = 0
- success_file_write_count = 0
- last_heart_beat_time = 2017-12-16 20:08:37
- last_source_update = 1970-01-01 08:00:00
- last_sync_update = 1970-01-01 08:00:00
- last_synced_timestamp = 1970-01-01 08:00:00
上传文件
- [root@centos7 ~]# fdfs_upload_file /etc/fdfs/client.conf all.sh
- group1/M00/00/00/rBD8EFo1EKGAXX8nAAAANoKhiHA5839.sh
查看文件
- [root@centos7 fdfs]# fdfs_file_info /etc/fdfs/client.conf group1/M00/00/00/rBD8EFo1EKGAXX8nAAAANoKhiHA5839.sh
- source storage id: 0
- source ip address: 172.16.252.16
- file create timestamp: 2017-12-16 20:25:05
- file size: 54
- file crc32: 2191624304 (0x82A18870)
文件下载
- [root@centos7 fdfs]# fdfs_download_file / etc / fdfs / client.conf group1 / M00 / 00 / 00 / rBD8EFo1EKGAXX8nAAAANoKhiHA5839.sh
原文:http://blog.51cto.com/13017865/2051376
来源: http://www.bubuko.com/infodetail-2431065.html