你们以为分片(Sharding)真的是什么新技术吗

「性能」问题一直是区块链发展的瓶颈,以太坊每秒几十笔交易的速度,远远满足不了现实世界的需求。自从V神提出以分片技术(Sharding)来解决以太坊性能之后,分片技术逐渐被各个区块链项目引用,被誉为「解决性能的最佳方案」。
 
其实,分片技术并不是什么新概念,事实上在数据库领域,分片技术已经得到非常成熟的应用。本文尽量通俗的语言来讲解Sharding技术,让大家可以理解,为什么Sharding可以解决区块链的性能问题。
数据库分片技术
实质上分片的概念源自于数据库的分区表理念,我们首先简单介绍一下分区表:
 
在传统的IT架构中,数据库负责存储业务数据,比如我们打电话时,手机号、通话时长、话费余额等等信息数据,就存在IT架构的数据库中。因此,随着业务的不断发展,数据库随着访问压力逐渐加大,进而引发系统无法使用的问题。我在大学毕业后,一直从事于基础软件领域的研究和工作,已经有10多年的时间,其中一个很重要的职责就是保障数据库的稳定运行,当数据库不能工作时(宕机),无论前端的应用服务器有多少备份,系统整体上都是不可用状态的,所以数据库是IT系统的重中之重。

你们以为分片(Sharding)真的是什么新技术吗

当然,出现问题的原因是非常复杂的,其中很重要的一个原因就是单个数据库表过热,我们可以举个例子来理解这个概念,比如超市购物结算时,结算台的数量是有限的,这个时候人多就要排队,就需要等待。数据库表就像超市的结算台,当业务高峰来临的时候,它就成为紧俏的资源,当访问表需要排队的时候,系统的就会缓慢。我们称这个现象为「热表」。
 
在超市中,管理员可以大喊一嗓子说,大家排一下队,慢慢来。但是在IT系统中,情况完全不同,访问网页或者打卡App多等待2秒,用户就会不耐烦,甚至直接离开,而解决这个问题的一个很重要的办法,就是分区表。

你们以为分片(Sharding)真的是什么新技术吗

所谓分片技术,其实就是要把数据放到不同的数据库和主机上。但是分片也带来了一些新的问题,我们首先要考虑的就是分片策略,也就是说哪些数据该放哪一个DB上,总要有个规矩。
典型的分片策略,有这么几种:
·基于 用户id 的区间分片,例将用户 id 为 1-10W 的数据存放在 A 数据库,10W-20W 的数据存放在 B 数据库。
·基于 id 的 Hash 分片,例如将 id%2=0 的数据存放在 A 数据库,id%2=1 的数据放在 B 数据库。
·基于时间的区间分片,对于有一些业务场景,比如银行账单查询,新数据被操作的几率更大,旧数据几乎不会被操作,可以通过数据的插入时间进行分片(也称为冷热分离)。所以银行的App里面要查询超过3个月的数据,总会让用户多操作几下,想查询超过1年的,几乎不太可能,那个分区的数据已经变成冷数据刻在磁带上放到仓库了。
·基于检索表分片,建立一张检索表保存 id 与所在数据库节点的对应关系,就像是书的目录一样。
·基于地理位置分片,像大众点评、滴滴打车之类的软件,由于不同城市的数据不需要互通,可以按照城市分片,将不同城市的数据存放在不同数据库中,这样做的一个优点是可以将数据库服务器部署到离对应城市最近的节点上,还可以提高访问速度。
 
总而言之,分区想要用的好,需要系统架构师根据业务特点来优化分区策略。也可以理解,为什么这几年系统架构师的收入,迅速在增长。
区块链的分片技术


下面,我们来介绍一下区块链的分片技术,我们拿以太坊为例,V神采用的是二次分片策略。其实,这个是很容易理解的东西,假设一个节点能处理N个交易,那么主链能追踪N个分片,每个分片都能处理N个交易,所以系统一共能处理N的2次方个交易。
 
在二次分片中,以太坊将链分成主链和分片两个部分,当交易没有涉及跨片时,则在所属分片区域自行验证完成。这样的设计主链只记录少量信息,从而实现主链记录N个分片的信息,每个分片可以实现实现N个交易的管理。

你们以为分片(Sharding)真的是什么新技术吗

但是问题是:分片之后,每个分片各自管理自己的交易,速度得到提升,但是如果要给好友转账,而很不幸被分到了不同的链上,这个转账该如何实现呢?在以太坊中,V神设计了收据的概念,来解决这个问题,如下图所示。

你们以为分片(Sharding)真的是什么新技术吗

两个分片中。这样就可以完成全局交易的信息收集。因为大部分交易不需要通过主链完成,同时主链只存储少量信息,所以这样的设计即保证跨片交易可以顺利完成,又能大大提升以太坊的整体性能。