接触分布式存储已经有一年多的时间了,首次遇到存储侧三份数据都有异常的情况,三份数据异常意味着客户数据的丢失,这个对云存储来讲是致命的打击。为了保证数据的安全,CBS运维和开发的同学进行了持续两天一夜的数据保卫战,最终做到数据0丢失,那么CBS运维和开发的同学是如何通过紧密合作来扭转乾坤的?且听我慢慢道来:

告警来袭,5个小表自动迁移异常

运维侧收到一个数据迁移失败的告警,告警内容如下:

[基础架构部][CBS3.0_广州_小set_快照_bonding_set4][10.182.24.13][cbs_web][check_storage_tablet][2016-09-07
11:11:19] [error] [重要] CBS3.0_广州_小set_快照_bonding_set4 有5个1份dead小表,没空闲小表迁移或者没有正常迁移,请检查!

备注:这是为了能保证异常的小标都能正常迁移,提升CBS数据安全的告警。

这种问题优先级最高,因此运维第一时间介入分析,这个是前一天有一台cell的机器异常,系统自动将其剔除,此时正常的数据变成了2份(Cell2和Cell3),如下图所示:

剔除后会自动发起容灾迁移,成功迁移后就能恢复三份数据正常的状态。查看迁移日志,发现是由于读取cell数据异常引起

根据以往的经验,一般是对应的cell机器对应的盘有异常,使用dmesg查看,发现迁移失败的盘所在的disk确实有异常:

备注:线上的dbtrasf(迁移模块)暂时不支持指定cell的IP来读取数据

此时的线上CBS的数据分布变成了如下图:

此时风险非常高,只有一份数据是正常的,如果此时Cell3再有异常后果将不堪设想,于是紧急和研发的同学沟通迁移方案,经过讨论,我们确定了指定从Cell3读取数据的修复策略。

定向读取,首战告捷

确定好方案后,研发开始修改dbtrasf代码,30分钟研发修改代码+自测完成(确实很高效,点赞),运维侧拿到支持指定cell读取数据的包后,在测试环境和仿真环境进行反复迁移过程中的数据一致性校验,未发现异常。正式开始在线上迁移,事实证明,定向读取确实靠谱,成功迁移4个小表,还有1个小表迁移仍然报数据读取失败,继续跟进。

多扇区异常,雾霾笼罩

通过使用smatctl分析发现10.53.65.214有14个扇区异常,那个小表的数据刚好有分布在坏的扇区的数据,因此迁移也是读取数据异常导致迁移失败。而10.53.65.101有800多个扇区异常,此时基本可以确定三份数据都出现不同程度的损坏。此时部分数据的分布如下图所示:

吓死宝宝了,于是和研发的同学一起再次讨论紧急修复方案。

备注:分布式存储1个小表的数据丢失可能是影响到整个set所有的盘的数据。

双cell数据merage,希望乍现

通过沟通,确定采用双cell数据merge的方式来修复数据,也就是通过从两个cell中分别读取可以读取的数据进行merge的操作,原理为:

1、 先尝试从Cell3(10.53.65.214)读取

2、 读取失败的数据再从Cell2(10.53.65.101)上读取

看看两次读取的数据是否能完全修复那个小表的数据。这次只有少量的block读取失败,虽然没成功,但让人看到了希望:

read from the first[diskid=290763668122043122, lba=1069470973952, sid=1]

[2016-09-09 16:13:38] read from the second[diskid=290763668122043122,
lba=1069470973952, sid=1]

三个cell数据merage,扭转乾坤

通过双cell的数据merage发现通过两个cell无法修复那个小表的数据,难道数据就真的修复不了了吗?

到了这一步,研发的兄弟们还在疯狂的想办法,在pallysheng和yhwang的共同努力下,发现有异常的diskid的元数据在三个cell中是一致的,这说明这个数据在机器剔除后没有新的数据写入,因此可以通过读取被剔除机器的数据来恢复:

有了这个脑洞打开的设想,yhwang开始修改工具逻辑,在测试环境做完测试后,继续开始迁移,迁移的时候大家都紧盯着日志屏幕,直到看到最后打印迁移成功的日志,大家都松了一口气,数据从新恢复成3份副本了:

至此持续2天1夜的腾讯云数据保卫战完美收官,腾讯云的数据安全离不开每一个运维和研发同学的努力。

总结成败,稳定江山

经历了这次惊心动魄的数据修复保卫战后,运维开发进行了深入的反思,这次数据能修复很大程度上是我们的运气好,但是做存储如果将数据安全寄托在运气上,那么和耍流氓没什么区别。因此最紧要的是如何从这次问题中总结出经验和教训,做到类似的问题不再发生,确保我们数据安全更上一层楼,这次问题的反思如下:

存在的问题:

1、 监控上存在漏洞

过去只针对IO错误的监控,在针对某个盘只有少量扇区坏掉,并且数据比较少访问的情况下,通过IO错误监控是失效的(比率太低),需要专门增加磁盘粒度的监控。

2、 Cell数据修复缺乏工具支持

将这次线上修复的case进行发散思考,沉淀出来CBS这边数据修复的相关解决方案和工具

3、 程序逻辑上可以进一步优化

目前IO读取如果出现异常,会进行重试,但是没有向不通cell重试的逻辑,这个在后续的程序中也会添加对应的优化。

收获:

1、 加深了研发和运维的合作

