介绍
fastDFS是一个开源的分布式文件系统框架,实现了冗余备份、负载均衡、线性扩容等机制,可以很方便的用来搭建图床、网盘。
该框架包含3个角色:追踪器、存储节点、客户端。
客户端上传文件:客户端连接追踪器,询问它哪个存储节点容量充足,追踪器返回存储节点的ip端口,客户端连接存储节点,将文件发送给存储节点。
客户端下载文件:也是先问追踪器
追踪器集群:用多个追踪器,轮询工作,避免单点故障
存储节点集群:横向扩容(增加新的组,容量增加),纵向扩容(新主机增加到已有的组中,冗余备份)
fastDFS配置文件
配置文件默认位置: /etc/fdfs
-
tracker 配置文件
# 将追踪器和部署的主机的IP地址进程绑定, 也可以不指定 # 如果不指定, 会自动绑定当前主机IP, 如果是云服务器建议不要写 bind_addr=192.168.247.135 # 追踪器监听的端口 port=22122 # 追踪器存储日志信息的目录, xxx.pid文件, 必须是一个存在的目录 base_path=/home/yuqing/fastdfs
-
storage 配置文件
# 当前存储节点对应的主机属于哪一个组 group_name=group1 # 当前存储节点和所应该的主机进行IP地址的绑定, 如果不写, 由fastdfs自动绑定 bind_addr= # 存储节点绑定的端口 port=23000 # 存储节点写log日志的路径 base_path=/home/yuqing/fastdfs # 存储节点提供的存储文件的路径个数 store_path_count=2 # 具体的存储路径 store_path0=/home/yuqing/fastdfs store_path1=/home/yuqing/fastdfs1 # 追踪器的地址信息 tracker_server=192.168.247.135:22122 tracker_server=192.168.247.136:22122
-
客户端配置文件
# 客户端写log日志的目录 base_path=/home/yuqing/fastdfs # 要连接的追踪器的地址信息 tracker_server=192.168.247.135:22122 tracker_server=192.168.247.136:22122
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf ./test.txt
一、直接改写fdfs_upload_file.c
//将函数参数这样改写
/*
参数:client配置文件路径,要上传文件的路径,传出参数fildID
*/
int upload_file1(const char* confFile, const char* myFile, char* fileID)
二、使用多进程的方式实现
1.创建匿名管道
int fd[2];
int ret = pipe(fd);//fd[0]为读端,fd[1]为写端
2.创建子进程
子进程调用fdfs_upload_file上传文件,将返回值fileID写入管道
pid_t pid = fork();
if(pid == -1)//子进程:执行上传,将结果写入管道
{
dup2(fd[1], STDOUT_FILENO);//将输出文件描述符重定向到管道写端
close(fd[0]);//关闭管道读端
//执行命令
//要执行的文件名 //占位随便写 //fdfs_upload_file()的参数 //最后必须写一个NULL
execlp("fdfs_upload_file", "xxx", confFile, uploadFile, NULL);
perror("execlp error");//如果上面执行成功,改行就不会被执行到
}
父进程读管道,并回收已结束的子进程资源
else//父进程:读管道
{
close(fd[1]);
read(fd[0], fileID, size);
//回收子进程pdb
wait(NULL);
}
三、测试代码
main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "fdfs_upload.h"
int main(int argc, const char* argv[])
{
char fileID[1024] = {0};
upload_file1("/etc/fdfs/client.conf", "main.c", fileID);//上传main.c,
printf("fileID:%s\n", fileID);
printf("================\n");
upload_file2("/etc/fdfs/client.conf", "main.c", fileID, sizeof(fileID));
printf("fileID:%s\n", fileID);
}
首先要启动追踪器和存储节点
fdfs_trackerd /etc/fdfs/tracker.conf
fdfs_storaged /etc/fdfs/storage.conf
确认是否启动成功
ps aux|grep fdfs_
book 6636 0.0 0.0 146464 2300 ? Sl 22:49 0:00 fdfs_trackerd /etc/fdfs/tracker.conf
book 6793 0.0 0.0 82976 3464 ? Sl 22:50 0:00 fdfs_storaged /etc/fdfs/storage.conf
book 6877 0.0 0.0 14432 1100 pts/5 S+ 22:51 0:00 grep --color=auto fdfs_
编译程序
gcc *.c -I/usr/include/fastdfs -I/usr/include/fastcommon -lfdfsclient
运行结果
group1/M00/00/00/wKjohGS_Ow-APPmXAAAB9UADL_o12999.c
fileID:group1/M00/00/00/wKjohGS_Ow-APPmXAAAB9UADL_o12999.c
================
fileID:group1/M00/00/00/wKjohGS_Ow-APPmXAAAB9UADL_o12999.c
fileID:group1/M00/00/00/wKjohGS_Ow-APPmXAAAB9UADL_o12999.c
下图可以看到,文件确实上传到了存储节点上
book@100ask:~/yxfastdfs/storage/data/00/00$ ls
wKjohGS41yWAYpzdAAAAP6-7kx419886.c wKjohGS_Ow-APPmXAAAB9UADL_o12999.c
wKjohGS_OeuAbY60AAAB6T_sW7I73143.c wKjohGS_OXuAY49PAAAB6T_sW7I42849.c