2019/07/09 fastdfs原理及应用(04)

**对应分布式文件系统来讲,大致有中心节点,无中心节点两种,
有中心节点的,中心节点是用来保存,提供元数据服务的,name node,其他节点称为data node,storage 节点,主要是用来存储数据的,
fastdfs依然属于这套 逻辑,也是一样有中心节点,一部分沿袭了mogilefs的用法,也就是中心节点叫tracker,其他节点叫存储节点,也可以理解为storage node(storage server)
与mogilefs不同的在于,
第一 ,元数据再tracker 上不做任何存储,元数据是靠storage server报告生成的每一个storage server都会把自己所持有的数据,元数据信息,报告给每一个tracker ,tracker而后存储在内存中,从而能向客户端提供元数据服务,如果tracker宕机了,下一次启动起来后,storage server 会周期性的报告的,还会再重新生成 ,因此本地不需要保存任何信息,也不需要追踪任何信息,
**在这里插入图片描述
为什么报告能生成,因为对于storage server而言,采用了非常精巧的存储格式,每一个storage node,不会在文件级和上一级做冗余,而是在节点级做冗余
意味着每一个服务器都是由一主一从(其实没有主从之分,只是这么称呼)有两个节点是用来存一模一样的数据,就叫镜像节点,两个主机是做的镜像的,可以存在任何一台主机上,都会把数据同步到另外一个主机上,所以从这个角度上,可以叫多主集群模型

