一、FastDFS概述
1.分布式文件系统
分布式文件系统(Distributed File System)是一个软件/软件服务器,此软件可以用来管理在多个服务器节点中的文件(这些服务器节点通过网络相连并构成一个庞大的文件存储服务器集群,即这些服务器节点都是用来存储文件资源的,且用DFS来管理这些文件)。而传统文件系统与分布式文件系统的对比,有如下区别:
经过对比,我们会发现传统文件系统存在如下缺点:
若用户数量多,则IO操作会很频繁 则对磁盘的访问压力会较大;
若磁盘故障,则可能会造成数据的丢失;
一个磁盘的存储容量有限。
FastDFS 是一款开源的轻量级分布式文件系统,
纯C实现,支持Linux、FreeBSD等类UNIX系统;
类Google FS,不是通用的文件系统,只能通过专有的API访问,目前提供了 C、Java和PHP API;
为互联网应用量身定做,追求高性能和高扩展型;
FastDFS可以看做是基于文件系统的key/value pair存储系统,称作分布式文件存储服务更为合适;
更倾向于存储中小型文件(4KB~500MB);
2、FastDFS 组成
Tracker Server
跟踪服务器,主要做调度工作,在访问时起负载均衡的作用。在内存中记录 集群中group和storage服务器的状态信息,是连接客户端和Storage服务端的枢纽。因为相关信息全部在内存中,Tracker服务器的性能非常高,一个较大的集群(比如上百个group)中有3台就足够了。
Storage Server
存储服务器,文件和文件属性(meta data)都保存到存储服务器上。
FastDFS上传机制
title FastDFS上传机制
participant Client
participant Tracker_Server
participant Storage_Server
Storage_Server -> Tracker_Server: 1. 定时向Tracker上传状态信息
Client -> Tracker_Server: 2. 上传连接请求
Tracker_Server -> Tracker_Server: 3. 查询可用storage
Client <- Tracker_Server: 4. 返回信息(storage的IP和端口)
Client -> Storage_Server: 5. 上传文件(file content和meta data)
Storage_Server -> Storage_Server: 6. 生成file_id
Storage_Server -> Storage_Server: 7. 将上传内容写入硬盘
Client <- Storage_Server: 8. 返回file_id(路径信息和文件名)
Client -> Client: 9. 存储文件信息
FastDFS架构
二、安装部署
环境准备:
主机名 | IP | 部署服务 |
---|---|---|
web01 | 172.16.1.7 | Tracker(调度工作)、Storage(存储)、Nginx、Keepalived |
web02 | 172.16.1.8 | Tracker(调度工作)、Storage(存储)、Nginx、Keepalived |
web03 | 172.16.1.9 | 代理以上两台VIP地址 |
VIP: 10.0.1.100
以下操作web01、web02同步执行
2.1、安装依赖
yum -y install make cmake gcc gcc-c++ libevent git
2.2、libfastcommon安装部署
git clone https://gitee.com/fastdfs100/libfastcommon.git
cd libfastcommon
git checkout V1.0.48
./make.sh clean && ./make.sh && ./make.sh install
2.3、fastdfs安装部署
git clone https://gitee.com/fastdfs100/fastdfs.git
cd fastdfs
git checkout V6.07
./make.sh clean && ./make.sh && ./make.sh install
安装完毕后,配置文件在 /etc/fdfs目录下;二进制程序在 /usr/bin目录下;启动脚本在 /lib/systemd/system目录下
2.3、配置 Tracker 文件
Tracker只需要修改 base_path即可
#创建数据目录
[root@web01 fdfs]# mkdir -p /data/{fastdfs,fdfs_tracker,fdfs_storage,fdfs_file}
[root@web01 fdfs]# cp client.conf.sample client.conf
[root@web01 fdfs]# cp storage.conf.sample storage.conf
[root@web01 fdfs]# cp tracker.conf.sample tracker.conf
[root@node01 fdfs]# vim tracker.conf
----
base_path = /data/fdfs_tracker
---
2.4、配置Storage文件
Storage只需修改如下即可
[root@node01 fdfs]# vim storage.conf
base_path = /data/fdfs_storage
store_path0 = /data/fdfs_file
tracker_server = 10.0.0.7:22122
2.5、启动服务
fdfs_trackerd /etc/fdfs/tracker.conf start
fdfs_storaged /etc/fdfs/storage.conf start
端口查看
[root@web01 fdfs]# netstat -lntup | grep fdfs
tcp 0 0 0.0.0.0:22122 0.0.0.0:* LISTEN 9567/fdfs_trackerd
tcp 0 0 0.0.0.0:23000 0.0.0.0:* LISTEN 9576/fdfs_storaged
Storage 服务启动后,在 base_path 下创建了 data、logs 目录,记录着 Storage Server 的信息。在 store_path0 目录下,创建了 N*N 个子目录:
[root@web01 fdfs]# ls /data/fdfs_file/data/
查看 Storage 服务与 Tracker 服务是否通信正常
fdfs_monitor /etc/fdfs/storage.conf
2.6、上传测试
修改 Tracker 服务器上的客户端配置文件,修改 base_path 及 tracker_server 配置,其他保持默认即可。如下:
[root@web01 fdfs]# grep -E "(^base_path|^tracker_server)" client.conf
base_path = /data/fastdfs
tracker_server = 10.0.0.7:22122
上传图片
[root@web01 fdfs]# fdfs_upload_file /etc/fdfs/client.conf /root/1.png
group1/M00/00/00/CgAAB2UjqbGAF58vAARe9mXDrMA952.png
上传成功后返回文件ID号:group1/M00/00/00/CgAAB2UjqbGAF58vAARe9mXDrMA952.png。返回的文件ID由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。
2.7、安装Nginx
wget https://nginx.org/download/nginx-1.24.0.tar.gz
mkdir /data/apps
# 安装编译 Nginx 所需的依赖
yum install -y pcre-devel zlib-devel openssl-devel
tar -xf nginx-1.24.0.tar.gz -C /data/apps
cd /data/apps/nginx-1.24.0
# 使用默认配置即可
./configure --prefix=/data/apps/nginx-1.24.0
make && make install
验证安装
[root@web01 fdfs]# /data/apps/nginx-1.24.0/sbin/nginx -V
nginx version: nginx/1.24.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
configure arguments: --prefix=/data/apps/nginx-1.24.0
简单配置 Nginx,可以使我们可以访问刚刚上传的文件。配置文件中添加一个 /group1/M00
的 location
即可。配置如下:
[root@web01 nginx-1.24.0]# vim conf/nginx.conf
----
location /group1/M00 {
alias /data/fdfs_file/data;
}
-----
#检测语法
[root@web01 nginx-1.24.0]# sbin/nginx -t
nginx: the configuration file /data/apps/nginx-1.24.0/conf/nginx.conf syntax is ok
nginx: configuration file /data/apps/nginx-1.24.0/conf/nginx.conf test is successful
#启动服务
[root@web01 nginx-1.24.0]# sbin/nginx
#查看端口
[root@web01 nginx-1.24.0]# netstat -lntup | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 17836/nginx: master
打开浏览器访问刚刚上传的文件,URL 为:http://10.0.0.7/group1/M00/00/00/CgAAB2UjqbGAF58vAARe9mXDrMA952.png
三、高可用集群部署
3.1、修改配置
#修改storage.conf文件
#主要检查以下配置项,两台服务器配置保持一致
cat /etc/fdfs/storage.conf
# 是否启用配置文件,false表示生效
disabled = false
group_name = group1
port = 23000
base_path = /data/fdfs_storage
store_path0 = /data/fdfs_storage
# 存储路径个数,需要和store_path个数匹配
store_path_count = 1
# tracker节点IP+端口
tracker_server = 10.0.0.7:22122
tracker_server = 10.0.0.8:22122
# http端口号
http.server_port = 8888
重新启动storage节点,两台服务器同步操作
fdfs_storaged /etc/fdfs/storage.conf restart
3.2、查看集群信息
fdfs_monitor /etc/fdfs/storage.conf
3.3、编辑Nginx模块配置
cat >> /etc/fdfs/mod_fastdfs.conf << EOF
base_path=/home/fastdfs/storage
store_path0=/home/fastdfs/storage
tracker_server=10.0.0.7:22122
tracker_server=10.0.0.8:22122
storage_server_port=23000
EOF
3.4、上传文件测试两台节点是否同步
web01因为前面上传过图片,所有已经有一张了,二web02则是空的
上传图片
fdfs_upload_file /etc/fdfs/client.conf /root/2.png
3.5、Keepalived部署
两台服务器安装配置keepalived虚拟地址 //Keepalived部署自行参考文档
yum install -y keepalived
web01配置:
global_defs {
router_id web01
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 50
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
web02配置
global_defs {
router_id web02
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
启动服务
systemctl start keepalived
3.6、高可用访问验证
浏览器访问图片:http://IP:Port/group1/M00/00/00/CgAACGUjvdiAJdsoAAKDesCVQ9Q224.png
故障测试
停掉web01 Keepalived服务,查看VIP是否还能正常访问
发现,VIP还能继续访问网页,至此FastDFS高可用集群部署完成