聊聊底線 | 壞數據與假數據
本文轉載自微信公眾號「奇伢云存儲」,作者奇伢。轉載本文請聯系奇伢云存儲公眾號。
存儲介質的進化
很久以前,祖先把甲骨文寫在骨頭之上,骨頭保存持久,但是制作困難,后來把文字寫在竹簡、紙上。
文字是信息,紙張、竹簡、石頭是介質,雖然它們比骨頭不易保存,但是制作簡單,更容易擴散。
存儲介質在進化,信息形式也在變化!世界萬物的信息在數字化,數字化的信息可以存儲到磁學設備、光學設備、電子設備上。比如軟盤,光盤,硬盤,磁帶,固態硬盤,PCIE盤等介質上。
物理的介質在不斷的變化,有效信息容量越來越大,物理體積越來越小。
世界太危險
存儲的介質在變化,體積越來越小,容量越來越大。唯一不變的是:無論多好的介質總是會腐朽,只要他存在于現實,東西變壞不以個人意志為轉移。
最關鍵的是:這是個危機四伏的世界!
奇伢見過
背鍋俠:哎呀,我運維操作不當,vim 進去,改了一個字節。沒事吧?
老板:沒事,你去財務結一下工資。
還見過
硬盤:哎呀,上年紀了,我比特反轉了,好像瓦特了。
夢見過(新聞見過):
天災,被雷劈了,被水淹。
更可怕的是:總有刁民想害朕。
黑客:我是黑客,為彰顯技術實力,我要搞壞他。
對于存在盤上的數據來說,這么危險,怎么辦?
這么危險,可怎么辦?
它被有意修改,任何介質都可能壞。既然改變不了,那么只能忍受它。
存進去是 1 ,取出來是 2。這,你還要嗎?
當然不能要!
那我還有底線嗎?
有!我可以忍受你變壞,但是不能忍受你的假。
就跟愛情一樣,不愛了,直說。著急趕著去找下一個備胎,不要假冒,拜拜就拜拜,下一個更乖。
數據壞了就說壞了,別耽誤事!
怎么證明自己是自己
怎么才能證明數據好壞呢,要有第三方證人才行。怎么證明你是你?
誰來證明?別人。
我們數據也是類似,數據存儲的時候,要多存一些見證的東西,能夠證明你好壞的東西。
這個證明叫做校驗碼。然而沒有免費的午餐,這些額外的東西是有代價的。需要更多的存儲空間,需要多余的計算時間。
怎么解決?
自校驗!
奇伢突然來了靈感,創造了一個“伢式算法”,每 8 字節數據對應生成 1 個字節的校驗。
這個 nb 算法就是:p = x % 8 (嘿嘿,其實就是除余算法):
- 用戶數據 1, 1 % 8 = 1,校驗碼則是 1 。
- 用戶數據 2, 2 % 8 = 2,校驗碼則是 2 。
現在好了,取到數據之后,我會用計算一下校驗碼,校驗碼對不上的數據就是壞的。
但你可能發現了一個秘密,奇伢還是太年輕。不同的數據計算的校驗碼太容易重復了。
- 1 % 8 = 1
- 9 % 8 = 1
- 17 % 8 = 1
這種叫做沖突,并且沖突率肉眼可見的大呀,每 8 個數字就有循環重復。
如果數據是 1 變成 9 呢?那你還知道數據是壞的嗎?
答案是:不能。
并且還有個問題:冗余數據太多了。每 8 個字節,1個校驗數據。那 8T 的數據,就有 1T 的校驗數據,著實浪費。
更好的算法
怎么選一個好的算法來計算校驗碼?一般決策者會從多個維度考慮:
- 計算速率
- 資源消耗
- 結果沖突率
- 校驗結果的冗余度
一個完美的校驗算法應該是:計算盡可能快,資源消耗盡可能少,沖突率僅可能小,冗余度要盡可能小。
想的美!
這是一個典型的既讓馬兒跑,又不想讓馬兒吃草的例子。
這些維度都是在相互拉鋸的,想要更快,消耗可能就會多,想要沖突率少,計算出來的校驗值可能冗余占用就大。
奇伢給不了標準答案,具體情況具體分析!不過有些最常見的 crc32 ,md5 等算法可以滿足大部分場景需求。
還記得開源項目下載文件的時候,有個對應 md5 值嗎?
那就是防串改,校驗文件是否損壞用的。
冗余是唯一的出路
數據可以壞,但不可以假,這是和單機存儲引擎的約定。但是數據可靠性怎么保證?這個問題依然要解決。
冗余分身是唯一奧秘。
數據可靠性是一個系統工程,單點引擎無法徹底解決,單點存儲引擎能保證只給真數據不給假數據,然后通過分布式的冗余,來保證整個系統數據對外的高可靠。
總結
最后奇伢總結幾個基本要點:
對于單機引擎來講,數據可以壞,但不可給假的數據出去,這是底線;
系統的可靠性是系統多組件配合打造的,核心方法是數據冗余;
校驗數據也要考慮成本和效率;