在这里插入图片描述
在节点级完成镜像,称为节点镜像,这样两个节点存放的数据都是一模一样的,
数据如何分布,类似raid10 这样的服务器组多做几组
每一组是一个镜像,把镜像再做成条带,类似这种模式
所以真正数据存储是,大体是发给 storage cluster,存储集群,这个集群内部完全类似raid10的状态,每一组是一个镜像,存储数据时,有前端节点,来帮忙去选择(根据磁盘IO状态),选择一组来存,存在任何一个节点上,另外的节点都会同步数据,所以每一组坏一个节点是没有问题的
但是如果同一主机全坏了,数据就丢失了,那就每一组做三个节点也可以,所以每一组在不停地报告自己的信息给tracker,tracker不停地在更新信息,tracker根据你报告的信息来确定,到底使用哪种方式更高效,(tracker节点根据每一组服务器对于的服务器本身负载状态,可用空间等很多的,来选择一个组
如第一组空间少,第二组空间多,再存服务器就可能选择第二组,
读一般是轮询,
所以它的读和写一般有不同的工作逻辑

在这里插入图片描述
为什么能收取每一个storage server报告的信息,来生成文件路径,因为每一个文件名都很独特,也是有FID组成,但它的FID 隐含了路由信息,group组名,每一组服务器当中的每一个节点都应该可以存在不止一个设备,不管节点如何,在另外一个节点,也要存在对等的设备,一组内的设备可能也不止一个,这个设备只对一个节点有效,其他节点因为是镜像,真正的存储空间由一个存储节点来决定的,
设备用M来编号+数字 M01表示第一组设备,
后面就是文件了,每一个文件,都会做hash运算,以文件内容为例,有hash码,(缓存逻辑,因为需要快速找到文件,对文件做哈希运算,去文件后2为做一级子目录,再取2位做二级目录,再取2位做3级目录)
因此每个文件,每个节点向tracker报告自己上面所持有的文件ID号,文件在哪里一目了然
如果用户访问的是按照FID访问,驱动就应该知道访问的FID的文件在哪里
所以基于报告完全可以生成元数据信息,能完成文件路由的

在这里插入图片描述
那么如何存,有多个tracker,这些tracker就没有主次之分了,每一个节点都一样,storage cluster会周期性地报告,整个集群所持有的整个文件信息报告至每一个tracker,所以每个tracker都是根据这个来生成的,它们彼此之间不需要做任何同步,而且无所感知的,所以客户端找任何一个tracker节点,都没有任何区别。
因此假如用户想要上传文件,找任何一个tracker节点都可以,tracker节点接收上传请求时:
第一从这个多个组里找一组,找组的方式一般有:轮循(第一个文件存第一组,第二个文件存第二组),
第二指定必须存在某个组上,但这样有可能岛主数据不均衡
第三,还可以使用基于空间,来做所谓的优先选择,哪一组服务器的空间,剩余的多,就选谁,这样就达到均衡的目的,
三种挑选方式,从众多的组中,挑选其中一组来满足我们的存储需要

在这里插入图片描述
tracker如何挑选组:
1、rr
2、指定组
3、基于可用空间进行均衡,可用空间大者胜出;

在这里插入图片描述
**Upload File:
一、由client发起上传连接请求;
二、由tracker查找可用的storage server;(从组中选一个server给客户端,一个组中有多台服务器,该如何选择
1.轮循rr,无论存谁都要镜像对方的
2.基于ip排序 谁ip小就找谁(没什么意义说白 ,找一个服务器固定的)
3.可以根据优先级,可以自己设定优先级高低) **
在这里插入图片描述
选择好server以后,每一组服务器的每一个server上,有可能会有多个设备,有两块硬盘,第一块叫M00,第二块叫M01,第三个叫M02
假如有三块硬盘,该存设备中的哪一个,还需要选,无非:
1.轮循(在目录间轮循)
2.多个设备剩余存储空间可能不一样,根据剩余空间来选定,谁剩余空间多,就选谁
**
在这里插入图片描述
** 三、找到可用的storage server后,将其(ip:port)返回给client;
四、上传文件(文件的属性信息和文件内容);
五、生成文件的fid,将client提交的内容写入选定位置;
六、返回fid;
七、同步 存储文件信息至同组中的其它节点;

在这里插入图片描述
生成的Fid不是有文件名来决定的,是综合计算了,storage server ip(真正存储数据的服务器ip)、创建时的时间戳、大小、文件的校验码和一个随机数进行hash计算后生成;
文件名字隐含了这么多信息,对这写二进制编码,基于base64编码格式,转换为字符串
生成FID以后就要放在子目录中了,对于fastdfs来讲一般都使用两级子目录,每一级就使用两位16进制字符表示,这两个16进制字符就是按照文件的FID来做路由的
最终生成一个文件名
在这里插入图片描述
在任何一个server上把文件存完以后,要镜像同步同一组主机的其他节点上,可以理解为,每一个节点存完以后会生成一个二进制日志,这个binlog作用是向另外一个节点同步

这是写文件
读文件该如何

在这里插入图片描述
Download File:
客户端上传文件完成后,会收到storage server返回的FID,而后再次用到时,client会可根据此文件路径发出请求;
1、client向tracker发请求;
2、tracker根据文件名定位到group(因为文件名包含组信息),并返回此group内的某一个storage server的信息(ip:port)给client;
3、client向得到的ip:port发请求;
4、storage server查找文件,并返回其内容给client;

客户端发送请求,到任何tracker都可以,tracker根据FID,知道哪个组,从这个组内,根据你的算法,挑选一个服务器,轮循,或者(找源头服务器,第一次存哪里,就找哪里,可以找存储时的源头服务器)
这是读取 文件,有两种常见操作方式,
这就是fastDFS的工作逻辑

在这里插入图片描述
fastdfs还是有一些问题的,要么存储一份,存储系统就直接告诉客户端存储成功,到底存几份,每一个副本生成,是要有同组内的服务器自己来决定的,万一没有做到,客户端对此是一无所知的。
还有,每一个节点所能够存的文件,受本地文件系统上的inode文件数量的限制,也缺乏自动划分机制。磁盘故障只能人工介入还磁盘,因为是在节点级冗余的,节点级冗余的问题就是磁盘故障了,就没办法做别的操作了,
数据恢复效率很低,只能从其他村的storage来读,基于镜像方式的,而且没有机架感知功能,无法实现异地容灾,不支持多机房,而raidfs支持多机房
将来可以研究下seaweedfs原生就支持都机架,支持异地机房,依赖于go环境来运行

fastdfs来讲,负载均衡都很简单
轮循,ip地址,优先级,空间等,而不是根据IO什么的来轮循的,这大概是fastdfs的工作逻辑,因此要配置使用一个fastdfs,最起码需要有6个节点,
1.tracker要冗余,要2个
2.至少有两组才有意义,实现做分布式的意义,每一组都有镜像
所以至少有四个存储节点来确保整个集群能工作起来,所以不妨做4个节点,把tracker节点部署在存储server上,

在这里插入图片描述
fastdfs依赖于下面的模块
在这里插入图片描述
有两个角色,storage和tracker,也是web服务,它的web服务是自带的,这个web服务功能不够强大,因此可以让nginx对它的web服务做反代,这样可以支持更多的并发量在这里插入图片描述
对fastdfs而言,tracker没有什么关系,每一个stroage节点上都是一个storage服务器,web服务器性能可能比较薄弱,可以在每一个节点上安装nginx,反代用户请求对本地的fastdfs文件的访问,但是这个fastdfs反代时,不是http协议而是fastdfs协议,因此这个nginx,要想在每一个节点上反代,就需要打补丁,fastdfs-nginx-module
每一个节点都需要打补丁,装好以后来使用
(mogilefs可以在前端做个透传的反代方式,但是fastdfs没有这个功能,只能使用API)

在这里插入图片描述
在这里插入图片描述
准备4个节点node1,2,3,4
选两个当tracker
4个storage

节点时间需要同步,先取克隆libfastcommon
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

还需要克隆第二个源码fastdfs程序自己的
在这里插入图片描述
利用spec文件很容易做出来rpm包
在这里插入图片描述
把所谓的编译开发环境准备好,把源代码文件准备好,放在特定路径下,就可以了
在这里插入图片描述
在这里插入图片描述
做成rpm就可以让另外三个节点不用编译了
要把目录转为带版本格式的
创建成一个归档的tar压缩包
挪到特定的文件夹
rpmbuld 做一个rpm包 -bb做成2进制格式的rpm包 -ba做成源码包

在这里插入图片描述这里就是制作好的rpm包
在这里插入图片描述
因为依赖关系,先要编译安装这个才能安装第二个
在这里插入图片描述
在这里插入图片描述
方法一样 也需要把fastdfs做成rpm包
在这里插入图片描述
在这里插入图片描述
编译的时候要依赖这个包
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
直接本地安装,34节点也一样 安装
在这里插入图片描述
这样做成rpm的时候有个问题,你所做的rpm可能并不包含源码目录所存在的文件
在这里插入图片描述
这边没有storage是因为node1还没有安装
在这里插入图片描述
配置文件,是样例配置文件,/etc/fdfs是放配置文件的路径
在这里插入图片描述
在这里插入图片描述http://www.178linux.com/78105
在这里插入图片描述
在这里插入图片描述
查看需要修改的配置项,tracker可能需要本地存放一些临时文件,默认放在base_path,可以指定一个
在这里插入图片描述
在这里插入图片描述tracker可能需要本地存放一些临时文件,默认放在base_path,可以指定一个,serverport就是本地http服务监听端口,
到5.几以后,我们的主机就不提供http服务了
port标错了

在这里插入图片描述
在这里插入图片描述
存储文件时存储到哪一个文件里,group2,第二组,
挑选组的方式有
0.轮询
1.指定组
2.负载均衡
如果选择1底下的组2就有用
在这里插入图片描述
在组里怎么挑服务器,依然时三种算法
0.轮询
1.ip地址小的
2.权重大的 数字越小权重越大
server上可能有多块硬盘,如何挑
0.轮询
2.谁的空间大就使用谁,
默认是0
download _server 就是读的server(读请求发到tracker,tracker进入到组以后,要选一个server
0,0轮询
1.0上传文件第一次挑哪个服务器,读就从哪个读)

在这里插入图片描述
整个存储空间要保留多少事预留的
run _by_group/user 最好把运行进程换一个普通用户,不修改,默认就以当前用户

在这里插入图片描述

*allowhosts 做访问控制的,表示所有主机(存储在网络中,应该只是面向自己的前端主机提供服务的)
在这里插入图片描述
slot 最小,最大,复制单元
在这里插入图片描述
现在tracker节点就配置好了
可以写一个脚本做unitfile

在这里插入图片描述
**我们也可以直接用脚本启动
**

在这里插入图片描述

nginx反代tracker是不需要打补丁的,直接让nginx反代即可
在这里插入图片描述
在这里插入图片描述
node1当作tracker
1234当作storage server,
12一组,34一组
配置完一个复制到其他节点基本就ok

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上面都不用改,主要是底下的base——path,基础路径
在这里插入图片描述
但是存数据的是另外一个路径
storage_path0表示第0个来存数据的目录storage的path1表示第一个来存数据的目录,有几个磁盘设备就应该有几个path
一般做分布式存储会有专门的做第二块第三块硬盘,每一个硬盘都可以做单独的分区挂载即可
对于路径必须要存在
1节点既是tracker又是storage,放在同一路径可能冲突,以免跟程序运行的目录所冲突,必须从0开始计数
store_path_count=一共有几个存储设备

在这里插入图片描述
定义 每一个子目录下有多少个2级子目录,定义为256个,所以在这个路径下会创建子目录的
tracker_server 指明tracker主机地址,现在我们只有一个

在这里插入图片描述
tracker一般和storage不会在同一节点上,否则有可能冲突
在这里插入图片描述
好像我们没有端口的说法,没监听什么端口
在这里插入图片描述虽然看上去正常,但是没启动起来
在这里插入图片描述
应该是监听在23000端口的
在这里插入图片描述
排错看看,注意创建storage在这里插入图片描述
在这里插入图片描述
目录创建好了,服务已经运行起来了
在这里插入图片描述
其他节点也一样需要启动服务,配置文件复制过去
在这里插入图片描述
在每一个节点上,
第一创建目录

按道理这个目录是用来存数据的
在这里插入图片描述
每个节点创建目录
在这里插入图片描述
在这里插入图片描述
修改groupname
node4也需要修改成2
等于两个节点,一个group1,一个group2

在这里插入图片描述
要创建65342个目录才真正启动起来
在这里插入图片描述
3,4节点也一样起来
在这里插入图片描述
在storage 日志中查看是否能正常启动
在这里插入图片描述
客户端也需要自己的配置文件
就把tracker节点当做自己本地客户端好了

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
改了以后就可以使用fdfs命令指明基于哪个配置文件来完成一些设定了
在这里插入图片描述
上传文件 uoload_file,不支持修改,只能本地改了之后再上传,不过支持appender
在这里插入图片描述
每一个storage节点应该通过某个API来提供服务,
这个hash中其实是包含了在哪个节点的,也可以用file info来查看信息,在69的节点上

在这里插入图片描述
如果有web服务,把这个对应的目录导出去即可
在这里插入图片描述
把这个路径做为root映射为刚才的M00路径
在这里插入图片描述
需要在主机上安装nginx并开启nginx反代服务
在这里插入图片描述
在storage。,就需要把fastdfs-nginx-module模块安装上 了,编译安装,补丁上模块
在69上有这个文件,在70同一个组上应该也有
会自动镜像同一组的storage上

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值