01-简介
 
   GitHub:happyfish100 (YuQing) · GitHub 
  
 
   
   
   FastDFS高性能的分布式文件系统,主要功能包含文件的存储、同步、访问(上传和下载),特别适用于以文件为主体的网络站点(图片分享和视频分享)。 
  
 
   
   FastDFS包含两个角色: 
  
 
  -  
    Tracker(追踪器 调度服务器):调度和文件访问的负载均衡
-  
    Storage(存储器 存储服务器):文件的管理(存储、同步、访问接口)和文件的元数据支持水平扩展,不会对在线服务造成任何影响
 
   存储服务器通过卷/组组织管理,不同的卷管理不同的文件,一个卷管理一台或者多台存储服务器,并且这些存储服务器之间互相备份。 
  
 
   
   存储容量=所有卷容量之和 
  
 
   
   文件在集群中标示=卷名+文件名 
  
 
   
   
   结构图: 
  
 
   
 
  
 
 
  
02-环境搭建(单机)
 
   在安装fastdfs之前,准备环境 
  
 
   
    yum -y install zlib zlib-devel pcre pcre-devel gcc gcc-c++ openssl openssl-devel libevent libevent-devel perl unzip net-tools wget 
   
 
   
   开始安装 
  
 
   
    #1.下载安装包,可根据自己所需要的的版本下载(官网可供选择),先安装libfastcommon再安装fastdfs 
   
 
    
      #libfastcommon下载地址 
   
 
    
    https://github.com/happyfish100/libfastcommon 
   
 
    
     #fastdfs下载地址 
   
 
    
    https://github.com/happyfish100/fastdfs 
   
 
    
    
    #2.上传并解压libfastcommon压缩包 
   
 
    
    unzip libfastcommon.zip 
   
 
    
    
    #3.进入解压好的文件目录,查看是否有make.sh文件,然后并执行该文件进行安装 
   
 
    
    cd libfastcommon/ 
   
 
    
    ./make.sh && ./make.sh install 
   
 
    
    
    #4.上传并解压fastdfs压缩包 
   
 
    
    unzip fastdfs.zip 
   
 
    
    
    #5.进入解压好的文件目录,查看是否有make.sh文件,然后并执行该文件进行安装 
   
 
    
    cd fastdfs/ 
   
 
    
    ./make.sh && ./make.sh install 
   
 
    
    
    #6.安装完成之后,查看/usr/bin目录下是否有fdfs开头的文件,这些执行文件在这个目录下的好处就是不用配置环境变量 
   
 
    
    find /usr/bin/ -name 'fdfs*' 
   
 
    
    例如: 
   
 
    
        /usr/bin/fdfs_upload_appender 
   
 
    
        /usr/bin/fdfs_append_file 
   
 
    
        /usr/bin/fdfs_appender_test1 
   
 
    
        /usr/bin/fdfs_download_file 
   
 
    
        /usr/bin/fdfs_test 
   
 
    
        /usr/bin/fdfs_delete_file 
   
 
    
        /usr/bin/fdfs_test1 
   
 
    
        /usr/bin/fdfs_crc32 
   
 
    
        /usr/bin/fdfs_upload_file 
   
 
    
        /usr/bin/fdfs_storaged 
   
 
    
        /usr/bin/fdfs_trackerd 
   
 
    
        /usr/bin/fdfs_appender_test 
   
 
    
        /usr/bin/fdfs_file_info 
   
 
    
        /usr/bin/fdfs_monitor 
   
 
    
    
    #7.修改配置文件,进入/etc/fdfs目录下,然后将以下三个文件进行重命名,如果名字已经.conf结尾,就不用修改名字,可以跳过这一步 
   
 
    
    cd /etc/fdfs 
   
 
    
    client.conf.sample  storage.conf.sample  tracker.conf.sample 
   
 
    
    
    mv client.conf.sample client.conf 
   
 
    
    mv storage.conf.sample storage.conf 
   
 
    
    mv tracker.conf.sample  tracker.conf 
   
 
    
    
    #8.修改配置文件 
   
 
    
        #修改tracker.conf配置文件 
   
 
    
    base_path=/data/tracker    #数据存储位置,填写自己的路径(可以自己创建一个新目录) 
   
 
    
    
      #修改storage.conf配置文件 
   
 
    
    base_path=/data/storage    #数据存储位置,填写自己的路径(可以自己创建一个新目录) 
   
 
    
    store_path0=/data/storage    #根据数据存储位置一样就行 
   
 
    
    tracker_server=192.168.209.121:22122    #指定tracker服务地址和端口 
   
 
    
    
    #9.启动服务,以下启动命令可以在任意目录执行 
   
 
    
    fdfs_trackerd /etc/fdfs/tracker.conf start    #启动tracker 
   
 
    
    fdfs_storaged /etc/fdfs/storage.conf start    #启动storage 
   
 
    
    
    #10.测试 
   
 
    
        #修改client.conf配置文件 
   
 
    
    base_path=/storage   #存储位置,存放位置自己可以创建一个新目录 
   
 
    
    tracker_server=192.168.0.197:22122    #指定tracker服务地址和端口 
   
 
    
    
        #上传文件 
   
 
    
    fdfs_upload_file /etc/fdfs/client.conf /root/1.png 
   
 
    
        #下载文件 
   
 
    
    fdfs_download_file /etc/fdfs/client.conf  上传的文件名   下载目录 
   
 
    
   
 
  
 
 
  
