学习笔记-FastDFS

  • 内容简介

    在跟随项目实践过程中,代码中需要使用上传图片的功能,其中使用了FastDFS作为图片服务器,在此记录一下搭建FastDFS服务器的过程


  • 框架介绍

    1.什么是FastDFS

    FastDFS是用c语言编写的一款开源的分布式文件系统。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。

    2.FastDFS架构

    FastDFS架构包括 Tracker server和Storage server。客户端请求Tracker server进行文件上传、下载,通过Tracker server调度最终由Storage server完成文件上传和下载。
    Tracker server作用是负载均衡和调度,通过Tracker server在文件上传时可以根据一些策略找到Storage server提供文件上传服务。可以将tracker称为追踪服务器或调度服务器。
    Storage server作用是文件存储,客户端上传的文件最终存储在Storage服务器上,Storage server没有实现自己的文件系统而是利用操作系统 的文件系统来管理文件。可以将storage称为存储服务器,如下图:

    fastdfs-show
    fastdfs-show

    3.Tracker 集群

    FastDFS集群中的Tracker server可以有多台,Tracker server之间是相互平等关系同时提供服务,Tracker server不存在单点故障。客户端请求Tracker server采用轮询方式,如果请求的tracker无法提供服务则换另一个tracker。

    4.Storage集群

    Storage集群采用了分组存储方式。storage集群由一个或多个组构成,集群存储总容量为集群中所有组的存储容量之和。一个组由一台或多台存储服务器组成,组内的Storage server之间是平等关系,不同组的Storage server之间不会相互通信,同组内的Storage server之间会相互连接进行文件同步,从而保证同组内每个storage上的文件完全一致的。一个组的存储容量为该组内存储服务器容量最小的那个,由此可见组内存储服务器的软硬件配置最好是一致的。
    采用分组存储方式的好处是灵活、可控性较强。比如上传文件时,可以由客户端直接指定上传到的组也可以由tracker进行调度选择。一个分组的存储服务器访问压力较大时,可

  • 准备工作

    1.前提条件

    安装好了VM+CentOs6.4(网络等配置都可正常使用)
    已安装nginx(非必须)
    JDK1.7

    2.安装所需

    fastdfs-nginx-module_v1.16.tar.gz - 集成nginx所需模块
    FastDFS_v5.05.tar.gz - FastDFS源码,C语言编写,需要手动编译
    jdk-7u67-linux-x64.tar.gz
    nginx-1.8.0.tar.gz - nginx源码,C语言编写,需要手动编译
    libfastcommonV1.0.7.tar.gz - FastDFS官方提供的基础库
    perl-5.20.2.tar.gz - 编译基础库所需要的语言环境


  • 服务搭建

    1.环境介绍

    • VM + CentOs6.4 + Jdk1.7 + nginx1.8.0

    • 此处记录的是在同一台服务器上同时搭建tracker和storage,并且都是一个,组成的是一个最简便的集群环境。


    2.安装libfastcommon基础库

    • 将压缩包上传至虚拟机/usr/local下,解压缩

    • 进入文件夹,看到有make.sh文件,执行 ./make.sh ,初次安装会报错,因为缺少必要的语言运行环境,执行下列命令

    # FastDFS依赖libevent库,需要安装:
    yum -y install libevent
    
    # 安装gcc库,若之前安装过nginx,则不需要重复安装
    yum -y install gcc 
    yum -y install gcc -c++ 
    
    • 安装Perl语言环境,需要下载源码perl-5.20.2.tar.gz,上传至/usr/local下,解压缩,进入目录,依次执行:
    $ tar -xzf perl-5.x.y.tar.gz //解压缩
    $ cd perl-5.x.y
    $ ./Configure -de
    $ make
    $ make test
    $ make install
    $ perl -v //检测是否安装成功
    
    • 环境准备完成后再进入libfastcommon目录,执行 ./make.sh ,库会安装在/usr/lib64目录下,但是FastDFS设置的lib目录是/usr/local/lib ,所以此时可以有两种方式
    # 第一种方式,复制一份
    cp /usr/lib64/libfastcommon.so /usr/local/lib  
    
    # 第二种方式,建立软连接(推荐)
    ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
    ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so
    
    • 到此基础库安装完成

    3.安装FastDFS

    • 将FastDFS_v5.05.tar.gz拷贝至/usr/local/下,依次执行
    tar -zxvf FastDFS_v5.05.tar.gz
    cd FastDFS
    ./make.sh
    ./make.sh install
    
    • 如果安装过程中没有报错,并且在/etc/fdfs目录中包含配置文件,说明安装成功,随后将FastDFS目录下的conf下的文件拷贝到/etc/fdfs/下

    4.配置tracker

    • 前面所执行的步骤无论是tracker还是storage都是必须的,之后若要在不同的虚拟机上分别配置,主要就是对FastDFS安装完成之后的配置过程的不同,此处演示的是在同一台虚拟机上安装配置

    • 初始化文件目录

    # 配置tracker所需要的base_path
    mkdir /home/fastdfs_tracker 
    
    • 进入/etc/fdfs目录,复制tracker.conf.simple并改名为tracker.conf

    • 编辑tracker.conf,对以下几个配置进行修改

    # 是否启用此配置文件
    disabled = true 
    # 端口号,一般使用这个默认端口
    port = 22122 
    # tracker的数据和日志文件目录(预先创建)
    base_path = /home/fastdfs_tracker 
    
    • 启动tracker,执行命令
    /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
    
    • 查看日志观察启动过程中是否报错
    tail -100f /home/fastdfs_tracker/logs/tracker.log   (base_path路径)
    
    • 启动没有问题,则设置tracker为开机自动启动,编辑:vi /etc/rc.d/rc.local , 将此命令加入末行。至此,tracker安装完毕

    5.配置storage

    • 若更换虚拟机则需要执行以上的步骤,此处继续在原虚拟机上执行

    • 初始化文件目录

    # 配置storage所需要的base_path,保存日志信息
    mkdir /home/fastdfs_storage_info 
    # 配置storage所需要的base_path,保存数据文件
    mkdir /home/fastdfs_storage_data 
    
    • 进入/etc/fdfs目录,复制storage.conf.simple并改名为storage.conf

    • 编辑storage.conf,对以下几个配置进行修改

    # 是否启用此配置文件
    disabled = true 
    # 组名
    group_name = group1
    # 端口,同一组必须保证端口统一
    port = 23001
    # 日志目录
    base_path = /home/fastdfs_storage_info
    # 存储路径个数,与组成员个数保持一致
    store_path_count = 1
    # 数据文件存储路径,果有多个挂载磁盘则定义多个store_path,后缀递增即可
    store_path0 = /home/fastdfs_storage_data
    # tracker服务器IP和端口,如果有多个则配置多个tracker
    tracker_server = 192.168.XX.XXX:22122
    
    • 启动storage,执行命令
    /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
    
    • 观察启动过程中是否报错
    # 通过日志观察
    tail -100f /home/fastdfs_storage_info/logs/storaged.log
    # 通过监控观察是否成功注册到tracker
    /usr/bin/fdfs_monitor /etc/fdfs/storage.conf
    
    • 启动没有问题,则设置storage为开机自动启动,编辑:vi /etc/rc.d/rc.local , 将此命令加入末行。至此,storage安装完毕

    6.测试服务

    • FastDFS安装成功可通过/usr/bin/fdfs_test测试上传、下载等操作。

    • 编辑/etc/fdfs/client.conf,修改以下配置

    base_path=/home/fastdfs_tracker
    tracker_server=192.168.XX.XXX:22122
    
    • 使用格式:/usr/bin/fdfs_test 客户端配置文件地址 upload 上传文件,例如:
    /usr/bin/fdfs_test /etc/fdfs/client.conf upload test.jpg
    

  • 整合nginx

    • 1.此处讨论的是在之前nginx上重新安装nginx(添加了新模块)的情况,如何安装nginx可以参考之前的博文:学习笔记-nginx

    • 2.不管是在tracker上安装还是storage安装nginx,都需要先上传FastDFS-nginx-module模块,并且修改相应配置

    3.tracker上安装nginx

    在每个tracker上安装nginx,的主要目的是做负载均衡及实现高可用。此处只有一个tracker.为配置nginx

    4.在storage上安装nginx

    • 库环境在此处不再赘述,由于之前已经安装了nginx,此处需要添加新模块FastDFS-nginx-module,添加之前,先下载该模块并且修改相应的配置文件

    • 上传FastDFS-nginx-module至/usr/java目录,解压缩,进入/FastDFS-nginx-module/src目录下,编辑config文件,将/usr/local改为/usr (将/local去掉)

    CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
    CORE_LIBS="$CORE_LIBS -L/usr/lib -lfastcommon -lfdfsclient"
    
    • 将FastDFS-nginx-module/src下的mod_FastDFS.conf拷贝至/etc/fdfs/下,并且修改配置(类比按照自己实际情况修改):
    base_path = /home/fastdfs_storage_info
    tracker_server = XX
    storage_server_port = XX
    group_name = XX
    url_have_group_name = true #是否在url中使用组名
    store_path_count = 1
    store_path0 = /home/fastdfs_storage_data
    group_count = 1
    #最后根据自己实际情况,为每一个组添加如下配置
    [group1]
    group_name=group1
    storage_server_port=23000
    store_path_count=1
    store_path0=/home/fastdfs_storage_data
    
    • 进入nginx源码的目录(不是编译后生产的目录):/usr/java/nginx-1.8.0执行命令:
    ./configure \
    --prefix=/usr/local/nginx \
    --pid-path=/var/run/nginx/nginx.pid \
    --lock-path=/var/lock/nginx.lock \
    --error-log-path=/var/log/nginx/error.log \
    --http-log-path=/var/log/nginx/access.log \
    --with-http_gzip_static_module \
    --http-client-body-temp-path=/var/temp/nginx/client \
    --http-proxy-temp-path=/var/temp/nginx/proxy \
    --http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
    --http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
    --http-scgi-temp-path=/var/temp/nginx/scgi
    --add-module=/usr/java/fastdfs-nginx-module/src  //XXX为模块存在路径
    
    • 成功后执行make,重新编译,会生成新的nginx执行文件,不要执行make install,在obj目录下,将obj/nginx复制到旧版本的nginx安装目录下,将旧版本的改为nginx.bak

    • 测试新的nginx程序是否正确,执行/usr/local/nginx/sbin/nginx -t , 若显示以下信息则测试通过

    nginx: theconfiguration file /usr/local/nginx/conf/nginx.conf syntax is ok
    nginx:configuration file /usr/local/nginx/conf/nginx.conf test issuccessful
    
    • FastDFS设置的lib目录是/usr/local/lib ,所以此时可以有两种方式
    # 第一种方式,复制一份
    cp /usr/lib64/libfdfsclient.so /usr/local/lib  
    
    # 第二种方式,建立软连接(推荐)
    ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so
    ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so
    
    • 最后需要配置nginx反向代理,进入nginx安装目录,编辑nginx.conf文件,添加server节点:
    server {
        listen       80;
        server_name  localhost;
    
        location /group1/M00 {
                root /home/fastdfs_storage_data/data;
                ngx_fastdfs_module;
        }
    
        # location / {
           # root   html;
           # index  index.html index.htm;
        # }
    
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html81;
        }
    }
    
    • 配置好节点后,依次重启tracker,重启storage,重启nginx,利用上述测试上传图片返回的url,在浏览器中访问,检测是否可以成功访问

    5.坑和排坑

    • 我在操作过程中,卡在重新安装nginx这一个步骤很久,启动nginx的时候一直不成功,此时可以通过查看nginx的日志文件来查看错误,这个很重要

    • 编辑nginx.conf文件,添加server节点时,注意监听的端口,80端口只能配置一个

    • 若正常启动了nginx还是不能成功访问图片(图片已经成功上传的情况下),也可以通过查看日志来解决,比如我访问的时候路径里面会带上/html/group1/...等路径,就是因为下面那个默认的location没有注释掉导致的

    • 看日志,很重要 tail -100f /var/log/nginx/error.log


  • 结语

搭这个服务器花了差不多一天的时间。。。过程中难免遇到很多坑,多查资料多百度,文中记录的信息有限,中途说不定也有遗漏的信息,欢迎指正,仅供参考!


本文作者: little-dragon
个人博客: http://littledragon.cn
版权声明: 原创文章,有问题请评论中留言。非商业转载请注明作者及出处。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容