如果把体系庞大的计算机科学领域比作一台机器,那么每个程序员的作用都不过是一颗螺丝钉,没有面面俱到,只有精诚协作。程序员早已不是非得在C位,写出经典、传世,改变历史的编码才能够上优秀,对于需要大量复杂程序设计的新兴技术,往往越是做扎实的基础研究,越靠近底层,所做的贡献就越大。存储公链YottaChain创始人王东临就用自己的实践证明了这一点。
“YottaChain的LRC编码是我亲自写的,在此之前,我已经15年不需要写代码了。”
“这是YottaChain中最重要的代码吗?”
“它不是,但是没它不行。它很关键。”
那么LRC是什么?YottaChain的LRC编码又有什么独特之处?
王东临介绍:LRC是一种纠删码(Erasure Code,简称EC码),纠删码是一种非常强大的数据冗余编码。数据冗余编码的专业术语是前向纠错的分组差错控制编码,可以用N+M来表示,即将数据用该算法编码成N+M个数据分片(Shard),每个数据分片1/N大小,只需要其中N个数据分片就能用对应的译码算法还原数据。也就是说,最多允许M个数据分片丢失,数据也不会丢。
举例来说,对于9+3模式来说,是将数据编码成12个数据分片(注意不是切成12片,而是像加密一样做数学编码计算出这12片),每个数据分片的大小是原数据的1/9,这12个数据分片中最多允许丢失3个数据片,也能利用剩余的数据分片还原出原始数据。
数据冗余编码会带来一定的计算开销和元数据开销,但是数据冗余率(冗余后数据与原始数据的比例)极低,只有(N+M)/N,可靠性却接近M副本。例如上例中9+3冗余的数据冗余率只有133%,但可靠性却与3副本相当,而3副本的数据冗余率高达300%,仅仅硬盘的成本就是9+3冗余编码的2倍还要多。
数据冗余编码起源于通信领域,当把一大块数据切成很多数据包来逐次传输时,这些数据包在过程中可能会出现错误或者干脆整个数据包被丢掉。为了解决这一问题,可以将原始数据帧编码成带冗余的新数据帧再进行传输。目的节点接收到足够多的数据帧后,便可解码得到原始的数据帧。比如网络的延时/丢包,硬盘损毁等问题,就可以通过数据冗余编码得到解决。
数据冗余编码的主要功能是检错、纠错和纠删。检错的意思是能识别数据差错,纠错则更进一步,不仅能识别数据差错,还能纠正出错的数据,这样一个数据包在传输过程中出现数据错误时,也会被自动纠正。纠错是有极限的,如果出错的数据包的数量超过了纠错能力,那就不能自动纠错了。纠删则是不仅能纠错,而且能删除超过纠错能力的数据。纠删码在也应用在存储领域中,但这么多年来,存储领域一直沿用的是通讯领域的纠删码,直到最近几年,学术界开始认识到存储领域与通讯领域的数据容错的需求有些诧异,开始研究存储专用的纠删码。
同样是数据容错需求,在存储领域和在通讯领域有什么差异呢?原来,通讯领域的数据是实时传输的,如果传输的数据出现超出纠错能力的错误,可以重发数据包,但在存储领域,就不存在重发的机会了,因为读取数据的时候可能已经是几年以后了,到时万一发现了数据错误,也不能重新存了。为了防止数据在存储过程中逐年累计错误(即Silent Data Corruption)最终超出纠错能力,存储系统需要不断验证数据是否正确(即心跳监测)并且重建(Rebuild)错误的数据。通信是没有重建需求的(可以用重发来代替),所以通信领域使用的纠删码就没有针对重建需求的优化设计,而存储领域需要针对重建需求进行优化,这就诞生了LRC(Locally Repairable Code)编码。
常规的数据冗余编码(包括纠删码)都是很多年前就被数学家所发明,例如常用的RS编码(Reed-solomon codes)就是由 Irving S. Reed和Gustave Solomon在1960年发明的。但LRC编码目前在国际上都属于前沿领域,研究和应用还非常少,例如中国最大的存储厂商华为公司就将其作为最新卖点重点宣传。
作为代表中国存储技术最高水平之一的YottaChain,也采用了LRC编码,并且还发明了自己的LRC编码,称为YTLRC编码。“数据存储有可靠、可用、安全这三个指标。应用LRC,我们要提高的便是可靠性。我们知道硬盘经常会坏,坏了数据就丢了。系统层面上为了解决这个问题,通常是在分布式存储系统中存放数据的多个副本,例如各大公有云厂商普遍采用三副本模式,当其中一份数据出现问题,就利用其它复本进行修复。但多副本模式的数据冗余率高,成本高,如果我们要存放大量对性能不敏感的冷数据,就可以采用有轻微计算开销但能将成本大幅度降低的纠删码技术。例如YottaChain采用128+36的编码方式,将每个数据块用YTLRC编码成164个数据分片,每个数据分片的大小是该数据块的1/128,最多允许丢失36个数据分片也能恢复数据,存储成本只有相同可靠性的多副本模式的1/10都不到。作为广域网存储,重建性能至关重要,为了提高重建性能,我们设计了先进的YTLRC编码,不仅在绝大多数情况下重建性能比传统纠删码提高了10多倍,而且与其它LRC编码相比,采用了两维方式构建LRC,这样即使在特殊情况下,重建性能也能比传统纠删码提高数倍”,王东临介绍。
王东临还透露了“YTLRC编码”背后的故事,这是他在长江学者、存储编码的学术界领袖西南交大的唐小虎教授指导下设计的。YTLRC继承和发展了唐教授的学术成果,不仅在常规情况下(即一个数据块只丢失了一个数据分片)数据重建性能可以提高16倍,而且在特殊情况下(即一个数据块同时丢失多个数据分片)也能大幅提高数据重建性能。
作为15岁即以全国数学竞赛一等奖(当时还没有奥数)保送到南开大学的天才少年,王东临的数学功底非常扎实,再加上大学期间对罗素、希尔伯特等数学大师的研究,使得王东临具备了足够专业的学术研究能力,这是王东临能迅速理解唐教授的科研成果并能在其基础上发展的根本原因。
王东临还特别提到唐小虎教授卓越的学者风范:当王东临提出在YTLRC专利上给唐教授署名时,被唐教授婉言谢绝了。唐教授认为,虽然YTLRC得到其指导,但具体技术方案是王东临独立设计的,他就不分享这个成果了。无奈之下,王东临在YTLRC的开源软件上专门对唐教授表示了感谢。
YTLRC是底层的基础编码,一般来说越“底层”也就越“困难”,它贯穿YottaChain整个分布式存储系统,负责数据的读与写,所以不容许出错,不能有bug。再加上YottaChain是在临近上线时才决定尝试用LRC编码来代替RS编码的,时间有限又是不容出错。所以阔别15年没有写代码的王东临“重操旧业”,亲力亲为写了一个月的代码,直到将YTLRC编码完成并且通过了百万次随机测试。至今YTLRC已经存储了超过10PB的数据,编解码均正确无误,充分说明了一个老程序员的基本功。
仅仅用了两年多的时间,创建于2018年8月的YottaChain就成长为业界标杆,王东临坦言并无什么诀窍,而是日复一日,是如履薄冰、始终怀着敬畏,是打破常规思维的不破不立,而这一切从平凡又伟大的YTLRC编码中都可见微知著。
(免责声明:本网站内容主要来自原创、合作伙伴供稿和第三方自媒体作者投稿,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证有关资料的准确性及可靠性,读者在使用前请进一步核实,并对任何自主决定的行为负责。本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。
任何单位或个人认为本网站中的网页或链接内容可能涉嫌侵犯其知识产权或存在不实内容时,应及时向本网站提出书面权利通知或不实情况说明,并提供身份证明、权属证明及详细侵权或不实情况证明。本网站在收到上述法律文件后,将会依法尽快联系相关文章源头核实,沟通删除相关内容或断开相关链接。 )