分布式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了

  

       

    

    

    

            

时间: 2024-10-12 12:12:48

分布式blog系统 TFS总结的相关文章

TensorFlow【机器学习】:如何正确的掌握Google深度学习框架TensorFlow(第二代分布式机器学习系统)?

本文标签:   机器学习 TensorFlow Google深度学习框架 分布式机器学习 唐源 VGG REST   服务器 自 2015 年底开源到如今更快.更灵活.更方便的 1.0 版本正式发布,由 Google 推出的第二代分布式机器学习系统 TensorFlow一直在为我们带来惊喜,一方面是技术层面持续的迭代演进,从分布式版本.服务框架 TensorFlow Serving.上层封装 TF.Learn 到 Windows 支持.JIT 编译器 XLA.动态计算图框架 Fold 等,以及

分布式消息系统Jafka入门指南之二

分布式消息系统Jafka入门指南之二 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 三.Jafka的文件夹结构 1.安装tree命令 $ sudo yum install tree 2.查看文件夹 $ tree -L 1 . ?..? ? bin ? ..?? conf ?..?? data ? ..?? lib ? ..?? LICENSE ?..? ? logs ?..?? VERSION 说明:bin文件夹:命令行脚本conf文件夹:存放配置

Python使用multiprocessing实现一个最简单的分布式作业调度系统

Python使用multiprocessing实现一个最简单的分布式作业调度系统 介绍 Python的multiprocessing模块不但支持多进程,其中managers子模块还支持把多进程分布到多台机器上.一个服务进程可以作为调度者,将任务分布到其他多个机器的多个进程中,依靠网络通信. 想到这,就在想是不是可以使用此模块来实现一个简单的作业调度系统. 实现 Job 首先创建一个Job类,为了测试简单,只包含一个job id属性 job.py #!/usr/bin/env python # -

KAFKA分布式消息系统[转]

KAFKA分布式消息系统  转自:http://blog.chinaunix.net/uid-20196318-id-2420884.html Kafka[1]是linkedin用于日志处理的分布式消息队列,linkedin的日志数据容量大,但对可靠性要求不高,其日志数据主要包括用户行为(登录.浏览.点击.分享.喜欢)以及系统运行日志(CPU.内存.磁盘.网络.系统及进程状态). 当前很多的消息队列服务提供可靠交付保证,并默认是即时消费(不适合离线).高可靠交付对linkedin的日志不是必须的

一篇文章让你深透理解cookie和session,附带分布式WEB系统redis共享session方案

cookie和session有什么区别?这是一个很基础的知识点,大家可能都知道一个大概:cookie是存在客户端的,session是存储在服务端,cookie和session用来验证识别用户的登录状态,常见适用场景:用户登录,用户购物车数据等.偶然一次开发中遇到这些基础的知识,还要去baidu一下,今天就做一个完整的记录,便于以后查阅. 1.基础概念 cookie存储在客户端电脑中一般在:C:\Users\***\AppData\Local\Microsoft\Windows\Temporary

分布式消息系统 Kafka 简介

Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apache项目的一部分.Kafka是一个分布式的,可划分的,冗余备份的持久性的日志服务.它主要用于处理活跃的流式数据. 在大数据系统中,常常会碰到一个问题,整个大数据是由各个子系统组成,数据需要在各个子系统中高性能,低延迟的不停流转.传统的企业消息系统并不是非常适合大规模的数据处理.为了已在同时搞定在线应用(消息)和离线应用(数据文件,日志)Kafka就出现了.Kafka可以起到两个作用: 降低系统组网复杂度. 降

分布式消息系统Jafka入门指南

分布式消息系统Jafka入门指南 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 一.JafkaMQ简介 JafkaMQ是一个分布式的发布/订阅消息系统,它是Apache Kafka的Java移植版. 2013年11月28日,JafkaMQ发布了1.2.3版. JafkaMQ的特征如下: 1)消息持久化到磁盘的算法时间复杂度为O(1),即使是TB级的消息存储,也能保证常量时间的执行性能.2)高吞吐量:即使是低配制的硬件条件,单个Broker也能支持每

分布式服务化系统一致性的“最佳实干”

1 背景 一致性是一个抽象的.具有多重含义的计算机术语,在不同应用场景下,有不同的定义和含义.在传统的IT时代,一致性通常指强一致性,强一致性通常体现在你中有我.我中有你.浑然一体:而在互联网时代,一致性的含义远远超出了它原有的含义,在我们讨论互联网时代的一致性之前,我们先了解一下互联网时代的特点,互联网时代信息量巨大.需要计算能力巨大,不但对用户响应速度要求快,而且吞吐量指标也要向外扩展(既:水平伸缩),于是单节点的服务器无法满足需求,服务节点开始池化,想想那个经典的故事,一只筷子一折就断,一

从构建分布式秒杀系统聊聊Lock锁使用中的坑

前言 在单体架构的秒杀活动中,为了减轻DB层的压力,这里我们采用了Lock锁来实现秒杀用户排队抢购.然而很不幸的是尽管使用了锁,但是测试过程中仍然会超卖,执行了N多次发现依然有问题.输出一下代码吧,可能大家看的比较真切: @Service("seckillService") public class SeckillServiceImpl implements ISeckillService { /** * 思考:为什么不用synchronized * service 默认是单例的,并发