03-java集成Fastdfs
 
       1.添加依赖,我们可以在maven厂库去寻找,也可以在Fastdfs的作者github找到 fastdfs-client-java项目,下载到自己本地然后打包 
  
 
   
   
    <dependency> 
   
 
    
        <groupId>com.github.tobato</groupId> 
   
 
    
        <artifactId>fastdfs-client</artifactId> 
   
 
    
        <version>1.27.2</version> 
   
 
    
    </dependency> 
   
 
   
   注意:如果在maven远程厂库下载的依赖报版本冲突错误,需要自己手动下载项目打包 
  
 
   
   
       2.配置 
  
 
   
    fdfs.so-timeout=1501 
   
 
    
    fdfs.connect-timeout=601 
   
 
    
    fdfs.tracker-list=101.42.151.107:22122 
   
 
   
       3.测试 
  
 
   
    @SpringBootTest(classes = FastdfsApplication.class) 
   
 
    
    @RunWith(SpringRunner.class) 
   
 
    
    public class Test { 
   
 
    
        @Autowired 
   
 
    
        private FastFileStorageClient fastFileStorageClient; 
   
 
    
    
    
        /** 
   
 
    
         *@Description: 下载 
   
 
    
         *@Date: 2022/8/23 20:27 
   
 
    
         **/ 
   
 
    
        @org.junit.Test 
   
 
    
        public void test1() throws IOException { 
   
 
    
            byte[] group1s = fastFileStorageClient.downloadFile("group1", "M00/00/00/CgAQBGMDiZWAZSSPAAAKYireMTk031.gif", new DownloadByteArray()); 
   
 
    
            FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\86041\\Desktop\\f\\fastdfs\\fastdfs_springboot\\src\\main\\resources\\1.gif"); 
   
 
    
            fileOutputStream.write(group1s); 
   
 
    
        } 
   
 
    
        /** 
   
 
    
         *@Description: 上传 
   
 
    
         *@Date: 2022/8/23 20:29 
   
 
    
         **/ 
   
 
    
        @org.junit.Test 
   
 
    
        public void test2() throws FileNotFoundException { 
   
 
    
            File file = new File("F:\\picture\\donde\\geju.jpg"); 
   
 
    
            FileInputStream fileInputStream = new FileInputStream(file); 
   
 
    
            StorePath jpg = fastFileStorageClient.uploadFile(fileInputStream, file.length(), "jpg", null); 
   
 
    
            System.out.println(jpg.getGroup());//组名 
   
 
    
            System.out.println(jpg.getPath());//存放位置 
   
 
    
        } 
   
 
    
    
    
    } 
   
 
  04-FastDFs集成Nginx
 
    #1.上传nginx和fastdfs-nginx-module,fastdfs-nginx-module下载地址 
   
 
    
    https://github.com/happyfish100/fastdfs-nginx-module 
   
 
    
    
    #2.解压并修改fastdfs-nginx-module的配置文件 
   
 
    
    unzip fastdfs-nginx-module.zip 
   
 
    
    
    vi /usr/fastdfs-nginx-module/src/config 
   
 
    
        #修改如下 
   
 
    
    if test -n "${ngx_module_link}"; then 
   
 
    
        ngx_module_type=HTTP 
   
 
    
        ngx_module_name=$ngx_addon_name 
   
 
    
        ngx_module_incs="/usr/include/fastdfs /usr/include/fastcommon/" 
   
 
    
        ngx_module_libs="-lfastcommon -lfdfsclient" 
   
 
    
        ngx_module_srcs="$ngx_addon_dir/ngx_http_fastdfs_module.c" 
   
 
    
        ngx_module_deps= 
   
 
    
        CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='256*1024' -DFDFS_MOD_CONF_FILENAME='\"/etc/fdfs/mod_fastdfs.conf\"'" 
   
 
    
        . auto/module 
   
 
    
    else 
   
 
    
        HTTP_MODULES="$HTTP_MODULES ngx_http_fastdfs_module" 
   
 
    
        NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_fastdfs_module.c" 
   
 
    
        CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/" 
   
 
    
        CORE_LIBS="$CORE_LIBS -lfastcommon -lfdfsclient" 
   
 
    
        CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='256*1024' -DFDFS_MOD_CONF_FILENAME='\"/etc/fdfs/mod_fastdfs.conf\"'" 
   
 
    
    
    
    #3.进入nginx解压好的目录,并执行configure连同fastdfs-nginx-module 
   
 
    
    cd /usr/nginx-1.11.1/ 
   
 
    
    ./configure --add-module=/usr/fastdfs-nginx-module/src/ --prefix=/usr/nginx     
   
 
    
    #指定自己fastdfs-nginx-module路径,同时指定你要安装nginx的路径 
   
 
    
    
    #4.执行nginx安装命令,(在解压好的nginx目录里执行)(这里很容易出错,如果出错就更换fastdfs-nginx-module) 
   
 
    
    make && make install 
   
 
    
    
    #5.拷贝fastdfs-nginx-module的mod_fastdfs.conf配置文件到/etc/fdfs目录下 
   
 
    
    cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs 
   
 
    
    
    #6.拷贝fastdfs的conf目录下的http.conf和mime.types文件到/etc/fdfs目录下 
   
 
    
    cp fastdfs-5.11/conf/http.conf /etc/fdfs 
   
 
    
    cp fastdfs-5.11/conf/mime.types /etc/fdfs 
   
 
    
    
    #7.修改nginx的nginx.conf配置文件 
   
 
    
    vi /usr/local/nginx/conf/nginx.conf 
   
 
    
        #修改nginx的监听端口,该端口跟storage.conf中的http.server_port保持一样 
   
 
    
        #修改location,注释掉之前的location,添加如下location 
   
 
    
    server { 
   
 
    
        listen 8888; 
   
 
    
        server_name localhost; 
   
 
    
        location ~/group[0-9]/ { 
   
 
    
            ngx_fastdfs_module; 
   
 
    
        } 
   
 
    
    
    } 
   
 
    
    
    #8.修改/etc/fdfs/mod_fastdfs.conf配置文件 
   
 
    
    vi /etc/fdfs/mod_fastdfs.conf 
   
 
    
        #修改如下内容 
   
 
    
    tracker_server=192.168.128.141:22122                  #指定自己的tracker服务地址和端口 
   
 
    
    url_have_group_name = true                                   #是否允许用组名访问,设置为true 
   
 
    
    group_name=group1                                               #组名,默认为group1,不用修改 
   
 
    
    store_path0=/data/fastdfs/storage/store             #指定自己的文件目录 
   
 
    
    
    #9.启动nginx服务 
   
 
    
    ./nginx -c /usr/local/nginx/conf/nginx.conf 
   
 
    
    
    #10.启动FastDFS服务 
   
 
    
    fdfs_trackerd /etc/fdfs/tracker.conf start 
   
 
    
    fdfs_storaged /etc/fdfs/storage.conf start 
   
 
    
   
   注意:fastdfs_v5.0与 fastdfs-nginx-module_v1.16安装正常,与1.20版本安装会报错:错误:在非结构或联合中请求成员‘path’ 
  
 
   
   
 
  
