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被同步到的时间戳且(当前时间-文件创建时间戳) &gt文件同步最大时间(如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

 

posted on 2024-12-26 13:17  luokeli  阅读(52)  评论(0)    收藏  举报

导航