分布式blog系统 TFS总结
解决的问题
文件总量太大 一台服务器无法存放 只能放在网络集群中分节点存放 也就是通过屏蔽网络部分 形成一个“ one big CPU” 和 “one big disk” 。Client只需要向这个CPU去做read/write/mofity操作即可。但是对于业务的不同,也无法去满足满足通性,根据业务的不同设计不同的系统 效率比较高【个人见解】
TFS个人理解
因为在gfs的架构 影响后面的分布式系统的设计 中心节点和从节点 因为在做存储文件这块 gfs能够承受google业务 所以对于一般公司 只要按照这种架构设计和实现好 应该都能很好满足业务需求。
现在看看具体的TFS。先看下一个业务需求:有200亿图片要存入到一个系统中,系统能够很快的定为出来图片文件在哪里,并且可以支持读写操作。图片元信息假设64字节,200亿*64>1Tb 这个元信息都可以把一个主机磁盘塞爆,另外如果即时元信息放进去了 metadata不能把所有文件目录下的数据都缓存到内存中,查询很可能导致了要读3次磁盘,这点效率很低。看看TFS如何设计的:
文件系统所具备的基本信息
要通过一个文件系统寻找到相应的文件 需要知道文件的目录【延伸到文件在哪里】以及文件大小【要读多少个块】,OS才能从这个系统中读取出来。
核心机制
多个小文件共用一个物理文件。也就是通过调控这个物理文件大小 可以单台机子可以存放所有小文件的meta信息 使得这个不在成为瓶颈。所以得讨论出具体的TFS怎么做到这个共用?
物理文件我定义成Block 1~Block n. 大小为M兆。
图片文件名为picname,大小为pKB.TFS唯一64位编号为id.
tfs客户端通过请求NameServer写入一个小文件picname,NameServer分配一个TFS“内部文件名路径”给客户端,他就是指引你应该在哪里写文件。其实就一个文件名编码工作:
含有block id和file sequence id。核心东东,其实在master里维护的都是meta information。这样master通过调控block大小 来调控整个TFS集群所能支持的一个文件数量。屏蔽内部写的情况,如果TFS写入成功,这个返回出来的这个信息要和一般的文件对应呢?需要有一个数据库记录这2者之间的关系。所以说还得要有数据库来记录这些文件所在的位置。kv系统在合适不过。
现在来看看我们的master里存储了啥: 现在对于master而言 就是一个一个block信息块,可以map<blockid,metea>来存储查找元信息。这样master的内存不足部分解决了。对于client无论是读还是写 都要都只要请求master的block id和offset。如果客户端缓存的话,就直接去相应的DataServer找。所以呢 这点设计还是非常好。
读过程就非常明显了:tfs_file ----------->block_id---->meta信息----> block id和file offset 去找到相应的文件位置 然后读出来。这样读性能应该还是比较高的。
现在来看看写过程:
有几个点:写操作对于tfs而言 所一个单线程模型结构,所有的写操作都会排队 一个接着一个的写,不能并发写。这样设计他应该是认为写毕竟是少数时候 而多数时候都是读 所以慢没有很大的影响。实现起来会比较方便。 这里的DataServer(master)就用于和nameserver交流控制信息。Nameserver交互比较多,会拖慢nameserver速度。然后复制的时候的策略就是master和dataserver replication。等所有步骤都完成了才会向客户端发送写成功。中间一个操作挂了 就重新写。代价还是蛮高的。
TFS容错机制 容灾 扩容
一个集群机里 如果DATAserver容量不够了 自动扩容按理来说也是非常合理的事情,同样 一台主机节点挂了,他的复制品按理来说应该会把内容写入到其他的主机上,通过master的寻找自动处理这种机制。这些内容是靠maseter来做的,同样master和备用master应该是同一复制品。master挂了 也可以自动切换。这点还是非常重要的,但比较简单,有一点主master和备用master应该采用同步机制,不然可能出现不一致性现象。
master按理来说要维护dataserver所有的心跳信息,如果没有在指定的时间发回信息,我们怎么办?启用数据迁移机制, 所以说为了寻找这个主机的block id,应该维护这样的map<dataserver,block_id>的操作吧,寻找起来会快速很多!然后根据新的整体信息每个节点的信息和容量来决定分配新的DataServer。
如果整个TFS集群挂了 应该采用双写双机房更安全,不过会比较烧钱吧 嘿嘿!
另外的点
另外1:数据而言,有可能读取非常不均匀,多数客户端同时请求读同一个block_id怎么办? 其实缓存还是必须得做的,我指得是文件缓存,这样可以减低了效率,当然本身数据就没有任何的冷热点,那样为了维护缓存会耗费的更多时间,应用数据应该都具有一定的冷热性吧。嘿嘿 只要不要突然请入了很多无关数据把缓存池被污染了 那就比较麻烦了 那是缓存 以后有机会在讨论这些问题。
2: 读一个64M的文件的某个offset起的n个byte,这个问题其实对TFS读应该是一个比较大的性能损失,要调用lseek() 然后read() 或者直接全部read到内存里[那更不可靠呀]。如果能很好的解决这个问题 read性能还是很高的。不知道tfs是怎么做这点的 以后可以好好看看源码研究下。
OVER了
分布式blog系统 TFS总结的更多相关文章
- 分布式消息系统Kafka初步
终于可以写kafka的文章了,Mina的相关文章我已经做了索引,在我的博客中置顶了,大家可以方便的找到.从这一篇开始分布式消息系统的入门. 在我们大量使用分布式数据库.分布式计算集群的时候,是否会遇到 ...
- KAFKA分布式消息系统[转]
KAFKA分布式消息系统 转自:http://blog.chinaunix.net/uid-20196318-id-2420884.html Kafka[1]是linkedin用于日志处理的分布式消 ...
- Memcached 分布式缓存系统部署与调试
Memcache 分布式缓存系统部署与调试 工作机制:通过在内存中开辟一块区域来维持一个大的hash表来加快页面访问速度,和数据库是独立的;目前主要用来缓存数据库的数据;存放在内存的数据通过LRU算法 ...
- 分布式消息系统Jafka入门指南之二
分布式消息系统Jafka入门指南之二 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 三.Jafka的文件夹结构 1.安装tree命令 $ sudo yu ...
- 一篇文章让你深透理解cookie和session,附带分布式WEB系统redis共享session方案
cookie和session有什么区别?这是一个很基础的知识点,大家可能都知道一个大概:cookie是存在客户端的,session是存储在服务端,cookie和session用来验证识别用户的登录状态 ...
- 一种开源的分布式消息系统Nats
一种开源的分布式消息系统Nats 作者:chszs.未经博主同意不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs 1.NATS介绍 NATS是一个开源的 ...
- Spring Cloud 5分钟搭建教程(附上一个分布式日志系统项目作为参考) - 推荐
http://blog.csdn.net/lc0817/article/details/53266212/ https://github.com/leoChaoGlut/log-sys 上面是我基于S ...
- 分布式消息系统Kafka初步(一) (赞)
终于可以写kafka的文章了,Mina的相关文章我已经做了索引,在我的博客中置顶了,大家可以方便的找到.从这一篇开始分布式消息系统的入门. 在我们大量使用分布式数据库.分布式计算集群的时候,是否会遇到 ...
- 分布式机器学习系统笔记(一)——模型并行,数据并行,参数平均,ASGD
欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术.应用感兴趣的同学加入. 文章索引::"机器学 ...
随机推荐
- javasript_数据结构和算法_栈
//-----------------------------------存储结构为数组-------------------------------------------- function St ...
- HDU--杭电--1026--Ignatius and the Princess I--广搜--直接暴力0MS,优先队列的一边站
别人都是广搜+优先队列,我没空临时学,所以就直接自己暴力了 Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others) ...
- https://developers.google.com/maps/documentation/javascript/examples/places-autocomplete-addressform
https://developers.google.com/maps/documentation/javascript/examples/places-autocomplete-addressform
- Android中ActionBar的使用
简介 从Android3.0开始(targetSdkVersion或者minSdkVersion为11或者更高),ActionBar被包括在了所有主题为Theme.holo(或者子类)的主题当中. 使 ...
- Eclipse - 修改默认user和类的创建日期
1.找到eclipse.ini文件 2.在文件中找到 -vmargs -Duser.name=xxxxxxxx 3.修改xxxxxxxx为你的名字 4.eclipse中:Window -> Pr ...
- C#注册表的读,写,删除,查找
首先分享一下写入,这个最常用的 public bool WriteRegedit() { try { RegistryKey rk = ...
- 运行impala tpch
1.安装git和下载tpc-h-impala脚步 [root@ip-172-31-34-31 ~]# yum install git [root@ip-172-31-34-31 ~]# git clo ...
- Python3学习(一)-基础、数据类型、变量、字符串和编码、list&tuple、if、for、while、dict、set、函数与参数
##廖雪峰py3笔记 ## '//'这是获得相除后的整数部分 ##a = 10//3 ##print (a) ## '/'获得相除后的结果,为浮点数,结果能整除也也是浮点数 ##b = 10/3 ## ...
- list内容按长度等分
这里需要导入 from more_itertools import chunked chunked(iterable, n) 将一个可迭代对象等分成n个list,第n个list的长度可能小于之前的. ...
- NPOI 2.0 读取、编辑、保存Excel文件
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...