05-集成 FastDHT(文件去重)
 
  排重原理: 
 
 
  
  FastDFS本身支持文件的排重处理机制(fdfd_crc32 效率高于MD5),但需要FastDHT作为文件hash的索引存储。FastDHT是同一个作者的开源key-value数库。 
 
 
  
  FastDFS的storage server每次上传均计算文件的hash值,然后从FastDHT服务器上进行查找比对,如果没有返回,则写入hash,并将文件保存如果有返回,则建立一个新的文件链接(软连接 ln -s),不保存文件。 
 
 
  
  
  环境搭建 
 
 
  
   #1.安装BerkeleyDB,并上传到服务器然后解压,下载地址: http://download.oracle.com/berkeley-db/db-6.0.30.tar.gz 
  
 
   
   tar -zxvf db-6.0.30.tar.gz 
  
 
   
   
   #2.进入到解压好的目录db-4.7.25/build_unix/,并执行configure命令 
  
 
   
   cd  db-6.0.30/build_unix/ 
  
 
   
   ../dist/configure --prefix=/usr/db-6.0.30 
  
 
   
   
   #3.执行make 
  
 
   
   make && make install 
  
 
   
   
   #4.安装FastDHT,并上传到服务器然后解压,下载地址:GitHub - happyfish100/fastdht: FastDHT is a high performance distributed hash table (DHT) which based key value pairs. It can store mass key value pairs such as filename mapping, session data and user related data. 
  
 
   
   unzip fastdht-master.zip 
  
 
   
   
   
   #5.进入解压好的目录,然后修改make.sh,蓝色为增加内容,BerkeleyDB存放位置根据自己安装的目录填写 
  
 
   
   cd fastdht/ 
  
 
   
   vi make.sh 
  
 
   
   
   CFLAGS='$CFLAGS -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -I/usr/db-6.0.30/include/ -L/usr/db-6.0.30/lib/' 
  
 
   
   if [ "$DEBUG_FLAG" = "1" ]; then 
  
 
   
     CFLAGS="$CFLAGS -g -O -DDEBUG_FLAG" 
  
 
   
   else 
  
 
   
     CFLAGS="$CFLAGS -O3" 
  
 
   
   
   
   #5.执行make,安装完成之后会在/usr/local/bin/目录下生成fdht执行文件 
  
 
   
   ./make.sh && ./make.sh install 
  
 
   
   
   #6.安装完成后在/etc目录下产生fdht文件夹,并进行修改 
  
 
   
   ls /etc/fdht/ 
  
 
   
   fdht_client.conf  fdhtd.conf  fdht_servers.conf 
  
 
   
   
   #先创建一个目录用来存储资源 
  
 
   
   mkdir fastdht 
  
 
   
   
   #修改fdht_client.conf 
  
 
   
   base_path=/data/fastdht 
  
 
   
   keep_alive=1 
  
 
   
   #include /etc/fdht/fdht_servers.conf        (此处是需要加上#,##关闭,#打开) 
  
 
   
   
   #修改fdht_servers.conf 
  
 
   
   group_count = 1                                     #fastdht个数 
  
 
   
   group0 = 192.168.145.150:11411         #fastdht服务器地址和端口 
  
 
   
   
   #修改fdhtd.conf 
  
 
   
   port=11411 
  
 
   
   bash_path=/data/fastdht 
  
 
   
   #include /etc/fdht/fdht_servers.conf 
  
 
   
   
   #7.修改/etc/fdfs/storage.conf 
  
 
   
   check_file_duplicate=1 
  
 
   
   key_namespace=FastDFS 
  
 
   
   keep_alive=1 
  
 
   
   #include /etc/fdht/fdht_servers.conf 
  
 
   
   
   #8.拷贝libdb.so到/usr/lib目录 
  
 
   
   cp /usr/db-6.0.30/lib/libdb-6.0.so  /usr/lib/ 
  
 
   
   cp /usr/db-6.0.30/lib/libdb-6.0.so  /usr/lib64/ 
  
 
   
   
   #9.启动,分别启动fdhtd和fastdfs 
  
 
   
   /usr/local/bin/fdhtd /etc/fdht/fdhtd.conf start 
  
 
   
   /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start 
  
 
   
   /usr/bin/fdfs_storaged /etc/fdfs/storage.conf start 
  
 
   
   
   #10.测试 
  
 
   
   上传相同文件,发现原始文件只会保留一份,相同文件上传都会变为快捷方式 
  
 
   
 06-fastdfs分布式文件系统集群环境搭建
 
  搭建步骤: 
 
 
  
      (1)准备四台机器(仅测试) 
 
 
  
                  tracker:2台(192.168.80.145,192.168.80.146) 
 
 
  
                  storage:3台,分两组(192.168.80.147,192.168.80.148,192.168.80.149) 
 
 
  
  
          注意:五台机器的服务均已安装了fastdfs,nginx,fastdht,还有就是注意关闭所有机器的防火墙 
 
 
  
  
      (2)配置tracker( 两台tracker) 
 
 
  
   #1.进入/etc/fdfs/,修改tracker.conf 
  
 
   
   base_path=/home/fastdfs/tracker (确保路径存在,不存在先创建) 
  
 
   
   #负载均衡策略:0: 轮训,每个组上传一次,1: 指定组上传,2: 负载均衡,选择上传文件的最大空闲空间组 
  
 
   
   #当store_lookup=1时,store_group必须指定组名 
  
 
   
   store_lookup=2 
  
 
   
   
   #2.进入nginx,修改nginx.conf 
  
 
   
       upstream fastdfs_group1_server { 
  
 
   
           server 192.168.80.147:8888; 
  
 
   
           server 192.168.80.148:8888; 
  
 
   
       } 
  
 
   
       upstream fastdfs_group2_server { 
  
 
   
           server 192.168.80.149:8888; 
  
 
   
       } 
  
 
   
   
       server{ 
  
 
   
           listen 8888; 
  
 
   
           server_name localhost; 
  
 
   
           location ~ /group1/M0[0-9] { 
  
 
   
               proxy_pass http://fastdfs_group1_server; 
  
 
   
           } 
  
 
   
           location ~ /group2/M0[0-9] { 
  
 
   
               proxy_pass http://fastdfs_group2_server; 
  
 
   
           } 
  
 
   
       } 
  
 
   
  
      (3)配置storage(三台storage) 
 
 
  
   #1.进入/etc/fdfs/,修改storage.conf 
  
 
   
   a)、group1(192.168.80.147,192.168.80.148): 
  
 
   
     配置: 
  
 
   
     tracker_server=192.168.80.145:22122       (配置tracker) 
  
 
   
     tracker_server=192.168.80.146:22122 
  
 
   
     group_name=group1 
  
 
   
     base_path=/data/fastdfs/storage           (确保路径存在,不存在先创建) 
  
 
   
     store_path0=/data/fastdfs/storage    (确保路径存在,不存在先创建) 
  
 
   
   
   b)、group2(192.168.80.149): 
  
 
   
     配置: 
  
 
   
     tracker_server=192.168.80.145:22122       (配置tracker) 
  
 
   
     tracker_server=192.168.80.146:22122 
  
 
   
     group_name=group2 
  
 
   
     base_path=/data/fastdfs/storage          (确保路径存在,不存在先创建) 
  
 
   
     store_path0=/data/fastdfs/storage   (确保路径存在,不存在先创建) 
  
 
   
   
     注释:除了组名称不一样,其余都一样 
  
 
   
   
   #2.进入/etc/fdfs/,修改mod_fastdfs.conf 
  
 
   
   配置文件: 
  
 
   
        base_path=/home/fastdfs/mod_fastdfs     #保存日志目录 
  
 
   
        tracker_server=192.168.80.145:22122     #tracker服务器的IP地址以及端口号 
  
 
   
        tracker_server=192.168.80.146:22122 
  
 
   
        group_name=group1                       #当前服务器的group名(147 148 group1,149 group2) 
  
 
   
        url_have_group_name=true                #文件url中是否有group名 
  
 
   
        store_path0=/home/fastdfs/storage  #存储路径 
  
 
   
        group_count = 2                         #设置组的个数 
  
 
   
   
   #3.在末尾增加2个组的具体信息:(有几组就填写几组) 
  
 
   
       [group1] 
  
 
   
        group_name=group1 
  
 
   
        storage_server_port=23000 
  
 
   
        store_path_count=1 
  
 
   
        store_path0=/home/fastdfs/storage 
  
 
   
   
       [group2] 
  
 
   
        group_name=group2 
  
 
   
        storage_server_port=23000 
  
 
   
        store_path_count=1 
  
 
   
        store_path0=/home/fastdfs/storage 
  
 
   
   
   
   #4.进入nginx,修改nginx.conf 
  
 
   
   server{ 
  
 
   
        listen 8888; #storage 配置中, 有http.server_post=8888的配置信息,必须一致 
  
 
   
        server_name localhost; 
  
 
   
        location ~ /group[1-9]/M0[0-9] { 
  
 
   
            ngx_fastdfs_module; 
  
 
   
        } 
  
 
   
   } 
  
 
  
      (4)查看集群信息 
 
 
  
   #在三台storage服务器中 找一台服务器更改client.conf 
  
 
   
   #1.进入/etc/fdfs/,修改client.conf 
  
 
   
   base_path = /data/fastdfs/client 
  
 
   
   tracker_server = 192.168.80.145:22122    (有几个tracker机器配置几个tracker) 
  
 
   
   tracker_server = 192.168.80.146:22122 
  
 
   
   
   #2.执行fdfs_monitor命令,就可以得到集群信息 
  
 
   
   fdfs_monitor /etc/fdfs/client.conf 
  
 
  
 
  
      (5)测试 
 
 
  
   #在其中一台机器中,更改client.conf,然后执行上传 
  
 
  
 
   #修改client.conf 
  
 
 


















