如何实现数据持久性保障机制
2021/8/1 6:08:54
本文主要是介绍如何实现数据持久性保障机制,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
为了保障数据持久性(即保证数据不丢),除了对可靠性要求最低的桌面级存储可以听天由命(赌硬盘故障的AFR概率不会落到自己头上)以外,一个存储系统一定要有数据持久性保障机制,即使盘坏了也能保证数据不会丢。
数据持久性保障机制由数据冗余、故障域隔离、心跳监测和数据重建四要素构成:
数据冗余技术
在存储行业,冗余不是一个贬义词,而是能够实现故障容错的关键技术。当组成存储系统的部件(包括但不限于硬盘)出现故障时,由于存在冗余,仍然可以从其它部件完整读取数据,从而不会因为故障造成数据丢失。
一般人对数据冗余技术的理解就是多存几份副本,一份丢了还有其它,副本越多越不容易丢。多副本确实是一种常用的数据冗余技术,但既不是唯一的,也不是最好的。实际上数学家早就为我们准备好了非常神奇的数学算法(专业术语是前向纠错的分组差错控制编码),可以更有效地满足数据冗余的需求。
这些数学编码的效果可以用N+M来表示,即将数据用该算法编码成N+M个数据分片,每个数据分片1/N大小,只需要其中任意N个数据分片就能用对应的译码算法还原数据。也就是说,即使其中任意M个数据分片丢失,数据也不会丢。
举例来说,对于9+3模式来说,是将数据编码成12个数据分片(注意不是切成12片,而是像加密一样做数学编码运算计算出这12个分片),每个数据分片的大小是原数据的1/9,这12个数据分片即使任意3片丢了,也能还原出原始数据。
N+M模式会带来一定的计算开销和元数据开销,但是数据冗余率(冗余后数据与原始数据的比例)极低,只有(N+M)/N,可靠性却接近M副本。例如上例中9+3冗余的数据冗余率只有133%,但持久性与冗余率高达300%的3副本相当。。
除了持久性高且冗余率低以外,这些数学编码还具有强大的检错、纠错甚至纠删能力。什么叫检错、纠错、纠删呢?见如下定义:
- 检错:能识别数据差错
- 纠错:能纠正数据差错
- 纠删:能纠错而且能删除超过纠错能力的数据
多副本模式虽然数据冗余率高(即为数据冗余付出的成本代价大),但检错纠错能力弱,无纠删能力,还有脑裂(数据一致性受损)风险。例如,两副本模式下,如果两份数据不一致,能够检错(知道数据有差错),但不能纠错(不知道哪份是对的),这时候就称为脑裂,就相当于一个人闹神经病一样,左脑和右脑打架。在三副本模式下,可以多数判决,具备1位的纠错能力(如果只有1位数据错,可以纠正),但不具备2位的纠错能力。
在这些数据冗余编码算法中,最简单的是企业级存储常用的RAID采用的编码算法。RAID是Redundant Arrays of Independent Drives的缩写,有“独立磁盘构成的具有冗余能力的阵列”之意,也称为磁盘阵列,简称盘阵,是用多块磁盘组成一个存储池的技术。不同的RAID模式采取不同的数据冗余方式,常见的有:
- RAID0:无冗余,只是简单将多块盘绑一起视为一块大硬盘,任何一块盘出现故障都会导致数据丢失;
- RAID1:镜像(Mirror)模式,相当于双副本,每次写数据都将相同数据写到两块硬盘上。数据冗余率200%,有检错能力,无纠错能力,无纠删能力。
- RAID5/RAID6: N+1/N+2冗余,数据冗余率低,检错纠错能力弱,不能纠删
可见,RAID5是M值固定为1的N+M编码,RAID6是M值固定为2的N+M编码。
也有的编码是N和M都可以任意取值的,常见的有BCH、RS和LDPC编码。这些编码的数据冗余率低,而且能检错、纠错、纠删。
故障域隔离
顾名思义,故障域就是出现故障时所影响的区域。如果没有故障域隔离,出现一个故障都影响整个系统,有那冗余编码也就没有意义了。
企业级存储是存储介质(例如硬盘)级别的故障域隔离,坏一块盘不影响其它盘,但如果服务器坏了则整个RAID组全部离线;传统分布式存储是服务器级别的故障域隔离,坏一台服务器不影响其它服务器节点,但如果机房故障(例如停电)则整个存储系统都无法使用;WAN存储是数据中心级别甚至城市级别的故障域隔离,即使整个城市都被地震摧毁了,其它城市的节点可照样运行。
心跳监测
心跳监测就是不断监测各节点/硬盘的状态,监测是否还活着,一旦检测不到心跳信号了,就判定其失效了,需要采取措施恢复其数据了。
心跳监测有多种手段,分布式存储一般常用的是定时发心跳信号给其它节点或响应其它节点的定时请求、定时写心跳信号到共享仲裁盘等。但是一定要注意当网络出现故障没有收到心跳信号时,可能会导致误判,需要有更完善的机制来判断。
对区块链存储来说,心跳监测可以与存储共识合并,在监测是否作恶时顺带就监测是否存活了。
数据重建
当存储介质或存储节点失效时,虽然由于存在数据冗余不会丢失数据,但会导致数据冗余度下降,后续再有更多介质/节点失效时就可能会丢失数据,因此就需要及时在其它介质或节点重建失效的数据。
数据重建的几个关键点是:是否能自动启动重建(否则是运维人员手工启动),数据重建的速度,数据重建阶段对系统性能的影响。
对RAID来说,可以设置一块空白的热备盘,当任何一块盘出现故障时,就在用热备盘代替故障盘,用同一RAID组的其它盘的信息来在热备盘上重建失效盘上的数据。
RAID 2.0的技术是将一块盘分成很多个Chunk,用来自不同盘上的Chunk来组成RAID组。这样的好处是当一块盘坏了需要数据重建时,可以系统里的所有盘都参与重建,将失效盘上的各Chunk分散给很多盘来重建,而不是传统RAID模式下1对1重建,大大加快了数据重建的速度。
对分布式存储和WAN存储来说,就需要在其它节点上来重建失效节点的数据。
YTFS是以数据分片为单位来存储数据的,对失效节点的重建也是类似原理,可以100个甚至1000个节点来参与数据重建,大大提高了数据重建的性能。
这篇关于如何实现数据持久性保障机制的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南