TFS ErasureCode线上问题

TFS支持ErasureCode的版本上线数月,参与编码的数据量也不断在增加,因为规模效应,最近也暴露除了不少问题。

索引预留空间问题

TFS每个Dataserver(DS)进程管理一块磁盘,DS上线前,需要对磁盘进行format,format的主要工作是创建一批固定大小的文件出来,这些文件对应TFS里的block(通常64M),block里存储多个小文件,每个block对应一个索引文件,存储文件在block内的offset、size信息,用于快速定位文件。

索引文件占用的存储空间并不固定,其决定于block里存储多少个文件,所以在format时,必须为索引文件预留一定大小的磁盘空间,TFS的策略是,根据用户配置的“平均文件大小”来计算出一个保留值block_size / avg_file_size * index_size * RESERVE_RATIO,然后把剩余的空间都用于分配block文件。

之前RESERVE_RATIO一直设置为4,也就是说,即使集群平均文件大小偏离配置值4倍,保留的空间也是足够的。但开启ErasureCode之后,数据块的索引会冗余存储一份到校验块上,这个设计导致发生大量的ErasureCode编组后,按4倍保留的索引的空间不够用了。

解决方案

1. 针对新上线的DS,扩大RESERVE_RATIO,为索引保留更多的存储空间 
2. 对于已经上线的DS,移除一部分未用的block,并修改程序确保这部分block以后也不会被分配使用 

主备NS共享存储

ErasureCode编组时,Nameserver(NS)在后台选取一批访问较少的block进行编组,并把编组信息写到tair里。以4+2为例,NS选取了block D1、D2、D3、D4,编码出校验block P1、P2,编组完后,NS就会在tair里添加一条记录如下:

group_id = 1 // 编组id在运行过程中不断增长 
data_num = 4 // 数据块个数 
check_num = 2 // 校验块个数 
algorithm = "caucy reed solomon" // 编码算法 
block_list = [D1, D2, D3, D4, P1, P2] // block列表 

主NS添加记录到tair,备NS会周期性(间隔很短)的扫描tair,看是否有新增加的编组,如果有则加载到内存;由于编组的id是递增的,备NS每次从上次扫描的位置接着读取,成本很低。

在没有发生解组的情况下,上面的方式运行很正常,但有编组被解除掉时(编组内超过2个block丢失),由于这个信息没有及时同步到备NS,此时一旦发生主备切换就会有问题。

1. block A参与编组,主、备NS都看到A已编组 
2. 主NS将block A所在的编组解除掉,block处于未编组状态,主看到A未编组,但备还看到A已编组 
3. 主挂掉,备接管;A汇报到新的主时,编组的状态就发生冲突 

解决方案是主NS将解组的信息以日志的形式写入tair,备周期性的扫描解组的日志,将解组的信息应用到内存,此时主备看到的block状态就是一致的;其实这个方案也不能完全解决问题,因为主备NS看到的数据始终存在一定时间的不一致,而方案是否可行关键看这个不一致窗口的长度是否在能接受的范围内。

Jerasure多线程并发

参与EraureCode编组的block丢失时,如果文件被访问到了,会产生实时的退化读。线上的退化读发生的概率比预期要少很多,主要是我们对参与编组的block进行了限制,必须一个月没有被访问过才编码,而TFS里大部分的访问都集中在最近写入的文件上,所以编码过的block很少发生退化读。

最近观察到一个现象,在退化读文件时,DS可能发生coredump,从core文件定位到问题是Jerasure库里发生数组越界访问的问题;同时发现有另外一个线程也在做退化读,研究了下Jerasure的代码发现,创建编解码矩阵的过程是不能多线程并发的,因为其公用全局变量galois_mult_tables/galois_div_tables等。

解决方法

在创建编码矩阵时加锁,避免多线程并发

恢复数据错误

