分布式系统学习第一天 fastDFS框架学习

目录

1. 项目架构图

1.1 一些概念

1.2 项目架构图

2. 分布式文件系统

2.1 传统文件系统

3. FastDFS

3.1 fastDFS介绍

3.2 fastDFS安装

3.3 fastDFS配置文件

3.4 fastDFS的启动

3.5 对file_id的解释

4. 上传下载代码实现

5. 源码安装 - 回顾


1. 项目架构图

1.1 一些概念

  1. 什么是服务器

    • 硬件: 一台配置高的电脑

    • 软件: 电脑必须有一个能够解析http协议的软件

    • https是在http基础上加了密, 在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性 , HTTPS 在HTTP 的基础下加入SSL,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL (Secure Socket Layer)安全套接层

  2. 常见的Web服务器

    • tomcat服务器

      • apache组织产品, 开源的免费服务器

    • weblogic 服务器

      • bea公司, 收费的服务器

      • 不交费, 访问量受限制

    • IIS服务器

      • Internet Information Server

      • 微软公司主推的服务器

    • nginx

      • 小巧且高效的HTTP服务器

      • 也可以做一个高效的负载均衡反向代理

      • 邮件服务器

        • pop3/smtp/imap

        • 一般需要配置接收和发送的地址

1.2 项目架构图

 

  1. 客户端

    • 网络架构:

      • b/s

        • 必须使用http协议,浏览器只能解析http

        • js 和 jquery处理请求

      • c/s

        • 协议可以随意选择

        • Qt -> http

  2. 服务器

    • Nginx

      • 能处理静态请求 -> html, jpg

      • 动态请求无法处理

      • 服务器集群之后, 每台服务器上部署的内容必须相同,集群可以解决更多的访问请求,一台服务器处理不了

    • fastCGI

      • 帮助服务器处理动态请求

  3. 反向代理服务器

    • 客户端并不能直接访问web服务器, 直接访问到的是反向代理服务器 好处:直接访问web服务器,每一个服务器有一个ip地址,通过反向代理服务器将多个请求分配给各个服务器。保证资源的平均分配,做到负载均衡。

    • 客户端将请求发送给反向代理服务器, 反向代理将客户端请求转发给web服务器

  4. 关系型数据库

    • 存储文件属性信息

    • 用户的属性信息

  5. redis - 非关系型数据库 (内存数据库)

    • 作用提出程序效率

    • 存储是服务器经常要从关系型数据中读取的数据

  6. FASTDFS - 分布式文件系统(不在同一个电脑上)

    • 存储文件内容

    • 供用户下载

2. 分布式文件系统

2.1 传统文件系统

 

  • 传统的文件系统格式:

    • ntfs / fat32 /linux下: ext3 / ext4

  • 可以被挂载和卸载

###2.2 分布式文件系统

文件系统的全部, 不在同一台主机上,而是在很多台主机上,多个分散的文件系统组合在一起,形成了一个完整的文件系统。

 

分布式文件系统:

  1. 需要有网络

  2. 多台主机

    • 不需要在同一地点

  3. 需要管理者

  4. 编写应用层的管理程序

    • 不需要编写 现在的分布式框架已经支持

3. FastDFS

3.1 fastDFS介绍

  1. fastDFS概述

    • 是用c语言编写的一款开源的分布式文件系统。

      • 余庆 - 淘宝的架构师

    • 为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,注重高可用、高性能等指标

      • 冗余备份: 纵向扩容

      • 线性扩容: 横向扩容

    • 可以很容易搭建一套高性能的文件服务器集群提供文件==上传、下载==等服务。

      • 图床(有的博客服务器不会保存图片,通过图床可以实现,如csdn)

      • 网盘

  2. fastDFS框架中的三个角色

    • 追踪器 ( Tracker ) - 管理者 - 守护进程(一个就够了)

      • 管理存储节点(服务器)

    • 存储节点 - storage - 守护进程

      • 存储节点是有多个的

    • 客户端 - 不是守护进程, 这是程序猿编写的程序

      • 文件上传

      • 文件下载

  3. fastDFS三个角色之间的关系

  • 上传的关系

 下载的关系

 

  1. 角色的步骤

    1. 追踪器

      • 最先启动追踪器

      • 追踪器负责监听存储节点 获取存储节点的信息

    2. 存储节点

      • 第二个启动的角色

      • 存储节点启动之后, 会单独开一个线程,和追踪器通信

        • 汇报当前存储节点的容量, 和剩余容量

        • 汇报数据的同步情况

        • 汇报数据被下载的次数

    3. 客户端

      • 最后启动

        • 上传

          • 连接追踪器, 询问存储节点的信息

            • 我要上传1G的文件, 询问那个存储节点有足够的容量

            • 追踪器查询, 得到结果

            • 追踪器将查到的存储节点的IP+端口发送给客户端

            • 通过得到IP和端口连接存储节点

            • 将文件内容发送给存储节点

        • 下载

          • 连接追踪器, 询问存储节点的信息

            • 问一下, 要下载的文件在哪一个存储节点

            • 追踪器查询, 得到结果

            • 追踪器将查到的存储节点的IP+端口发送给客户端

            • 通过得到IP和端口连接存储节点

            • 下载文件

  2. fastDFS集群- (了解即可) ​​​​​

    500G + 1.5T = 2T根据最小的 因为组间是相互备份的

    fastDFS集群实现方法

  3. 追踪器集群

    • 为什么集群?

      • 避免单点故障

    • 多个Tracker如何工作?

      • 轮询工作

    • 如何实现集群?

      • 修改配置文件

  4. 存储节点集群

    • fastDFS管理存储节点的方式?

      • 通过分组的方式完成的

    • 集群方式(扩容方式)

      • 横向扩容 - 增加容量

        • 添加一台新的主机 -> 容量增加了

        • 假设当前有两个组: group1, group2

          • 需要添加一个新的分组 -> group3

            • 新主机属于第三组

        • 不同组的主机之间不需要通信

      • 纵向扩容 - 数据备份

        • 假设当前有两个组: group1, group2

          • 将新的主机放到现有的组中

          • 每个组的主机数量从1 -> N

            • 这n台主机的关系就是相互备份的关系

            • 同一个组中的主机需要通信

            • 每组的容量 == 容量最小的这台主机

    • 如何实现?

      • 通过修改配置文件可实现