2、 排查过程中充分体现了腾讯人专业、激情、责任

3、 通过这次修复工作提升了CBS团队在应对3份数据异常修复技术,经验得到很好的沉淀

记CBS一次动人心魄的数据保卫战的更多相关文章

  1. 你好,C++(23) 4.4.2 工资程序成长记:用数组处理批量数据,用循环结构执行重复动作

    4.4  从语句到程序 了解了各种表达式和语句之后,就相当于掌握了写作文要用到的词语和句子,但是,仅有词语和句子是无法构成一篇有意义的文章的.要完成一篇文章,先需要确定这篇文章的结构,是先分述再总述, ...

  2. 记一次SQLServer数据库误删数据找回

            昨天 同事在本机清理数据库表时,连接到了生产机,误删了二十几张表,幸好是晚上加班的时候删除的,生产机上当时是一天一备份,还原备份是最后的策略,最关键的还是要找回数据.         ...

  3. TF Boys (TensorFlow Boys ) 养成记(二): TensorFlow 数据读取

    TensorFlow 的 How-Tos,讲解了这么几点: 1. 变量:创建,初始化,保存,加载,共享: 2. TensorFlow 的可视化学习,(r0.12版本后,加入了Embedding Vis ...

  4. 记一次RMI的调用数据失误

    这两天在测试一个Spring RMI接口的时候,出现了个奇怪的问题.Server端返回的数据,到了客户端出现了属性丢失的情况. 类继承体系 .客户端里面定义在ClassA中的属性全部为null. 分析 ...

  5. 记一次MySQL找回用户数据

    事情经过 有天,我们公司外区的一个销售C说他8月3号以前的工作流记录找不到了.问清缘由,原来是更新了微信号(我们公司的工作流是基于企业微信开发的).经过分析,微信号和流程数据并没什么关系,所以初步得出 ...

  6. 记使用talend从oracle抽取数据时,数字变为0的问题

    数据源为oracle,字段类型为number. 发现通过mainline连接到一个logrow控件,输入的该字段的值为0 经过多次测试还是没发现有什么规律. 通过查看代码发现有这一句内容. if (r ...

  7. 记关于vue-cli3 本地代理模拟数据的实践

    网上说的基本都是使用express或http-server作为服务器或其它什么东西自己把玩php也有些年头,就用php好了 服务环境 apache,php先配置好隐藏php后缀扩展名: 在httpd. ...

  8. 阿里巴巴年薪800k大数据全栈工程师成长记

    大数据全栈工程师一词,最早出现于Facebook工程师Calos Bueno的一篇文章 - Full Stack (需fanqiang).他把全栈工程师定义为对性能影响有着深入理解的技术通才.自那以后 ...

  9. 关于 Oracle 的数据导入导出及 Sql Loader (sqlldr) 的用法

    在 Oracle 数据库中,我们通常在不同数据库的表间记录进行复制或迁移时会用以下几种方法: 1. A 表的记录导出为一条条分号隔开的 insert 语句,然后执行插入到 B 表中2. 建立数据库间的 ...

随机推荐

  1. 初试百度地图API

    第一次使用百度地图API来定位并显示,参照了官网2.1.0版本demo里的DemoApplication和LocationOverlayDemo两个类来写,整了半天显示一片空白(图一),然后郁闷了半天 ...

  2. EasyUI Tree 动态传递参数

    1.问题背景 一般出现在加载的时候,传递参数给后台,进行数据筛选,然后在加载tree渲染数据.所谓动态参数,可以是你的上一级节点node,或者是根节点node. 2.涉及方法 onBeforeLoad ...

  3. 使用老版本的java api提交hadoop作业

    还是使用之前的单词计数的例子 自定义Mapper类 import java.io.IOException; import org.apache.hadoop.io.LongWritable; impo ...

  4. Mybaits的特点及优点

    1.SQL语句和代码分离 便于统一管理和维护,不必再Java代码中调式SQL语句.但是当SQL语句出错时,控制台不会打印Log, 解决办法--引用log4j 2.用标签拼接SQL语句 用标签代替JAV ...

  5. LoadRunner读取关联数组的个数和内容

    web_reg_save_param_ex( "ParamName=response_header1", "LB=Set-Cookie: ", "RB ...

  6. Maven-百度百科

    Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具. Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具.由于 Maven 的缺省构建 ...

  7. Velocity.js动画库使用

    1.简介 Velocity 是一个简单易用.高性能.功能丰富的轻量级JS动画库.它能和 jQuery 完美协作,并和$.animate()有相同的 API, 但它不依赖 jQuery,可单独使用. 2 ...

  8. CSS字体中英文名称对照表(转)

      在css文件中,我们常看到有些字体名称变成了乱码,这是由于网页开发者将中文字体的名字直接写成了中文,而css文件本身没有声明字符编码方式,查看时就出现了乱码.为了避免这种乱码状况出现,可以将css ...

  9. poj 1079 Calendar Game(博弈论 SG)

    Calendar Game Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  10. Objective-C中的关联(objc_setAssociatedObject,objc_getAssociatedObject,objc_removeAssociatedObjects)

    关联的概念 所谓的关联,字面意思是把两个相关的对象放在一起,实际也是如此.把两个对象相互关联起来,使得其中的一个对象成为另外一个对象的一部分,这就是关联. 关联的作用 使用Category,我们可以给 ...