最近某个机房搬迁,这次采用直接搬机器的方式(类似事情去年也发生过,当时采用迁移数据的方式,把数据先同步到另一个机房);将物理机搬到新的机房,原以为会比用工具迁移数据来得轻松,结果机器搬运到新机房后,一个集群坏了好几台机器(系统盘故障、电源故障等),导致发生大量的ErasureCode恢复和解组,也正是由于这次大规模的恢复,发现在恢复读数据时,没有检查返回值(非常低级的错误),导致的结果是恢复的数据有可能是错误的(比如读数据超时或达到流量阈值)。

紧急修复bug上线之后,接下来就要为bug擦屁股了,要对线上所有的数据进行一次全量的检查,找出有问题的数据,重新从备份的集群同步;通过这个bug,以后需要重点关注的问题。

1. 写代码及review代码上的疏忽 
2. 测试时对失败场景的模拟 
3. 数据校验是存储的根基,数据有问题不可怕,不能发现问题才可怕

未及时扩容

上周末线上一个备集群容量使用到96%了(这个问题跟ErasureCode没关系),而NS配置的集群写入阈值就是96%,导致大部分容量超过(大于或等于)96%的DS无法写入数据了,此时刚好有8个DS(后来统计到的)是新上线的,导致所有从主集群同步过来的数据都写到这8个DS了,使得这个8个DS的压力非常大;由于只有8个DS可写,主集群的同步队列也堆积了很多文件,并一直持续。

发现这个问题后,迅速修改了NS的容量阈值,调整到98%,恢复正常的写服务,并让PE同学扩容。扩容后,写服务虽然正常了,但主集群的DS上堆积的未同步文件仍然是往上述8个DS同步(因为文件所属的block是确定的,而这些block都至少有一个副本在8个DS上)。

此时为了让集群快速均衡,只能人工介入,将8个DS逐个下线,通过工具将这些DS上的block重新从主集群同步一份(重新同步会将block随机分配到所有可用的DS上),折腾了两个半天才搞定。处理完后感慨万千

1. 线上容量使用到90%就有告警的,结果却一直没扩容(开发运维都需要反思) 
2. 是时候考虑将扩容自动化了,根据历史容量增长趋势,自动从buffer里选取一批机器上线 
时间: 2024-10-20 10:55:00

TFS ErasureCode线上问题的相关文章

一个线上死锁问题分析

死锁日志如下: TRANSACTION 48AA4BB9, ACTIVE 0 sec inserting mysql tables in use 1, locked 1 LOCK WAIT 6 lock struct(s), heap size 1248, 4 row lock(s), undo log entries 2 MySQL thread id 1409173, OS thread handle 0x5659f940, query id 1084083936 10.246.138.19

线上性能问题初步排查方法

本文首发于并发网,作者:方腾飞 引言 有时候有很多问题只有在线上或者预发环境才能发现,而线上又不能Debug,所以线上问题定位就只能看日志,系统状态和Dump线程,本文只是简单的介绍一些常用的工具,帮助定位线上问题. 问题定位 1: 首先使用TOP命令查看每个进程的情况,显示如下: top - 22:27:25 up 463 days, 12:46, 1 user, load average: 11.80, 12.19, 11.79 Tasks: 113 total, 5 running, 10

算法-如何用多个传感器访问一条线上的多个点?

问题描述 如何用多个传感器访问一条线上的多个点? 如下问题: 对于一条线上的n个点,m个传感器.如何分配这些传感器,使得每个点都被一个传感器访问,并且使得所有传感器走过路径的最大值最小? 以下图为例: 橙色长方形为传感器,蓝色的点为需要经过的目标,数字为这些点的坐标.每个传感器走过的路程长度为3(1-4) 3(5-8),和0(10000-10000).传感器均从左往右运动.上例为最优分配,如果把传感器放在任意其他点上,则总会有一个传感器走过的路程大于3. 如何解决这个问题? 解决方案 假设n=m

收集线上的意见建议快速的修复及更正