3.2 fastDFS安装

  1. fastDFS安装

    • libfastcommon-1.36.zip

      • fastdfs的基础库包

      • unzip xxx.zip //解压缩

      • ./make.sh

      • ./make.sh install

    • fastdfs-5.10.tar.gz

      • tar zxvf xxx.tar.gz

      • ./make.sh

      • ./make.sh install

  2.测试

#fastDFS安装的所有的可执行程序: 
/usr/bin/fdfs_*
fdfs_test  
#写到了path里面
# echo $path

3.3 fastDFS配置文件

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

client.conf.sample storage.conf.sample storage_ids.conf.sample tracker.conf.sample

tracker 配置文件

# 将追踪器和部署的主机的IP地址进程绑定, 也可以不指定
# 如果不指定, 会自动绑定当前主机IP, 如果是云服务器建议不要写
bind_addr=192.168.248.128
# 追踪器监听的端口
port=22122
# 追踪器存储日志信息的目录, xxx.pid文件, 必须是一个存在的目录 pid是进程文件存储的是追踪器的进程
base_path=/home/liu/fastdfs/tracker

storage 配置文件

# 当前存储节点对应的主机属于哪一个组 可能很多台主机 需要执行组
group_name=group1
# 当前存储节点和所应该的主机进行IP地址的绑定, 如果不写, 有fastdfs自动绑定
bind_addr=
# 存储节点绑定的端口
port=23000
# 存储节点写log日志的路径
base_path=/home/liu/fastdfs/storage
# 存储节点提供的存储文件的路径个数
store_path_count=2
# 具体的存储路径
store_path0=/home/liu/storage
store_path1=/home/liu/storage2
# 追踪器的地址信息
# 配置多个集群的消息 不同的ip地址对应不同的主机
tracker_server=192.168.248.128:22122 
tracker_server=192.168.248.129:22122 

客户端配置文件

# 客户端写log日志的目录
# 该路径必须存在
# 当前的用户对于该路径中的文件有读写权限
# 当前用户robin
# 指定的路径属于root
base_path=/home/liu/client
# 要连接的追踪器的地址信息
# 配置多个集群的消息
tracker_server=192.168.248.128:22122 
tracker_server=192.168.248.129:22122 

安装fastDFS安装包

一般这几个角色是在不同的主机上,恰好当前电脑要执行当前多个角色。需要在公网或者大的局域网上

3.4 fastDFS的启动

第一个启动追踪器 - 守护进程

# 启动程序在 /usr/bin/fdfs_*
# 启动
fdfs_trackerd 追踪器的配置文件(/etc/fdfs/tracker.conf.simple) 
# 关闭
fdfs_trackerd 追踪器的配置文件(/etc/fdfs/tracker.conf.simple)  stop
# 重启
fdfs_trackerd 追踪器的配置文件(/etc/fdfs/tracker.conf.simple) restart

#查看程序是否启动
ps aux | grep fdfs_*

#输出
liu        10098  0.0  0.0  72472  2984 ?        Sl   23:22   0:00 fdfs_trackerd /etc/fdfs/tracker.conf
liu        10179  0.0  0.0  12000   656 pts/3    S+   23:24   0:00 grep --color=auto fdfs_*
#启动之后会创建data 和 log文件夹
data 放pid

 第二个启动存储节点 - 守护进程

