本文共 6097 字,大约阅读时间需要 20 分钟。
**对应分布式文件系统来讲,大致有中心节点,无中心节点两种,
有中心节点的,中心节点是用来保存,提供元数据服务的,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上转载地址:http://vdkgn.baihongyu.com/