FastDFS文件上传详细步骤

介绍

fastDFS是一个开源的分布式文件系统框架,实现了冗余备份、负载均衡、线性扩容等机制,可以很方便的用来搭建图床、网盘。
该框架包含3个角色:追踪器、存储节点、客户端。
客户端上传文件:客户端连接追踪器,询问它哪个存储节点容量充足,追踪器返回存储节点的ip端口,客户端连接存储节点,将文件发送给存储节点。
客户端下载文件:也是先问追踪器
追踪器集群:用多个追踪器,轮询工作,避免单点故障
存储节点集群:横向扩容(增加新的组,容量增加),纵向扩容(新主机增加到已有的组中,冗余备份)

fastDFS配置文件

配置文件默认位置: /etc/fdfs

  1. tracker 配置文件

    # 将追踪器和部署的主机的IP地址进程绑定, 也可以不指定
    # 如果不指定, 会自动绑定当前主机IP, 如果是云服务器建议不要写
    bind_addr=192.168.247.135
    # 追踪器监听的端口
    port=22122
    # 追踪器存储日志信息的目录, xxx.pid文件, 必须是一个存在的目录
    base_path=/home/yuqing/fastdfs
    
  2. 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 
    
  3. 客户端配置文件

    # 客户端写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

fastdfs的client源代码

//将函数参数这样改写
/*
参数: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
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值