# 启动
fdfs_storaged 存储节点的配置文件(/etc/fdfs/stroga.conf.simple)
# 关闭
fdfs_storaged 存储节点的配置文件(/etc/fdfs/stroga.conf.simple) stop
# 重启
fdfs_storaged 存储节点的配置文件(/etc/fdfs/stroga.conf.simple) restart

#启动之后会创建data 和 log文件夹
data 里面创建了很多目录 00-F9 指定目录越多创建也越多

最后启动客户端 - 普通进程

# 上传
fdfs_upload_file 客户端的配置文件(/etc/fdfs/client.conf) 要上传的文件
# 得到的结果字符串: group1/M00/00/00/wKj3h1vC-PuAJ09iAAAHT1YnUNE31352.c
# 上传时的字符串需要保存下来 下载的时候需要用 group1/M00/00/00/wKj-gGSN1ryACAFnAAAUy_wDeLU12766.c
# 下载
fdfs_download_file 客户端的配置文件(/etc/fdfs/client.conf) 上传成功之后得到的字符串(fileID)
  1. fastDFS状态检测

    • 命令

      fdfs_monitor /etc/fdfs/client.conf
    • Storage Server的7种状态

      FASTDFS的STORAGE SERVER的状态问题_酷酷的糖先森的博客-CSDN博客

      STORAGE SERVER的状态通常有七种:

      # FDFS_STORAGE_STATUS:INIT      :初始化,尚未得到同步已有数据的源服务器
      # FDFS_STORAGE_STATUS:WAIT_SYNC :等待同步,已得到同步已有数据的源服务器
      # FDFS_STORAGE_STATUS:SYNCING   :同步中
      # FDFS_STORAGE_STATUS:DELETED   :已删除,该服务器从本组中摘除
      # FDFS_STORAGE_STATUS:OFFLINE   :离线
      # FDFS_STORAGE_STATUS:ONLINE    :在线,尚不能提供服务
      # FDFS_STORAGE_STATUS:ACTIVE    :在线,可以提供服务

发现有以下状态的服务器:

Storage 4:
        ip_addr = 10.120.151.114  WAIT_SYNC

经过各种重启都不解决问题,只好先删除,再加入

从集群中删除

fdfs_monitor /etc/fdfs/client.conf delete group1 10.120.151.114

在114服务器中,删除数据文件夹

rm -rf /home/storage1/fastdfs/data

重启114节点

fdfs_storaged /etc/fdfs/storage.conf

重新查状态

fdfs_monitor /etc/fdfs/client.conf

3.5 对file_id的解释        

 group1

    • 文件上传到了存储节点的哪一个组

    • 如果有多个组这个组名可变的

  • M00 - 虚拟目录

    • 和存储节点的配置项有映射

      • store_path0=/home/yuqing/fastdfs/data -> M00 store_path1=/home/yuqing/fastdfs1/data -> M01

      • 用户上传存储的实际路径

  • 00/00

    • 实际的路径

    • 可变的

  • wKhS_VlrEfOAdIZyAAAJTOwCGr43848.md

    • 文件名包含的信息

    • 采用Base64编码 用64个字符替代原始的长度 无论原来多长 可以进行还原

      • 包含的字段包括

        • 源storage server Ip 地址

        • 文件创建时间

        • 文件大小

        • 文件CRC32效验码

          • 循环冗余校验

        • 随机数

4. 上传下载代码实现

  1. 使用多进程方式实现

    • exec函数族函数 执行环境变量 解析指令

      • execl

      • execlp

    • 父进程

      • 子进程 -> 执行

        execlp("fdfs_upload_file" , "xx", arg, NULL), 有结果输出, 输出到终端 终端是看不到的

        • 不让它写到终端 -> 重定向dup2(old, new)

          • old-> 标准输出

          • new -> 管道的写端

          • 文件描述符

          • 数据块读到内存 -> 子进程

            • 数据最终要给到父进程

        • pipe -> 读端, 写端

          • 在子进程创建之前创建就行了

      • 父进程

        • 读管道 -> 内存

        • 内存数据写数据库

 

 

使用fastDFS API实现

把fdfs_upload_file读懂进行修改,将其修改为一个函数接口 后供自己调用即可

5. 源码安装 - 回顾

安装流程:

  1. 以下文件, 里边有安装步骤

    • readme

    • readme.md

    • INSTALL

  2. 找 可执行文件 configure

    • 执行这个可执行文件

      • 检测安装环境

      • 生成 makefile

  3. 执行make命令

    • 编译源代码

      • 生成了动态库

      • 静态库

      • 可执行程序

  4. 安装 make install (需要管理员权限)

    • 将第三步生成的动态库/动态库/可执行程序拷贝到对应的系统目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值