文章描述:新产品的改进不要太寄希望于用户反馈. 很多时候,都可以听到产品要"小步快跑"的说法,产品要先上线再迭代,先让用户使用上产品然后才是让用户使用上更好用的产品.这些说法本身没有错,当然基本上关于产品的说法大部分都没有错,错的是在执行上. 产品上线后的迭代,除去计划中尚未设计开发的功能外,还有很重要的一部分是收集线上的意见建议快速的修复及更正,但是线上意见建议的反馈从哪里来呢? 第一反应,理所当然的是反馈信息来自于用户:第二反应是还有自己人的反馈信息(自己人在上线前就已经测试反馈过

反驳SEO是一种廉价的线上推广手段

如果问那些选择SEO推广站点的企业为什么选择SEO?我想十有八九会说因为SEO廉价.的确从表面看来,SEO不用像PPC付出如同无底洞的资金投入.然而实际情况是否SEO就是一中物美价廉的推广方式呢?笔者认为不然,因为SEO并非我们表面所看到的只要发发内容.发发外链,其依然隐藏着隐性的成本. 一:不确定因素成为SEO最大的隐性成本支出 SEO并不是一中一劳永逸的推广方式,其严重的依赖于搜索引擎,只要搜索引擎算法已更新,而如果我们的企业站点刚好不行中枪,那么企业借由站点的收入将会基本归零.更可怕的是搜

辩论:SEO博客能否成为从业者线上品牌构建的利器

  现今SEO博客可以说已经是十分的泛滥,我们随便搜索一个城市名加上seo,如福州SEO,就可以找到好几页相关博客信息.无可厚非,随着SEO的普以及日益受到重视,SEO从业者的大军愈发壮大,接踵而至的也是相关博客的壮大.作为一名优化人员绝大多数的人建立SEO博客目的很明显就像想通过它打造个人品牌,因为个人品牌的好坏将影响着SEO接单.做SEO的可能没有几个不认识ZAC博客.卢松松博客,那么我们是否也要像这些博客学习为了构建自己的线上品牌而建立seo博客?可能大家都有不同的观点,有同意,也有反对,

SEO瞬息万变 线上推广如何应变招架

身处搜索引擎优化行业(SEO)的朋友们非常辛苦,不但需要面对枯燥繁琐的工作,还要不断的应对搜索引擎的算法更新,很多站点因为无法达到搜索引擎的标准而面临降权K站.其实,试想一下,我们难道真的已经依赖搜索引擎到无法自拔的地步了吗? 确实,SEO是线上推广中最为有效的手段之一,其为站点带来的丰厚的目标流量,这是一个摆在眼前的事实.但是,作为线上推广者,最忌讳的就是把所有的鸡蛋都放在一个篮子中,尤其是SEO.因为SEO是瞬息万变的,我们无法在方方面面都做得十分得体.因此,从长远的战略上说,我们需要多手准

浅谈线上营销企业如何构建一个成功的SEM团队

  每一家企业都希望自己有一个完善的线上营销团队.希望是一群由有远见.敬业.热情的成员组成的团队.同时我们知道适当的挑战可以塑造一个有素质.有技能及个性平衡的团队.但是笔者发现很多企业在组建自己的SEM团队上都会犯一个共同的常见的错误,认为我们只要简单的雇佣几个刚毕业的实习生或者一个做站点外链建设的专员就可以有成绩.这个观点在过去还可能有点成效,但是在如今搜索引擎排名竞争如此激烈的环境下,有的公司甚至要每年花数万元来维持自身的排名.你如何仅凭这点付出就获得一个好的稳定的排名.因此能够合理的构建自

线上mysql数据库不停机的环境下如何添加新的从机

  在工作中,主从环境搭的多了,但是,基本上都是在DB SERVER停机(游戏公司)的情况下搭建的,今天突然被一技术官问,如何在线添加主从,回答的大概思路,但是没有实践过,下面,我就测试一下.各位也可以先想想自己的思路:mysql 5.1版本,二进制日志文件(时间长了,有些二进制日志定期清除了),pos号 注:在mysql 5.6版本中,已经有基于GTID的主从复制(即:不需要知道日志文件和position号),只需还原最新的备份就可实现,这里只讨论mysql 5.1 一.目前的基本环境: 主D