暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

OceanBase 数据库如何防范磁盘静默错误?

原创 lscomeon 2022-11-28
287

磁盘静默错误(Silent Data Corruption)是指存储系统向应用程序提供损坏的数据,而未发出任何警告。例如由于介质损坏,磁盘中出现了坏块,在应用程序读取该块的时候,就会读到错误的数据。

磁盘静默错误发生的概率并不太高,但其可怕之处在于错误发生时没有任何警告,如果应用程序没有对数据的正确性做校验,那就会导致奇怪的应用异常,例如进程崩溃、丢数据等。对数据库这类应用程序而言,不仅系统稳定性非常重要,更是无法容忍数据丢失,数据的正确性和完整性是数据库系统的生命线。

OceanBase 数据库如何防范磁盘静默错误

OceanBase 数据库存放在磁盘中数据包括两部分,第一部分是 RedoLog,即事务日志,RedoLog 经过回放后会构成内存中的 MEMTable。第二部分是 SSTable,即 LSM-Tree 中的静态数据。MEMTable 和 SSTable 共同组成用户数据的一个副本。

多副本机制

OceanBase 数据库作为分布式数据库,采用了多副本的容灾方式。由于磁盘静默错误发生的概率并不高,所以同一个数据块在多个副本同时出现静默错误的概率微乎其微。只要我们能知道某个副本出现了磁盘静默错误,就可以从剩余的正常副本中拷贝数据来修复这个错误。目前 OceanBase 数据库支持副本粒度的修复,出现磁盘静默错误时,运维同学可以先删除错误副本,再从其他机器补齐正确副本。

RedoLog 的校验机制

在每条 RedoLog 的头部,我们会记录这条日志的校验和。在做网络传输和日志回放时,都会强制对每条日志的校验和进行校验。这样我们保证了三副本同步到的日志是正确且一致的,如果一条日志中的数据出现了静默错误,那么这条日志一定不会被同步到其他副本。

SSTable 的校验机制

SSTable 的数据存放在一个个宏块中,宏块的长度固定为 2MB,在宏块的头部会记录这个宏块的校验和。宏块内部会拆分多个微块,微块长度不固定,通常为 16KB,在微块的头部也会记录这个微块的校验和。SSTable 的读 IO 以微块为基本单位,写 IO 以宏块为基本单位。在读取微块时,会强制校验微块头的校验和,保证用户读到的微块数据是正确的。在迁移、备份等复制宏块的场景,目的端写宏块前,也会强制校验宏块的校验和,保证写入的数据是正确的,防止磁盘静默错误的扩散。

除了在读写时检查数据块的正确性,我们还希望尽早发现磁盘静默错误。OceanBase 数据库可以在后台开启巡检任务,周期性扫描全部宏块并检查其校验和,一旦发现磁盘静默错误便会告警。

冷备机制

在没有多副本的部署场景,或者真的多个副本同时发生了磁盘静默错误,那应该怎么拯救数据呢?OceanBase 数据库提供了备份恢复的功能,可以将数据备份到 NFS、OSS 等外部介质,发生磁盘静默错误后,可以从外部介质将正确的数据再恢复到数据库中。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论