FastDFS 存储
# FastDFS简介
FastDFS 是以 C 语言开发的一项开源轻量级分布式文件系统,他对文件进行管理 主要功能有:文件存储,文件同步,文件访问(文件上载)特别适合以文件为载体的在线服务,如:图片网站,视频网站等 FastDFS 是阿里余庆大神做的一个个人项目,从2008年研发FastDFS开源至今 GitHub开源地址:https://github.com/happyfish100/fastdfs # 存储访问方式 支持与不支持FUSE(文件系统在用户空间) 支持FUSE用户就可以挂载(性能有损失,因为内核态和用户态的多次切换) GlustFS 都支持 不支持FUSE 用户只能通过API进行通讯(原生API性能好)FastDFS 分片与不分片存放: 不分片:FastDFS GlustFS 分片:HDFS # FastDFS角色:跟踪服务和存储服务 跟踪服务Tracker控制,调度文件以负载均衡的方式访问 存储服务Storage包括:文件存储,文件同步,提供文件访问接口,同时以key value的方式管理文件的元数据 组合形式:跟踪和存储服务可以由1台或者多台服务器组成,同时可以动态的添加,删除跟踪和存储服务而不会对在线的服务产生影响,在集群中,tracker服务是对等的 # FastDFS上传流程与机制 内部机制如下: 1、选择tracker server 当集群中不止一个tracker server时,由于tracker之间是完全对等的关系,客户端在upload文件时可以任意选择一个trakcer(当然前面用nginx反代最好),选择存储的group 当tracker接收到upload file的请求时,会为该文件分配一个可以存储该文件的group 选择group的规则: 1、Round robin,所有的group间轮询 2、Specified group,指定某一个确定的group 3、Load balance,剩余存储空间多多group优先 (建议) 2、选择storage server 当选定group后,tracker会在group内选择一个storage server给客户端 选择storage的规则: 1、Round robin,在group内的所有storage间轮询 2、First server ordered by ip,按ip排序 3、First server ordered by priority,按优先级排序(优先级在storage上配置) 3、选择storage path 当分配好storage server后,客户端将向storage发送写文件请求,storage将会为文件分配一个数据存储目录 选择存储目录规则: 1、Round robin,多个存储目录间轮询 2、剩余存储空间最多的优先 4、生成Fileid 选定存储目录之后,storage会为文件生一个Fileid,由storage server ip、文件创建时间、文件大小、文件crc32和一个随机数拼接而成,然后将这个二进制串进行base64编码,转换为可打印的字符串。 选择两级目录 当选定存储目录之后,storage会为文件分配一个fileid,每个存储目录下有两级256*256的子目录,storage会按文件fileid进行两次hash(猜测),路由到其中一个子目录,然后将文件以fileid为文件名存储到该子目录下 5、生成文件名 当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个文件名,文件名由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成 # FastDFS下载流程与机制 跟upload file一样,在download file时客户端可以选择任意tracker server。tracker发送download请求给某个tracker,必须带上文件名信息,tracke从文件名中解析出文件的group、大小、创建时间等信息,然后为该请求选择一个storage用来服务读请求。由于group内的文件同步时在后台异步进行的,所以有可能出现在读到时候,文件还没有同步到某些storage server上,为了尽量避免访问到这样的storage,tracker会有一定规则 tracker选择group内可读的storage规则 1、该文件上传到的源头storage 源头storage只要存活着,肯定包含这个文件,源头的地址被编码在文件名中 2、文件创建时间戳 storage被同步到的时间戳且(当前时间-文件创建时间戳) >文件同步最大时间(如5分钟) :文件创建后,认为经过最大同步时间后,肯定已经同步到其他storage了。 3、文件创建时间戳 4、(当前时间-文件创建时间戳) > 同步延迟阀值(如一天)。 - 经过同步延迟阈值时间,认为文件肯定已经同步了
部署
# 部署环境 docker-ce docker-compose ip 192.168.0.200 # FastDFS 配置文件 storage.conf mkdir -p /data/fastdfs/conf cat >/data/fastdfs/conf/storage.conf<<EOF group_name=group1 bind_addr= client_bind=true port=23000 connect_timeout=30 network_timeout=60 heart_beat_interval=30 stat_report_interval=60 base_path=/fastdfs/storage max_connections=256 buff_size = 256KB accept_threads=1 work_threads=4 disk_rw_separated = true disk_reader_threads = 1 disk_writer_threads = 1 sync_wait_msec=50 sync_interval=0 sync_start_time=00:00 sync_end_time=23:59 write_mark_file_freq=500 store_path_count=1 store_path0=/fastdfs/store_path0 subdir_count_per_path=256 tracker_server=192.168.0.200:22122 log_level=info run_by_group= run_by_user= allow_hosts=* file_distribute_path_mode=0 file_distribute_rotate_count=100 fsync_after_written_bytes=0 sync_log_buff_interval=10 sync_binlog_buff_interval=10 sync_stat_file_interval=300 thread_stack_size=512KB upload_priority=10 if_alias_prefix= check_file_duplicate=0 file_signature_method=hash key_namespace=FastDFS keep_alive=0 use_access_log = false rotate_access_log = false access_log_rotate_time=00:00 rotate_error_log = false error_log_rotate_time=00:00 rotate_access_log_size = 0 rotate_error_log_size = 0 file_sync_skip_invalid_record=false use_connection_pool = false connection_pool_max_idle_time = 3600 http.domain_name= tracker_server=192.168.110.106:22122 http.server_port=8888 EOF # 编辑 nginx.conf文件 cat worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 8088; server_name localhost; location /group1/M00 { root /fastdfs/storage/data; ngx_fastdfs_module; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } } # 服务数据存储目录 /data/fastdfs/data/storage_base_path 对应 /fastdfs/storage/data # 文件存储目录 /data/fastdfs/data/store_path0 对应 /fastdfs/store_path0 (第一个文件存储目录path0 第二个问价存储path1 ) # 编辑docker-compose文件 cat docker-compose-fastdfs.yml version: '3.3' services: tracker: image: season/fastdfs:1.2 container_name: tracker network_mode: host restart: always ports: - "22122:22122" command: "tracker" storage: image: season/fastdfs:1.2 container_name: storage network_mode: host restart: always volumes: - "/data/fastdfs/conf/storage.conf:/fdfs_conf/storage.conf" - "/data/fastdfs/data/storage_base_path:/fastdfs/storage/data" - "/data/fastdfs/data/store_path0:/fastdfs/store_path0" environment: TRACKER_SERVER: "192.168.110.106:22122" command: "storage" nginx: image: season/fastdfs:1.2 container_name: fdfs-nginx restart: always network_mode: host volumes: - "/data/fastdfs/conf/nginx.conf:/etc/nginx/conf/nginx.conf" - "/data/fastdfs/data/storage_base_path:/fastdfs/storage/data" - "/data/fastdfs/data/store_path0:/fastdfs/store_path0" environment: TRACKER_SERVER: "192.168.0.200:22122" command: "nginx" # 启动3个容器 docker-compose -f docker-compose-fastdfs.yml up -d
本文来自博客园,站在巨人的肩膀上,坚持开源精神,遵循开源协议:Apache Licene 2.0协议。
浙公网安备 33010602011771号