随笔分类 - TFS开发
摘要:QA同学反映,对TFS进行压力测试时,网卡一直压不上去,看了下他们的测试环境,发现在测试时客户端的日志都是往屏幕打印的,将日志重定向到文件,压力马上上去了。日志打印到屏幕其实是个非常耗时的事情,打印到屏幕会影响到客户端的请求并发;这个问题解决了,QA同学又反映另一个奇怪的现象。如下图所示,client1和client2的请求分别被定向到server1和server2。 (4台独立的物理机)单个客户端case1:只启动client1,client1不打印日志,server1的网卡能跑到110M/S左右(千兆网卡,接近满)case2:只启动client1,client1打印日志,server1的网
阅读全文
摘要:block标识
TFS每个block有一个唯一标识,目前的实现是一个uint32_t的整数id,每次新增一个block,就会为其分配新的id,具体实现方式是保存一个全局global_block_id的值,每次分配时就直接将这个值加1做为新的blockid;代码实现大致如下,每次需要分配时就调用generate函数。
class BlockIdFactory {
public: uint32_...
阅读全文
摘要:去年写过一篇tbnet的分析文章,主要介绍tbnet(获取源代码)框架结构及基本使用方法,最近又重读了下源码,有一些新的收获。
连接是核心
tbnet框架围绕网络连接(对应Connection类)展开,Connection主要包含如下成员。
class Connection { bool _isServer; ...
阅读全文
摘要:昨天下午线上辅集群加机器扩容,扩容的机器在运行一段时间后线上有block lost的告警,从Nameserver(NS)的日志上发现,扩容的新机器上有多次加入集群和退出集群的记录,最初我怀疑是扩容后,集群做容量负载均衡,大量数据往新加入的节点迁移,导致新机器负载高,从而出现心跳信息没有及时到达NS的情况,此时NS认为Dataserver(DS)宕机,如果有一个block的多个副本都被迁入到新扩容的...
阅读全文
摘要:12月03日03:50左右,有多台Dataserver(DS)内存占用飙升,如10.246.70.71 dataserver 3,常驻内存突然飙升到21G,并且一直没有释放。查看dataserver的日志,发现大量的read v2失败 ,返回值主要是-8025(block不存在), -8016(文件被删除或隐藏)。但这些失败信息从0点开始一直很多,而且这两种失败不会导致DS分配很多内存,所以应该跟内存问题没关系。在3:50左右5分钟内,发现readv2 success的日志很多,主要集中在3:48,3:49,3:50这3分钟内,3分钟的readv2请求超过4w,平均每秒200+,每个文件请求都
阅读全文
摘要:昨日线上一台机器上的nginx rt飙高,@明俨 调查发现这台机器上的metaserver内存占用很高,同时还有个奇怪的现象,df发现/home的空间占用在增长飞快,但metaserver和nginx的日志文件增长都很慢,通过du -sh /home统计home下文件的总大小,发现跟df命令/home占用的空间小10+g,到底谁占用了我的磁盘空间? 后来把nginx进程都停掉后(当时应该先通过ls...
阅读全文
摘要:core文件对问题查找非常有帮助,大部分时候我们能根据core文件直接定位到问题,但当出现内存乱掉的情况时,core的backtrace可能也不能指出问题源头。最近线上问题较多,针对dataserver出现的问题做个总结:1. 如果在read/write时coredump,则多是因为磁盘故障(或是文件系统崩溃),IO的一些严重问题可通过dmesg查看,如果出现Medium Error,EXT4-fs error(device sdx), Device offlined, I/O error, rejecting I/O to dead device之类的关键字,就说明磁盘已经出问题了,如果是文
阅读全文
摘要:配置参数 在工程实践中,我们通常把一些需要测量才能确定最佳取值的参数以可配置的形式处理,但实际上大部分的参数可能只是一个可行值,而不是一个最佳值。 1. DS与NS之间的心跳间隔设置:NS通过心跳来确定DS的状态,心跳间隔太短,NS容易出现误判,有时短暂的网络断开也会被NS认定为DS宕机;而心跳间隔过长,NS就不能及时发现宕机的DS,导致的问题是,NS复制丢失block的时间点会被延迟,影响系...
阅读全文
摘要:Jerasure库提供Reed-Solomon和Cauchy Reed-Solomon两种编码算法的实现. Reed-Solomon编解码接口 1. 编码矩阵生成 // generate matrix, last m rows matrix = talloc(int, m*k); for (i = 0; i < m; i++) { for (j = 0; j < k...
阅读全文
摘要:上周末ADC,@明俨 主持TFS开源主题的讨论,居然有TFS外部用户到现场咨询使用过程中的问题,感觉这些小公司维护大系统挺不容易的,尤其是在对内部实现不清楚的情况下。期间有人分享自己公司的做法,存文件的时候,存到多个server上,然后把文件跟server的对应关系记录到文档(不能丢,方便查找),当出现异常时,人工介入拷贝文件以增加文件副本数,然后更新文件跟server的对应关系;做法看起来很土,...
阅读全文
摘要:最近几天在做一个集群间数据迁移的任务,要做的事很简单,就是给定一个任务文件,文件中每一行对应一个source:dest形式的迁移任务(source和dest均为文件名),任务数在千万级别。要做的事情其实很简单,读取每一行,解析出source和dest,并根据给定的集群信息从源集群读取source,并写到目标集群的dest。经历了写程序、执行任务、分析日志、改程序、再执行子任务...等多次折磨之后,...
阅读全文
摘要:TFS数据服务器(DS)通过在物理块的头部存放一个BlockPrefix结构来记录逻辑块与物理块的对应关系,在DS时,会读取每一个已经使用的block,并读取block头部的信息,汇报给NS,NS通过这些信息建立逻辑块到DS的映射关系。最初,TFS使用300G的小盘,按照每个主块64M,每个扩展块2M计算,物理块的总数接近1500个,即使这些块全部使用全部使用了(正常状态下扩展块的利用率不会太高)...
阅读全文
摘要:TFS主要用于小文件存储,其将多个小文件存储在大的block中,并为这些小文件建立in-block索引,优化了文件的存储空间和寻址过程。TFS为了保证用户数据的安全性,为每个block在不同的数据服务器(dataserver,ds)上创建多个副本,另外,TFS还支持多集群数据同步。 TFS提供给用户使用的基本接口类似于vfs提供的文件系统,主要包括open、read/write、close、ls...
阅读全文
摘要:TFS客户端是用户访问TFS的入口,目前TFS已支持C/C++、java、php、python等语言的客户端,本文主要分析C++客户端的实现逻辑。
TfsClient类是提供给tfs客户的原生C++接口类,其依赖TfsClientImpl代理负责具体实现,另外,在TfsClient上又封装了一套C客户端接口。
TfsSession类负责处理与nameserver相关的工作,包括获取block信息,...
阅读全文
摘要:TBNET是淘宝的开源异步网络框架,源码见:http://code.taobao.org/p/tb-common-utils/src/trunk/tbnet/ TBNET主要类之间的联系如下,其中框架的使用者需要关注红色部分的类或接口。 关于每个类接口介绍,请参考@淘宝立德 总结的文档:http://vdisk.weibo.com/s/1UzQB/1326963540 ...
阅读全文
摘要:TFS数据服务器的block是在DS第一次启动前格式化的,所有block的空间是预先分配好的,而物理块对应的index文件,则是block被分配使用时创建的。Index文件的大小是根据block中文件数目增加而增长的,为了提高性能,将整个index文件都mmap到内存直接访问。 在初次mmap index文件时,会计算block中预期的文件数,计算出index文件的理论大小index_s...
阅读全文
摘要:分布式文件系统主要用于解决海量数据存储的问题,如Goolge、Facebook等大型互联网企业都使用分布式文件系统作为数据存储的基础设施,并在其上构建很多服务,分布式文件系统通常采用三副本的策略来保证数据的可靠性,但随着应用数据量的不断膨胀,三副本策略为可靠性牺牲的存储空间也越来越大,如何在不降低数据可靠性的基础上,进一步降低存储空间成本? Facebook将erasure code应用到内部HDFS集群中,该方案使用erasure code代替传统的三副本策略,在保持集群可用性不变的情况下,节省了数PB的存储空间,Facebook的实现方案(HDFS RAID)目前已贡献给开源社区。Eras
阅读全文
摘要:Nameserver(NS)是TFS的总控节,NS的主要职责包括为写分配block、为读查找block、管理block与dataserver对应关系、管理dataserver、备NS状态,执行后台复制、均衡、压缩任务,以保证整个集群良好的工作。Block分配NS接收到客户端的写请求,会分配一个可写的block,如果没有可写block,则会创建一个新的block,每个block由一个id标识(uint32_t,后续会将该值提升至uint64_t),blockid不能重复,且不复用,新创建的block,在当前id的基础上递增,产生新的blockid。为了保证产生不重复的blockid,必须将blo
阅读全文
摘要:TFS目前使用扩展块来解决文件写、更新问题。扩展块的数量由磁盘可用空间、主块大小、扩展块大小、Dataserver(DS)配置项block_ratio决定。TFS主块和扩展块的数量在文件系统格式化的时候就已经确定,并且预先分配了所有块的存储空间。DS周期性的汇报存储空间使用率给Namserver,DS根据主块和扩展块使用率中的较大值做为DS储存空间的使用率。 扩展块使用率引发的问题 ...
阅读全文
摘要:在早期,应用要使用TFS,需要知道TFS名字服务器的地址才能访问TFS,然后调用读写接口存取文件,当应用比较少时,这种方式不会引发什么问题,但目前在淘宝内部,有200多个应用使用TFS做为后端的存储系统,必须要对应用的存储资源进行统一的管理与运维。 TFS做为一个应用存储平台,缺乏统一管理至少存在如下问题: 多集群管理:多集群访问控制、切换、容灾等。 访问控制:应用只要...
阅读全文