FastDFS原理及维护,真的过时了吗?都用云存储了?评论吐糟交流
suiw9 2024-11-17 15:49 49 浏览 0 评论
fdfs是一个开源分布式存储解决方案,整个集群节点分为storage和tracker
- storage真正的存储文件的节点,集群中可以有很多个storage节点,每个节点都是平级的,互为备份。
- tracker负责协调和管理整个集群,集群中可以有多个tracker,它们都是平级的,为了提高系统的稳定性和吞吐量,建议部署多个tracker。
集群关系
- 多个(M)tracker对应多个(N)storage,一般M<N,当然为了节约服务器资源,一台机器上可以既有tracker也有storage存在;
- storage属于最基本的存储单元,每个storage隶属于一个group,每个group可以有很多storage,在同一个group的storage他们互为副本,存储的文件都是一样的;正因为它们互相备份,所以group的存储能力,取决于group里面的storage的最小存储能力。
- 集群的存储能力由集群中group的数量决定,而group的存储能力是由storage的data目录的存储能力,也就是挂载的磁盘的大小决定,当然这个存储路径可以写多个,可以挂载多个磁盘,但是同一group的storage配置的data目录的路径数量必须一致,也就是不能有的配置了一个存储路径,有的配置了多个存储路径,由此看来,storage的存储能力进而也会影响着整个集群的存储能力。
- 集群扩容,可以根据项目需求,增加group的数量或者增加storage的存储能力(磁盘扩容或者增加存储磁盘目录),前者相对较简单,后者相对比较难,需要为同group的每个storage扩容。
上传流程
- 客户端根据自己持有的tracker server地址,轮询向tracker发送上传请求,每个tracker都是一样的,tracker根据每个group的存储能力以及group内storage的上传策略,选择一个storage返回给客户端。
- 客户端直接和返回的storage建立连接上传文件,storage存储文件并返回文件的id,这个id其实是这个文件在这个服务器的存储路径。
- 服务器接收到文件的时候先对文件生成新的名字,生成策略会加入本机的IP地址、时间戳、文件大小等信息,然后得到一个字符串就是文件名,然后再把这个文件名按照一定的算法得到一级目录和二次目录,最后拼上刚才的文件名就是返回给客户端的id;可以看到上传后不会保存文件的原始名,所以想保存文件的原始名的话,最好和上传后得到的id一块保存,以便需要的时候做展示。
- 服务器在完成自己文件存储后,会向同group的其他storage同步刚才上传的文件。
下载流程
- 客户端拿着文件id去请求tracker要进行文件下载,tracker根据拿到的id解析出此文件被上传的原始storage,然后根据负载均衡策略和原始storage和其他节点的同步进度,返回一个合适的可以下载文件的节点。
- 客户端和返回的storage节点建立连接下载文件。
新storage节点加入
- storage启动后,向配置的tracker注册自己,然后向tracker询问自己从哪个机器同步数据。
- tracker收到请求后根据当前组内的机器状态分配一台ACTIVE的storage,加上当前的时间戳一块返回新加入节点;并且在本地记录该信息,同时将新机器状态设置成WAIT_SYNC。
- 新节点收到返回的源storage和时间戳,记录到data/.data_init_flag文件的sync_src_server和sync_until_timestamp两个字段,并且将sync_old_done字段更新成1,表示已完成获取源主机的操作。
- 由于其他的storage在不断的和tracker保持心跳,在心跳过程中得知新加入的节点以及对应的源storage节点、同步截至时间,然后检查自己是不是对应的源storage节点;
- 如果不是,将信息写入到“新加入节点IP_端口号.mark”文件之中,其中need_sync_old=0,sync_old_done=0,util_timestamp = 源同步截止时间。然后等待新加入节点状态变更为ACTIVE,然后同步本机此时间戳以后的源文件,注意这个同步只同步此节点作为源的文件,也就是时间戳以后binglog文件中对应的大写操作符的文件。
- 如果是的话,则将信息写入到“新加入节点IP_端口号.mark”文件之中,其中need_sync_old=1,sync_old_done=0,util_timestamp = 查询到的源同步截止时间,并请求tracker将新加入节点的状态设置成SYNING;然后启动一个线程从头开始读取binlog文件,同步时间戳之前的全部文件给新加入节点,同步过程中也会记录最后同步的binlog的offset,假如宕机了,下次启动后也可以根据offset继续进行同步。
- 当源节点同步完成的时候,请求Tracker将新加入节点状态设置成OFFLINE,此时源同步完成。
- 在下一个心跳中,tracker会将新加入节点状态设置成ACTIVE,此时新机器加入完毕。
取巧:如果新增副本节点B,可以先人工选择一节点A作为拷贝源,把A节点自身的data/sync目录下的同步时间比较相近(也就是偏移量最大)的mark文件复制一份为B_port.mark,同时把同group的其他storage的data/sync/A_port.mark文件复制一份为B_port.mark,然后把A节点的数据手动复制到B节点,然后启动B节点,最后让节点之间自动完成最近的增量同步,这样效率会比较高,因为节点间的单线程同步太慢。
新增加tracker
如果新增加一台tracker server,storage server连接该tracker server,发现该tracker server返回的本组storage server列表比本机记录的要少,就会将该tracker server上没有的storage server同步给该tracker server。
fdfs空间扩容
在集群创建初期,集群的存储能力肯定是有限的,那么随着业务的增长,fdfs的空闲空间肯定会越来越小,如果剩余空间小于磁盘的10%(默认)的话,就会导致上传异常(errno code:28)不能再继续往集群中上传文件,由于上传失败会导致大量的重试,最糟糕的情况就是大量的上传重试导致集群崩溃,此时本能正常提供读取文件的服务也会收到影响。如果说很不幸,你们的磁盘没有做 LVM的话,那么就不能在线扩容磁盘空间,所以能做的只有增加group数量或者同时增加group内的storage的数据存储目录Path,这样的话需要为每台机器新增加一块磁盘。
fdfs数据迁移
- 如果迁移后,机器IP不变的话,那很好弄,就像关机开机一样简单。
- 如果说迁移后IP发生了变化,默认安装,那么需要注意,tracker server上需要调整的文件data/storage_groups_new.dat,data/storage_servers_new.dat,data/storage_sync_timestamp.dat;在数据复制到新机器后,需要在新机器storage上更改.data_init_flag文件,把sync_src_server置空。另外把属于同一group的其他storage的data/sync目录下对应的“迁移前IP_端口号.mark”这个文件改为“迁移后IP_端口号.mark”,然后重启迁移后的机器就可以了。
- 如果IP变化,采用自定义server ID模式安装,那么只需要修改stroage_ids.conf文件(据说未验证)
fdfs的最早时间原则
假如group1下面有3个storage,一个文件F被上传到As,如果配置的下载策略是轮询的话,那么被轮询的s怎么确定已经同步到了F呢?
每个s会定期告知tracker,自己往其他节点上已经同步的文件时间戳,这个时间戳列表存在tracker的/data/storage_sync_timestamp.dat文件中。前面说了,从文件的Id可以解析出源s以及文件的上传的时间戳等信息,那么如果说往其中一个节点上同步的时间戳大于接续出来的时间戳,那么就可以肯定这个文件肯定在这个节点上,进而可以通过轮询负载服务器压力。
fdfs常见的文件说明(非配置文件)
data/.data_init_flag这个文件在s节点加入的时候创建;
storage_join_time=1000000000 #节点加入的时间
sync_old_done=1 #表示已完成获取源主机的操作
sync_src_server= #已获取源主机IP
sync_until_timestamp=0 #源s同步此时间戳之前的全量文件
data/sync/IP_Port.mark
binlog_index=2 #已经同步到的binlog index
binlog_offset=986836772 #同步的偏移量
need_sync_old=1 #是否需要全量同步
sync_old_done=1 #是否已完成全量同步
until_timestamp=1483511493 #全量同步的截至时间
scan_row_count=53124322 #扫描多少行binglog
sync_row_count=9180742 #同步多少行binlog
欢迎大家点赞评论关注收藏转发,关注微信公众号:芝麻技术栈
相关推荐
- 俄罗斯的 HTTPS 也要被废了?(俄罗斯网站关闭)
-
发布该推文的ScottHelme是一名黑客,SecurityHeaders和ReportUri的创始人、Pluralsight作者、BBC常驻黑客。他表示,CAs现在似乎正在停止为俄罗斯域名颁发...
- 如何强制所有流量使用 HTTPS一网上用户
-
如何强制所有流量使用HTTPS一网上用户使用.htaccess强制流量到https的最常见方法可能是使用.htaccess重定向请求。.htaccess是一个简单的文本文件,简称为“.h...
- https和http的区别(https和http有何区别)
-
“HTTPS和HTTP都是数据传输的应用层协议,区别在于HTTPS比HTTP安全”。区别在哪里,我们接着往下看:...
- 快码住!带你十分钟搞懂HTTP与HTTPS协议及请求的区别
-
什么是协议?网络协议是计算机之间为了实现网络通信从而达成的一种“约定”或“规则”,正是因为这个“规则”的存在,不同厂商的生产设备、及不同操作系统组成的计算机之间,才可以实现通信。简单来说,计算机与网络...
- 简述HTTPS工作原理(简述https原理,以及与http的区别)
-
https是在http协议的基础上加了一层SSL(由网景公司开发),加密由ssl实现,它的目的是为用户提供对网站服务器的身份认证(需要CA),以至于保护交换数据的隐私和完整性,原理如图示。1、客户端发...
- 21、HTTPS 有几次握手和挥手?HTTPS 的原理什么是(高薪 常问)
-
HTTPS是3次握手和4次挥手,和HTTP是一样的。HTTPS的原理...
- 一次安全可靠的通信——HTTPS原理
-
为什么HTTPS协议就比HTTP安全呢?一次安全可靠的通信应该包含什么东西呢,这篇文章我会尝试讲清楚这些细节。Alice与Bob的通信...
- 为什么有的网站没有使用https(为什么有的网站点不开)
-
有的网站没有使用HTTPS的原因可能涉及多个方面,以下是.com、.top域名的一些见解:服务器性能限制:HTTPS使用公钥加密和私钥解密技术,这要求服务器具备足够的计算能力来处理加解密操作。如果服务...
- HTTPS是什么?加密原理和证书。SSL/TLS握手过程
-
秘钥的产生过程非对称加密...
- 图解HTTPS「转」(图解http 完整版 彩色版 pdf)
-
我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取。所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。...
- HTTP 和 HTTPS 有何不同?一文带你全面了解
-
随着互联网时代的高速发展,Web服务器和客户端之间的安全通信需求也越来越高。HTTP和HTTPS是两种广泛使用的Web通信协议。本文将介绍HTTP和HTTPS的区别,并探讨为什么HTTPS已成为We...
- HTTP与HTTPS的区别,详细介绍(http与https有什么区别)
-
HTTP与HTTPS介绍超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的...
- 一文让你轻松掌握 HTTPS(https详解)
-
一文让你轻松掌握HTTPS原文作者:UC国际研发泽原写在最前:欢迎你来到“UC国际技术”公众号,我们将为大家提供与客户端、服务端、算法、测试、数据、前端等相关的高质量技术文章,不限于原创与翻译。...
- 如何在Spring Boot应用程序上启用HTTPS?
-
HTTPS是HTTP的安全版本,旨在提供传输层安全性(TLS)[安全套接字层(SSL)的后继产品],这是地址栏中的挂锁图标,用于在Web服务器和浏览器之间建立加密连接。HTTPS加密每个数据包以安全方...
- 一文彻底搞明白Http以及Https(http0)
-
早期以信息发布为主的Web1.0时代,HTTP已可以满足绝大部分需要。证书费用、服务器的计算资源都比较昂贵,作为HTTP安全扩展的HTTPS,通常只应用在登录、交易等少数环境中。但随着越来越多的重要...
你 发表评论:
欢迎- 一周热门
-
-
Linux:Ubuntu22.04上安装python3.11,简单易上手
-
宝马阿布达比分公司推出独特M4升级套件,整套升级约在20万
-
MATLAB中图片保存的五种方法(一)(matlab中保存图片命令)
-
别再傻傻搞不清楚Workstation Player和Workstation Pro的区别了
-
Linux上使用tinyproxy快速搭建HTTP/HTTPS代理器
-
如何提取、修改、强刷A卡bios a卡刷bios工具
-
Element Plus 的 Dialog 组件实现点击遮罩层不关闭对话框
-
日本组合“岚”将于2020年12月31日停止团体活动
-
SpringCloud OpenFeign 使用 okhttp 发送 HTTP 请求与 HTTP/2 探索
-
tinymce 号称富文本编辑器世界第一,大家同意么?
-
- 最近发表
- 标签列表
-
- dialog.js (57)
- importnew (44)
- windows93网页版 (44)
- yii2框架的优缺点 (45)
- tinyeditor (45)
- qt5.5 (60)
- windowsserver2016镜像下载 (52)
- okhttputils (51)
- android-gif-drawable (53)
- 时间轴插件 (56)
- docker systemd (65)
- slider.js (47)
- android webview缓存 (46)
- pagination.js (59)
- loadjs (62)
- openssl1.0.2 (48)
- velocity模板引擎 (48)
- pcre library (47)
- zabbix微信报警脚本 (63)
- jnetpcap (49)
- pdfrenderer (43)
- fastutil (48)
- uinavigationcontroller (53)
- bitbucket.org (44)
- python websocket-client (47)