聊聊底线 | 坏数据与假数据

坚持思考,就会很酷

c31dd64cf4d2f9948bf9c44edbca9457.png

cdf83620187190802abb4e84d080e815.png

存储介质的进化

df46f5b537659fdd210834c9caeb6eef.png

很久以前,祖先把甲骨文写在骨头之上,骨头保存持久,但是制作困难,后来把文字写在竹简、纸上。

8444b71df5fe7c54c333ac527df0d65f.gif


文字是信息,纸张、竹简、石头是介质,虽然它们比骨头不易保存,但是制作简单,更容易扩散。

存储介质在进化,信息形式也在变化!世界万物的信息在数字化,数字化的信息可以存储到磁学设备、光学设备、电子设备上。比如软盘,光盘,硬盘,磁带,固态硬盘,PCIE盘等介质上。

90b1c72f07676969d29c6426a18af867.gif


物理的介质在不断的变化,有效信息容量越来越大,物理体积越来越小。

2cf18b72456a9253cd3b17ff80ab95f5.png

世界太危险

48f28874339f60ac41d9ee5e4ade9d23.png

存储的介质在变化,体积越来越小,容量越来越大。唯一不变的是:无论多好的介质总是会腐朽,只要他存在于现实,东西变坏不以个人意志为转移。

最关键的是:这是个危机四伏的世界!

奇伢见过

背锅侠:哎呀,我运维操作不当,vim 进去,改了一个字节。没事吧?

老板:没事,你去财务结一下工资。

还见过

硬盘:哎呀,上年纪了,我比特反转了,好像瓦特了。

梦见过(新闻见过):

天灾,被雷劈了,被水淹。

更可怕的是:总有刁民想害朕。

黑客:我是黑客,为彰显技术实力,我要搞坏他。

对于存在盘上的数据来说,这么危险,怎么办?

7d028faa09bb4a2d4ead2a2545a18761.png

这么危险,可怎么办?

45029afb4f264e7e388b6bcfcf885922.png

它被有意修改,任何介质都可能坏。既然改变不了,那么只能忍受它。

存进去是 1 ,取出来是 2。这,你还要吗?

当然不能要!

那我还有底线吗?

有!我可以忍受你变坏,但是不能忍受你的假。

就跟爱情一样,不爱了,直说。着急赶着去找下一个备胎,不要假冒,拜拜就拜拜,下一个更乖。

数据坏了就说坏了,别耽误事!

4eeaa5f7e0d665edb502a4bf4183cdf5.png

怎么证明自己是自己

82e020031c268cf9a722f5d8bc640dc3.png

怎么才能证明数据好坏呢,要有第三方证人才行。怎么证明你是你?

谁来证明?别人

我们数据也是类似,数据存储的时候,要多存一些见证的东西,能够证明你好坏的东西。

这个证明叫做校验码。然而没有免费的午餐,这些额外的东西是有代价的。需要更多的存储空间,需要多余的计算时间。

5f2c86c828113adc7f2c8b45a8833087.png

怎么解决?

3e679aace04595dc7b3db2e79bf8711d.png

自校验!

奇伢突然来了灵感,创造了一个“伢式算法”,每 8 字节数据对应生成 1 个字节的校验。

09fde5f2fb96727f13d5d37402b3a7cc.gif

这个 nb 算法就是:p = x % 8 (嘿嘿,其实就是除余算法):

  • 用户数据 1, 1 % 8 = 1,校验码则是 1 。

  • 用户数据 2, 2 % 8 = 2,校验码则是 2 。

0ff565fe77cc93b0a5961d559c5e373e.gif

现在好了,取到数据之后,我会用计算一下校验码,校验码对不上的数据就是坏的。

c9aa104bd2c2d07827a5c26b41b6b803.gif

但你可能发现了一个秘密,奇伢还是太年轻。不同的数据计算的校验码太容易重复了。

1  % 8 = 1
9  % 8 = 1
17 % 8 = 1

这种叫做冲突,并且冲突率肉眼可见的大呀,每 8 个数字就有循环重复。

如果数据是 1 变成 9 呢?那你还知道数据是坏的吗?

a1ada63dbf0041485ebd3ba969463fcd.gif

答案是:不能。

并且还有个问题:冗余数据太多了。每 8 个字节,1个校验数据。那 8T 的数据,就有 1T 的校验数据,着实浪费。

6550a0396864659c1ad786e9af92f197.png

956162e80822b7a8ee88dfe9394b8cea.png

更好的算法

f65a9243a746c72357a5a826fad1a121.png

怎么选一个好的算法来计算校验码?一般决策者会从多个维度考虑

  1. 计算速率

  2. 资源消耗

  3. 结果冲突率

  4. 校验结果的冗余度

一个完美的校验算法应该是:计算尽可能快,资源消耗尽可能少,冲突率仅可能小,冗余度要尽可能小。

想的美!

这是一个典型的既让马儿跑,又不想让马儿吃草的例子。

这些维度都是在相互拉锯的,想要更快,消耗可能就会多,想要冲突率少,计算出来的校验值可能冗余占用就大。

奇伢给不了标准答案,具体情况具体分析!不过有些最常见的 crc32 ,md5 等算法可以满足大部分场景需求。

还记得开源项目下载文件的时候,有个对应 md5 值吗?

那就是防串改,校验文件是否损坏用的。

e26d85fbd763b18b508c52657f7d5116.png

冗余是唯一的出路

6390dd048db9a2d43329b8de00594ed5.png

数据可以坏,但不可以假,这是和单机存储引擎的约定。但是数据可靠性怎么保证?这个问题依然要解决。

冗余分身是唯一奥秘。

数据可靠性是一个系统工程,单点引擎无法彻底解决,单点存储引擎能保证只给真数据不给假数据,然后通过分布式的冗余,来保证整个系统数据对外的高可靠。

f1c38ddc4234d9c1a00a1bf58ef2d6ff.gif


1ee53bb4bedcfa906ffc3774949bd4bb.png

总结

362dcc5ac795413f90a800c1f0d5decf.png

最后奇伢总结几个基本要点:

  1. 对于单机引擎来讲,数据可以坏,但不可给假的数据出去,这是底线

  2. 系统的可靠性是系统多组件配合打造的,核心方法是数据冗余;

  3. 校验数据也要考虑成本和效率;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值