CentOS 7上从零安装FastDFS:分布式文件系统部署全攻略
做文件存储需求的时候我很早就听说了FastDFS但真正在CentOS7上把它从零装起来是最近搭网盘测试环境的事。FastDFS是开源社区里很老牌的一个轻量级分布式文件系统纯C实现部署起来不像GlusterFS或HDFS那么重单机也能跑很多互联网公司早期都用它存图片和附件。这篇文章把我完整的过程整理出来从一台全新的CentOS 7服务器开始装依赖、编译libfastcommon和FastDFS、配好tracker和storage最后用客户端命令实测上传下载。如果你是第一次接触FastDFS或者只是想快速搭一套能跑的环境这篇应该能帮你少走不少弯路。我会把每个命令、每个要改的配置项、怎么自检都说清楚也会保留一些我实际踩过的坑。生产环境的高可用设计当然是后话但先把这条安装路线走通再谈优化才有意义。1. 先吃透FastDFS这套东西装起来才有底1.1 它到底解决什么问题一个很现实的问题文件越存越多单台服务器的磁盘总会满。扩容要买盘、要停机、要迁移而且文件一多目录里几千上万个文件每次查找都在考验文件系统。FastDFS就是为了解决这种“小文件在线存储”问题而生的。它把多台服务器的磁盘组织成一个统一的存储池客户端上传文件时不需要关心文件落在哪台机器FastDFS会自动分配存储节点然后返回一个文件ID下载的时候客户端拿着这个文件ID系统就能定位到实际文件。图片、附件、视频切片、头像这类中小文件是它最擅长的场景。我见过不少人拿FastDFS和NFS、HDFS放在一起比其实这三者定位完全不一样方案定位适合场景部署成本NFS网络文件系统小规模共享目录单点存储低HDFS大数据分布式文件系统海量大文件批量分析读取吞吐型高FastDFS轻量级分布式文件系统小文件在线存储高并发上传/下载低FastDFS的优势在于够轻。它不依赖起一大堆后台服务也没有复杂的元数据节点纯C写出来的东西内存和CPU占用比Java那套方案小很多。这对于预算有限的团队来说吸引力很大。1.2 Tracker和Storage两个核心角色FastDFS的核心是两类服务外加一个客户端角色Tracker Server调度服务器负责负载均衡。它本身不存实际文件而是维护所有Storage节点的状态比如是否存活、剩余空间多少、同步进度到哪了。客户端上传或下载前先问Tracker“我应该找谁”Tracker根据策略返回一个合适的Storage地址。你可以把它理解成前台接待员客人来了先接待再把客人领到对应柜台。Storage Server存储服务器真正把文件写到磁盘上的节点。Storage可以按组group划分同一个group内部的节点是相互备份的关系组与组之间数据不互通。扩容时通常按组增加机器这是FastDFS做水平扩展的基本单位。Client发起操作的任何程序命令行工具、Java SDK、客户端代码都算。它不直接决定文件存哪只负责问Tracker、拿地址、传文件。一次上传动作拆解下来是四步Client向Tracker发起上传请求Tracker根据负载返回一个可用的Storage地址Client直接和这个Storage建立连接并把文件传过去Storage写盘后返回一个文件ID。这个文件ID长这样group1/M00/00/00/wKhkBF7AWCyAZV2gAAAAAAZfZ9E341.txt不要小看这串ID它里面编码了组名、虚拟存储路径、目录hash和具体文件名。下载的时候Client会拿这个ID再去找TrackerTracker告诉它对应Storage在哪然后Client直接从Storage读文件。我建议动手装之前先把这个流程在脑子里过一遍后面看配置文件和监控日志时会清晰很多。1.3 安装路线图和版本选择FastDFS的源码和公共依赖库是分开发布的。FastDFS本体依赖一个叫libfastcommon的C公共库里面封装了哈希、网络通信、日志、配置解析这些底层能力。所以安装顺序必须是先编译安装libfastcommon再编译安装FastDFS本体这个顺序反了基本会编译失败。版本选择要注意网上很多老教程用的是FastDFS 5.x配旧版libfastcommon但新版6.x的配置文件字段已经有不少变化直接用老教程大概率会踩坑。我这次用的是FastDFS 6.06加libfastcommon 1.0.53的组合在GitHub Releases里都能找到对应tag。整个安装路线是这样的环境准备装编译依赖、关SELinux、放行防火墙端口、规划数据目录编译安装libfastcommon编译安装FastDFS本体配置并启动Tracker配置并启动Storage配置Client实测上传下载这条路线走通之后你才算真正把FastDFS攥在手心里。2. 环境准备依赖、防火墙、目录一次性弄齐2.1 基础依赖一条命令装完CentOS 7安装系统时如果选的是最小化安装很多基础命令都没有wget、netstat、vim可能全要自己装。我习惯先把下面这组依赖一股脑装上yum -y install wget net-tools vim gcc gcc-c make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl-develgcc、gcc-c、make还有autoconf这一套是编译C源码必须的pcre-devel、zlib-devel、openssl-devel看着像用不上但FastDFS编译时或后面配合nginx做HTTP访问时会用到一起装掉能省掉很多“装到一半回来补包”的破事。有些老教程还会让你装libevent-devel我在FastDFS 6.06的编译过程中并没有遇到硬性依赖所以没必要为了这个单独折腾。如果你在内网环境yum源本身需要提前配置好。完全离线的机器要么准备一个本地rpm包目录要么提前把依赖rpm下载好带进去否则第一步就会卡住。这一步看起来很基础但恰恰是新手最容易忽略的。2.2 SELinux和防火墙测试环境直接关掉CentOS 7默认开启了SELinux对于FastDFS这种需要绑定端口、写数据目录的服务来说SELinux策略可能在你毫无察觉的时候拦截掉网络监听或文件写操作。日志一切正常进程也在但storage就是连不上tracker或者文件写到一半报权限错误查一圈最后发现是SELinux搞的鬼。测试环境我建议直接关掉setenforce 0 sed -i s/^SELINUXenforcing/SELINUXdisabled/ /etc/selinux/configsetenforce 0是临时生效改配置文件的目的是让重启后也保持关闭。实际上如果只是为了验证临时关闭就够了但因为后面还要重启做各种验证干脆一步到位。防火墙这块如果你用的是firewalld可以只放行FastDFS需要的端口firewall-cmd --permanent --add-port22122/tcp firewall-cmd --permanent --add-port23000/tcp firewall-cmd --reload22122是Tracker默认端口23000是Storage默认端口。嫌麻烦的情况也可以直接systemctl stop firewalld systemctl disable firewalld但我要提醒一句如果你用的是云主机光放行系统防火墙还不够云控制台的安全组也要放行这两个端口。我自己就吃过这个亏系统防火墙全开了storage还是连不上tracker后来才发现是安全组里压根没加23000端口。2.3 单独目录规划把后面的混淆全避免掉FastDFS的目录概念容易把人绕晕我第一次装的时候就把base_path和store_path搞混过。这里我直接给出推荐目录结构mkdir -p /data/fastdfs/tracker mkdir -p /data/fastdfs/storage mkdir -p /data/fastdfs/storage/store mkdir -p /data/fastdfs/client/data/fastdfs/trackerTracker的base_path存放tracker日志和元数据状态/data/fastdfs/storageStorage的base_path存放storage日志和状态信息/data/fastdfs/storage/storeStorage的store_path0实际文件数据就放这里/data/fastdfs/client客户端日志目录base_path和store_path一定要分开前者是“管理状态”后者是“真实数据”。混在一个目录里不仅日志排查混乱后面清理磁盘的时候还容易误操作。如果服务器上有专门的数据盘store_path0可以指向数据盘目录base_path留在系统盘这样日志和文件数据互不干扰。3. 编译安装libfastcommon和FastDFS本体3.1 先编译公共基础库libfastcommonlibfastcommon是整个FastDFS的地基必须最先装。执行下面这组命令cd /usr/local/src wget https://github.com/happyfish100/libfastcommon/archive/refs/tags/V1.0.53.tar.gz tar -zxvf V1.0.53.tar.gz cd libfastcommon-1.0.53 ./make.sh ./make.sh install编译本身很快几十秒就能完成。安装完默认库文件会落到/usr/lib64/libfastcommon.so我建议验证一下ls -l /usr/lib64/libfastcommon.so ldconfig我遇到过一种情况libfastcommon编译安装正常但后面FastDFS编译时提示找不到共享库原因是安装路径不在系统默认搜索路径里。如果/usr/lib64下看不到就去/usr/local/lib64找找不到就软链过去ln -s /usr/local/lib64/libfastcommon.so /usr/lib64/libfastcommon.so ldconfig这一步最不起眼但后面被坑回来的概率也最高。别急着往下走先确认库文件真实存在。3.2 FastDFS本体编译安装接着下载FastDFS本体还是放到/usr/local/src下cd /usr/local/src wget https://github.com/happyfish100/fastdfs/archive/refs/tags/V6.06.tar.gz tar -zxvf V6.06.tar.gz cd fastdfs-6.06 ./make.sh ./make.sh install如果你的服务器访问GitHub比较慢可以先在一台有外网访问的机器上把release包下载好再scp传到这台服务器上。FTP之类的方式也行重点是源码包必须完整tar解压时不能报错。编译过程中如果出现类似libfastcommon.so: cannot open shared object file的报错回到3.1核对库路径。我的经验是90%的情况都是库文件没找到不是代码问题。3.3 安装后的文件布局和版本验证FastDFS安装完成后可执行文件会放到/usr/bin/下配置文件模板放在/etc/fdfs/。先看一眼这些关键文件ls /usr/bin/fdfs_* ls /etc/fdfs/*.sample/usr/bin/下应该能看到fdfs_trackerd、fdfs_storaged、fdfs_monitor、fdfs_test、fdfs_upload_file等命令。/etc/fdfs/下默认没有正式配置只有三个sample模板需要自己复制一份cd /etc/fdfs/ cp tracker.conf.sample tracker.conf cp storage.conf.sample storage.conf cp client.conf.sample client.conf复制完再验证一下版本fdfs_trackerd -v能输出版本号说明FastDFS本体和libfastcommon的链路是通的接下来才能进入配置阶段。4. 配置tracker和storage并把进程托管给systemd4.1 tracker配置和启动Tracker的配置集中在/etc/fdfs/tracker.conf大多数参数保持默认就能跑必改的其实只有两个base_path/data/fastdfs/tracker port22122base_path指定tracker日志和状态文件的位置port是tracker的服务端口保持默认22122就行。我先创建目录再启动cd /etc/fdfs/ vim tracker.conf mkdir -p /data/fastdfs/trackerCentOS 7安装FastDFS不一定自带systemd服务我习惯手动建一个unit文件统一管理进程。新建/etc/systemd/system/fastdfs-tracker.service[Unit] DescriptionFastDFS tracker Afternetwork.target [Service] Typeforking ExecStart/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start ExecStop/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf stop Restarton-failure PIDFile/data/fastdfs/tracker/data/fdfs_trackerd.pid [Install] WantedBymulti-user.target然后启动并设置开机自启systemctl daemon-reload systemctl enable --now fastdfs-tracker systemctl status fastdfs-tracker确认tracker是否起来看端口netstat -tlnp | grep 22122如果端口没监听去日志里找原因tail -f /data/fastdfs/tracker/logs/trackerd.logtracker的日志很直白权限不够、路径不对、端口被占都会直接写出来。4.2 storage配置和启动Storage的配置在/etc/fdfs/storage.conf关键参数比tracker多一些我按自己的环境逐个说参数这次设置的值说明group_namegroup1存储组名同一组节点互为备份base_path/data/fastdfs/storagestorage日志和状态目录store_path_count1数据目录个数store_path0/data/fastdfs/storage/store实际文件存放目录tracker_server192.168.1.100:22122tracker地址写实际内网IPport23000storage服务端口注意tracker_server这一项我这里写的是tracker的真实内网IP不是127.0.0.1。虽然测试阶段storage和tracker都在同一台机器上写127.0.0.1也能通但写实际IP会让配置更通用后面加第二台storage节点时不会因为没改配置导致连不上。如果你的tracker和storage不在同一台机器这个位置就写tracker那台机器的内网IP。创建目录并启动mkdir -p /data/fastdfs/storage mkdir -p /data/fastdfs/storage/store vim /etc/fdfs/storage.conf同样建systemd服务新建/etc/systemd/system/fastdfs-storage.service[Unit] DescriptionFastDFS storage Afternetwork.target [Service] Typeforking ExecStart/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start ExecStop/usr/bin/fdfs_storaged /etc/fdfs/storage.conf stop Restarton-failure PIDFile/data/fastdfs/storage/data/fdfs_storaged.pid [Install] WantedBymulti-user.target启动systemctl daemon-reload systemctl enable --now fastdfs-storage systemctl status fastdfs-storage同样确认23000端口在监听netstat -tlnp | grep 23000storage启动后会主动向tracker上报状态如果tracker的IP写错或者端口不通storage进程虽然能起但永远无法注册成功这点体现在monitor上最明显。4.3 用fdfs_monitor确认节点已上线storage起来后光看端口没有用关键要看它有没有在tracker那里注册成功。用FastDFS自带的监控工具/usr/bin/fdfs_monitor /etc/fdfs/storage.conf输出会列出所有group和storage节点重点看这一段状态。如果你的节点显示ip_addr 192.168.1.100 (ACTIVE)说明storage已经在tracker这里正常上线了。如果显示的是OFFLINE多半是防火墙、安全组或者tracker_server地址的问题。我建议此时去storage日志里找答案tail -f /data/fastdfs/storage/logs/storaged.log很多人在这一步就卡住其实日志里已经写得明明白白关键看你会不会去看。storage日志的报错通常会直说“connect to tracker failed”或“tracker server ip and port invalid”之类的信息照着改配置就行。5. 客户端实测上传、下载、删除一条龙5.1 client.conf里真正关心的两行FastDFS自带的命令行工具也需要一份客户端配置用来连接tracker。编辑/etc/fdfs/client.confbase_path/data/fastdfs/client tracker_server192.168.1.100:22122首先创建客户端base目录mkdir -p /data/fastdfs/clientclient.conf里其余的日志级别、连接超时等参数保持默认足够。tracker_server这里同样写tracker的实际内网IP和storage.conf里保持一致。5.2 上传测试并把文件ID彻底读懂我先造一个测试文件然后上传看看效果echo hello fastdfs /root/hello.txt /usr/bin/fdfs_test /etc/fdfs/client.conf upload /root/hello.txt输出里最重要的三段是group_namegroup1 remote_filenameM00/00/00/wKhkBF7AWCyAZV2gAAAAAAZfZ9E341.txt example_file_urlhttp://192.168.1.100/group1/M00/00/00/wKhkBF7AWCyAZV2gAAAAAAZfZ9E341.txt理解这个文件ID是理解FastDFS的关键。group1是存储组名M00不是真实目录而是store_path的索引映射我们配置的第一块数据目录store_path0就映射为M00。后面的00/00两级目录是FastDFS按照文件名hash自动散列出来的目的是避免单个目录下堆积过多文件。最后的wKhkBF7AWCyAZV2gAAAAAAZfZ9E341.txt是真实落盘文件名包含了上传时间戳信息。现在去storage的数据目录看一眼ls -l /data/fastdfs/storage/store/data/00/00/能看到真实存下来的文件说明文件确实落盘成功。到这里FastDFS的核心链路已经通了。5.3 更高效的命令上传、下载、删除fdfs_test这个命令会输出一堆调试信息适合测试但不适合写脚本。正式写脚本时用更简洁的命令更方便/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /root/hello.txt这个命令不会输出多余内容直接打印一行文件ID比如group1/M00/00/00/wKhkBF7AWCyAZV2gAAAAAAZfZ9E341.txt脚本里直接用这个返回值就行。下载就反向操作/usr/bin/fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/wKhkBF7AWCyAZV2gAAAAAAZfZ9E341.txt文件会下载到当前目录。这个命令也可以追加一个本地路径参数指定下载到具体位置。删除也简单/usr/bin/fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKhkBF7AWCyAZV2gAAAAAAZfZ9E341.txt删除操作不可逆生产环境用之前先确认文件ID没搞错。5.4 HTTP访问是另一层工作新版本不内置上传下载命令通了之后很多人会问能不能直接在浏览器里通过URL访问图片FastDFS新版已经基本放弃了内置HTTP服务它本质上是“存储系统”不是“Web服务器”。要让文件能通过HTTP URL访问常规做法是在storage前面再加一层nginx然后用fastdfs-nginx-module这类扩展模块把FastDFS文件ID映射到真实文件路径。那块工作等于另一篇文章的工程量我在本文末尾会再提一句。如果你目前只是验证打通流程fdfs_download_file能下载出完整文件就已经算成功了。HTTP暴露层可以等存储层稳定之后另外做。6. 复盘我在CentOS7上装FastDFS踩过的六个坑6.1 libfastcommon的库路径导致编译失败第一次安装时libfastcommon装完也没仔细看直接跑去编FastDFS结果编译过半报了一堆找不到共享库的错误。编译工具链本身没问题纯粹是系统没找到libfastcommon.so。最终解决就是在/usr/lib64和/usr/local/lib64之间做软链再执行ldconfig刷新。现在不管是自己装还是帮别人排查我都会先确认这个库文件真实存在再继续。6.2 SELinux让storage一直OFFLINE有次storage进程和端口看起来都正常但fdfs_monitor里永远显示OFFLINE。进程没挂日志也没有错误后来一查audit日志发现是SELinux在拦。测试环境直接关掉SELinux是最省心的选择生产环境如果要开就得针对FastDFS的端口和目录写专门策略性价比很低。6.3 云安全组忘了放行端口本地虚拟机测试时很少遇到这个问题一旦搬到云主机系统防火墙放行了还不够控制台的安全组也得放行。我当时tracker在一台云主机storage在另一台两边系统防火墙都关了storage仍然连不上tracker最后发现云安全组没放行22122。这个坑的价值在于提醒你排查网络问题时脑子里的检查清单除系统防火墙外还要有安全组这一层。6.4 base_path和store_path混在一起storage.conf里base_path填的是/data/fastdfs/storagestore_path0填的是/data/fastdfs/storage/store这两个目录职责完全不同。base_path下放日志、状态等管理数据store_path0下放文件真实数据。把它们混在同一个目录也不是不能跑但后续看日志、做备份、清理过期数据的时候会非常痛苦。目录规划这一步看似简单影响其实很长远。6.5 tracker_server写127.0.0.1留下的隐患单机测试时把tracker_server写成127.0.0.1没有任何问题一切跑得飞快。但当你把这份配置复制到另一台storage节点时它还是会去连127.0.0.1也就是自己结果就是连不上tracker。养成好习惯配置里统一写内网实际IP而不是图省事写localhost。6.6 systemd自启是最后一道保险FastDFS装好之后进程是可以手动启动的但如果服务器重启进程是不会自己跑起来的。CentOS 7上我建议把tracker和storage都写成systemd服务设置enable开机自启。这样即使机器重启服务也能自动恢复免得大半夜被人叫起来去手动启进程。最后再分享一个小技巧。上面这些编译步骤在第一次试验环境玩得很开心但如果只是临时需要验证功能第二次我直接用了容器化方式拉一个现成的fastdfs镜像两条命令就能把tracker和storage跑起来。不过容器方案真正麻烦的是数据持久化数据目录必须用宿主机卷挂载存储插件的同步逻辑也要额外验证不要把容器删除后文件跟着消失这种低级事故带进生产环境。想清楚是验证功能还是承载业务再决定走编译还是容器这个问题远比你会不会敲命令重要。