如果把體系龐大的計(jì)算機(jī)科學(xué)領(lǐng)域比作一臺(tái)機(jī)器,那么每個(gè)程序員的作用都不過(guò)是一顆螺絲釘,沒(méi)有面面俱到,只有精誠(chéng)協(xié)作。程序員早已不是非得在C位,寫出經(jīng)典、傳世,改變歷史的編碼才能夠上優(yōu)秀,對(duì)于需要大量復(fù)雜程序設(shè)計(jì)的新興技術(shù),往往越是做扎實(shí)的基礎(chǔ)研究,越靠近底層,所做的貢獻(xiàn)就越大。存儲(chǔ)公鏈YottaChain創(chuàng)始人王東臨就用自己的實(shí)踐證明了這一點(diǎn)。
“YottaChain的LRC編碼是我親自寫的,在此之前,我已經(jīng)15年不需要寫代碼了。”
“這是YottaChain中最重要的代碼嗎?”
“它不是,但是沒(méi)它不行。它很關(guān)鍵。”
那么LRC是什么?YottaChain的LRC編碼又有什么獨(dú)特之處?
王東臨介紹:LRC是一種糾刪碼(Erasure Code,簡(jiǎn)稱EC碼),糾刪碼是一種非常強(qiáng)大的數(shù)據(jù)冗余編碼。數(shù)據(jù)冗余編碼的專業(yè)術(shù)語(yǔ)是前向糾錯(cuò)的分組差錯(cuò)控制編碼,可以用N+M來(lái)表示,即將數(shù)據(jù)用該算法編碼成N+M個(gè)數(shù)據(jù)分片(Shard),每個(gè)數(shù)據(jù)分片1/N大小,只需要其中N個(gè)數(shù)據(jù)分片就能用對(duì)應(yīng)的譯碼算法還原數(shù)據(jù)。也就是說(shuō),最多允許M個(gè)數(shù)據(jù)分片丟失,數(shù)據(jù)也不會(huì)丟。
舉例來(lái)說(shuō),對(duì)于9+3模式來(lái)說(shuō),是將數(shù)據(jù)編碼成12個(gè)數(shù)據(jù)分片(注意不是切成12片,而是像加密一樣做數(shù)學(xué)編碼計(jì)算出這12片),每個(gè)數(shù)據(jù)分片的大小是原數(shù)據(jù)的1/9,這12個(gè)數(shù)據(jù)分片中最多允許丟失3個(gè)數(shù)據(jù)片,也能利用剩余的數(shù)據(jù)分片還原出原始數(shù)據(jù)。
數(shù)據(jù)冗余編碼會(huì)帶來(lái)一定的計(jì)算開(kāi)銷和元數(shù)據(jù)開(kāi)銷,但是數(shù)據(jù)冗余率(冗余后數(shù)據(jù)與原始數(shù)據(jù)的比例)極低,只有(N+M)/N,可靠性卻接近M副本。例如上例中9+3冗余的數(shù)據(jù)冗余率只有133%,但可靠性卻與3副本相當(dāng),而3副本的數(shù)據(jù)冗余率高達(dá)300%,僅僅硬盤的成本就是9+3冗余編碼的2倍還要多。
數(shù)據(jù)冗余編碼起源于通信領(lǐng)域,當(dāng)把一大塊數(shù)據(jù)切成很多數(shù)據(jù)包來(lái)逐次傳輸時(shí),這些數(shù)據(jù)包在過(guò)程中可能會(huì)出現(xiàn)錯(cuò)誤或者干脆整個(gè)數(shù)據(jù)包被丟掉。為了解決這一問(wèn)題,可以將原始數(shù)據(jù)幀編碼成帶冗余的新數(shù)據(jù)幀再進(jìn)行傳輸。目的節(jié)點(diǎn)接收到足夠多的數(shù)據(jù)幀后,便可解碼得到原始的數(shù)據(jù)幀。比如網(wǎng)絡(luò)的延時(shí)/丟包,硬盤損毀等問(wèn)題,就可以通過(guò)數(shù)據(jù)冗余編碼得到解決。
數(shù)據(jù)冗余編碼的主要功能是檢錯(cuò)、糾錯(cuò)和糾刪。檢錯(cuò)的意思是能識(shí)別數(shù)據(jù)差錯(cuò),糾錯(cuò)則更進(jìn)一步,不僅能識(shí)別數(shù)據(jù)差錯(cuò),還能糾正出錯(cuò)的數(shù)據(jù),這樣一個(gè)數(shù)據(jù)包在傳輸過(guò)程中出現(xiàn)數(shù)據(jù)錯(cuò)誤時(shí),也會(huì)被自動(dòng)糾正。糾錯(cuò)是有極限的,如果出錯(cuò)的數(shù)據(jù)包的數(shù)量超過(guò)了糾錯(cuò)能力,那就不能自動(dòng)糾錯(cuò)了。糾刪則是不僅能糾錯(cuò),而且能刪除超過(guò)糾錯(cuò)能力的數(shù)據(jù)。糾刪碼在也應(yīng)用在存儲(chǔ)領(lǐng)域中,但這么多年來(lái),存儲(chǔ)領(lǐng)域一直沿用的是通訊領(lǐng)域的糾刪碼,直到最近幾年,學(xué)術(shù)界開(kāi)始認(rèn)識(shí)到存儲(chǔ)領(lǐng)域與通訊領(lǐng)域的數(shù)據(jù)容錯(cuò)的需求有些詫異,開(kāi)始研究存儲(chǔ)專用的糾刪碼。
同樣是數(shù)據(jù)容錯(cuò)需求,在存儲(chǔ)領(lǐng)域和在通訊領(lǐng)域有什么差異呢?原來(lái),通訊領(lǐng)域的數(shù)據(jù)是實(shí)時(shí)傳輸?shù)?,如果傳輸?shù)臄?shù)據(jù)出現(xiàn)超出糾錯(cuò)能力的錯(cuò)誤,可以重發(fā)數(shù)據(jù)包,但在存儲(chǔ)領(lǐng)域,就不存在重發(fā)的機(jī)會(huì)了,因?yàn)樽x取數(shù)據(jù)的時(shí)候可能已經(jīng)是幾年以后了,到時(shí)萬(wàn)一發(fā)現(xiàn)了數(shù)據(jù)錯(cuò)誤,也不能重新存了。為了防止數(shù)據(jù)在存儲(chǔ)過(guò)程中逐年累計(jì)錯(cuò)誤(即Silent Data Corruption)最終超出糾錯(cuò)能力,存儲(chǔ)系統(tǒng)需要不斷驗(yàn)證數(shù)據(jù)是否正確(即心跳監(jiān)測(cè))并且重建(Rebuild)錯(cuò)誤的數(shù)據(jù)。通信是沒(méi)有重建需求的(可以用重發(fā)來(lái)代替),所以通信領(lǐng)域使用的糾刪碼就沒(méi)有針對(duì)重建需求的優(yōu)化設(shè)計(jì),而存儲(chǔ)領(lǐng)域需要針對(duì)重建需求進(jìn)行優(yōu)化,這就誕生了LRC(Locally Repairable Code)編碼。
常規(guī)的數(shù)據(jù)冗余編碼(包括糾刪碼)都是很多年前就被數(shù)學(xué)家所發(fā)明,例如常用的RS編碼(Reed-solomon codes)就是由 Irving S. Reed和Gustave Solomon在1960年發(fā)明的。但LRC編碼目前在國(guó)際上都屬于前沿領(lǐng)域,研究和應(yīng)用還非常少,例如中國(guó)最大的存儲(chǔ)廠商華為公司就將其作為最新賣點(diǎn)重點(diǎn)宣傳。
作為代表中國(guó)存儲(chǔ)技術(shù)最高水平之一的YottaChain,也采用了LRC編碼,并且還發(fā)明了自己的LRC編碼,稱為YTLRC編碼。“數(shù)據(jù)存儲(chǔ)有可靠、可用、安全這三個(gè)指標(biāo)。應(yīng)用LRC,我們要提高的便是可靠性。我們知道硬盤經(jīng)常會(huì)壞,壞了數(shù)據(jù)就丟了。系統(tǒng)層面上為了解決這個(gè)問(wèn)題,通常是在分布式存儲(chǔ)系統(tǒng)中存放數(shù)據(jù)的多個(gè)副本,例如各大公有云廠商普遍采用三副本模式,當(dāng)其中一份數(shù)據(jù)出現(xiàn)問(wèn)題,就利用其它復(fù)本進(jìn)行修復(fù)。但多副本模式的數(shù)據(jù)冗余率高,成本高,如果我們要存放大量對(duì)性能不敏感的冷數(shù)據(jù),就可以采用有輕微計(jì)算開(kāi)銷但能將成本大幅度降低的糾刪碼技術(shù)。例如YottaChain采用128+36的編碼方式,將每個(gè)數(shù)據(jù)塊用YTLRC編碼成164個(gè)數(shù)據(jù)分片,每個(gè)數(shù)據(jù)分片的大小是該數(shù)據(jù)塊的1/128,最多允許丟失36個(gè)數(shù)據(jù)分片也能恢復(fù)數(shù)據(jù),存儲(chǔ)成本只有相同可靠性的多副本模式的1/10都不到。作為廣域網(wǎng)存儲(chǔ),重建性能至關(guān)重要,為了提高重建性能,我們?cè)O(shè)計(jì)了先進(jìn)的YTLRC編碼,不僅在絕大多數(shù)情況下重建性能比傳統(tǒng)糾刪碼提高了10多倍,而且與其它LRC編碼相比,采用了兩維方式構(gòu)建LRC,這樣即使在特殊情況下,重建性能也能比傳統(tǒng)糾刪碼提高數(shù)倍”,王東臨介紹。
王東臨還透露了“YTLRC編碼”背后的故事,這是他在長(zhǎng)江學(xué)者、存儲(chǔ)編碼的學(xué)術(shù)界領(lǐng)袖西南交大的唐小虎教授指導(dǎo)下設(shè)計(jì)的。YTLRC繼承和發(fā)展了唐教授的學(xué)術(shù)成果,不僅在常規(guī)情況下(即一個(gè)數(shù)據(jù)塊只丟失了一個(gè)數(shù)據(jù)分片)數(shù)據(jù)重建性能可以提高16倍,而且在特殊情況下(即一個(gè)數(shù)據(jù)塊同時(shí)丟失多個(gè)數(shù)據(jù)分片)也能大幅提高數(shù)據(jù)重建性能。
作為15歲即以全國(guó)數(shù)學(xué)競(jìng)賽一等獎(jiǎng)(當(dāng)時(shí)還沒(méi)有奧數(shù))保送到南開(kāi)大學(xué)的天才少年,王東臨的數(shù)學(xué)功底非常扎實(shí),再加上大學(xué)期間對(duì)羅素、希爾伯特等數(shù)學(xué)大師的研究,使得王東臨具備了足夠?qū)I(yè)的學(xué)術(shù)研究能力,這是王東臨能迅速理解唐教授的科研成果并能在其基礎(chǔ)上發(fā)展的根本原因。
王東臨還特別提到唐小虎教授卓越的學(xué)者風(fēng)范:當(dāng)王東臨提出在YTLRC專利上給唐教授署名時(shí),被唐教授婉言謝絕了。唐教授認(rèn)為,雖然YTLRC得到其指導(dǎo),但具體技術(shù)方案是王東臨獨(dú)立設(shè)計(jì)的,他就不分享這個(gè)成果了。無(wú)奈之下,王東臨在YTLRC的開(kāi)源軟件上專門對(duì)唐教授表示了感謝。
YTLRC是底層的基礎(chǔ)編碼,一般來(lái)說(shuō)越“底層”也就越“困難”,它貫穿YottaChain整個(gè)分布式存儲(chǔ)系統(tǒng),負(fù)責(zé)數(shù)據(jù)的讀與寫,所以不容許出錯(cuò),不能有bug。再加上YottaChain是在臨近上線時(shí)才決定嘗試用LRC編碼來(lái)代替RS編碼的,時(shí)間有限又是不容出錯(cuò)。所以闊別15年沒(méi)有寫代碼的王東臨“重操舊業(yè)”,親力親為寫了一個(gè)月的代碼,直到將YTLRC編碼完成并且通過(guò)了百萬(wàn)次隨機(jī)測(cè)試。至今YTLRC已經(jīng)存儲(chǔ)了超過(guò)10PB的數(shù)據(jù),編解碼均正確無(wú)誤,充分說(shuō)明了一個(gè)老程序員的基本功。
僅僅用了兩年多的時(shí)間,創(chuàng)建于2018年8月的YottaChain就成長(zhǎng)為業(yè)界標(biāo)桿,王東臨坦言并無(wú)什么訣竅,而是日復(fù)一日,是如履薄冰、始終懷著敬畏,是打破常規(guī)思維的不破不立,而這一切從平凡又偉大的YTLRC編碼中都可見(jiàn)微知著。
(免責(zé)聲明:本網(wǎng)站內(nèi)容主要來(lái)自原創(chuàng)、合作伙伴供稿和第三方自媒體作者投稿,凡在本網(wǎng)站出現(xiàn)的信息,均僅供參考。本網(wǎng)站將盡力確保所提供信息的準(zhǔn)確性及可靠性,但不保證有關(guān)資料的準(zhǔn)確性及可靠性,讀者在使用前請(qǐng)進(jìn)一步核實(shí),并對(duì)任何自主決定的行為負(fù)責(zé)。本網(wǎng)站對(duì)有關(guān)資料所引致的錯(cuò)誤、不確或遺漏,概不負(fù)任何法律責(zé)任。
任何單位或個(gè)人認(rèn)為本網(wǎng)站中的網(wǎng)頁(yè)或鏈接內(nèi)容可能涉嫌侵犯其知識(shí)產(chǎn)權(quán)或存在不實(shí)內(nèi)容時(shí),應(yīng)及時(shí)向本網(wǎng)站提出書面權(quán)利通知或不實(shí)情況說(shuō)明,并提供身份證明、權(quán)屬證明及詳細(xì)侵權(quán)或不實(shí)情況證明。本網(wǎng)站在收到上述法律文件后,將會(huì)依法盡快聯(lián)系相關(guān)文章源頭核實(shí),溝通刪除相關(guān)內(nèi)容或斷開(kāi)相關(guān)鏈接。 )