乐读窝

区块链浪潮:连接技术与应用

乐读窝 > 科普学习 > 区块链浪潮:连接技术与应用

第8章 分片技术

书籍名:《区块链浪潮:连接技术与应用》    作者:贾英昊



8.1  数据分片的概念


传统概念里的分片技术是将数据库分割成多个碎片并放置在不同的服务器上。在现代的云服务中,数据常常被托管在不同站点并进行分区。这一做法的原因包括使多台计算机之间的负载平衡,进而提高可扩展性;通过多站点存储数据,来提高可用性等。

而区块链分片技术则是基于数据库分片概念的一种扩容技术。

无论在区块链领域,还是数据库领域,分片时要进行的第一步工作都是提取数据的关键特征值,并将关键特征值按照一定的规则来划分给不同的碎片进行处理。关键特征值的选择非常重要,它关系着数据的唯一性保障以及分片的效果。关于特征值的选取方法,一个言简意赅的标准:“以你所认为的基本数据模式为标准”。因此在区块链项目中经常可以看到分片的依据是用户的私钥/账户地址等,因为这些值是唯一的且不随时间改变的,分片时逻辑比较清晰。



8.2  传统数据库的分片方式


传统数据库的分片主要有三种方式:

(1)哈希运算后取模:例如规定全网络划分为  3  个分片,则将数据经过哈希运算后用  3  求模,根据结果分配至特定的碎片,此种策略的目的是减少分片负载不均衡的发生,因为哈希函数计算出来的结果毫无规律,也就打破了因为一些关键特征值和负载的量相关的情况,因此数据更有可能均匀分散于各个分片之间。一个反例则是,如果数据的关键特征值是注册时间顺序的话,刚注册的数据更为活跃,则有可能会把它们都分到某一个分片里。但是这一方法的缺点在于如果有新的分片加入,重新平衡分片比较困难;其优点则在于不需要额外维护状态信息。

(2)一致性哈希:无虚拟节点的一致性哈希方式是指数据按照特征值映射到首尾相连的哈希环上,同时也将节点按照一定规则映射上去,数据顺时针找到的第一个节点为其所存储的节点。有虚拟节点的一致性哈希和此类似,不过是将虚拟节点映射到哈希环上,因此,一个实际的物理节点可以占据哈希环上的多个范围。此种方法需要维护状态信息,也就是数据具体被分到哪个节点了,但是优点在于如果碎片的数目需要增加,则重新平衡分片更为容易。但是分片状态信息的维护需要考虑一致性问题,较为复杂。

(3)人为划分区间:按照关键特征值划分成不同区间,每个节点对应一个或多个区间,类似一致性哈希的方式,也需要维护状态信息。



8.3  分片中的一致性挑战


在区块链技术中,需要有机制来知道哪个节点实现了哪个分片,在传统数据库系统中分片信息(即元数据,指哪些数据划分到了哪个碎片内)一般需要专门的服务器存储,有时为了减轻元数据服务器的压力,分布式系统会在其他节点缓存元数据。在区块链中的思路也大体一致,需要保证在节点之间缓存的元数据的一致性,或者引入一个类似的主服务器来保证性能,但这些方案都需面对数据一致性的挑战。

多个副本的一致性、可用性是  CAP  理论讨论的范畴,主要有两种可用的方案。

第一种是主从同步,首先选出主服务器,只有主服务器提供对外服务,主服务器将元数据的更新信息以日志的方式存至某个共享的存储空间,然后从服务器从共享存储空间读取日志并应用,达到与主服务器一致的状态,如果主服务器被检测到故障,那么会重新选出新的主服务器。

在网络分割的情况下,有可能出现大家认为原来的主服务器已经宕机了,就选举出新的主服务器,但是原来的主服务器还在继续提供服务的“双主”现象。为了解决这种问题,需要想办法把旧的主服务器隔离,使其不能正常对外提供服务。为了保证元数据的强一致性,在准备进行切换的时候,新的主服务器必须要在确认元数据完全同步之后,才能继续对外提供服务。

为了达到这个目的,一种方式是当元数据变化时,立即通知所有的缓存服务器,并锁定数据,如果系统要完成的任务需要多个碎片里同时对状态进行更新,那么在更新完成之前,访问将被拒绝。另一种在高度可扩展的NoSQL数据库中经常实现的复制数据之间保持高度一致性的方法是使用读写仲裁和版本控制。这种方法避免了锁定数据,代价是读取和写入数据的过程中会带来额外的复杂度。

第二种方式是通过分布式一致性协议来达到多个副本件的一致,如  Paxos和Raft协议,协议可以实现所有备份均提供对外服务,并且保证强一致性。



8.4  区块链技术下的分片方式


在区块链网络中,根据对象的不同,技术可分为状态分片、交易分片和网络分片。其中,网络分片采用较多的技术方案。

区块链的状态分片是指每个节点只存储了一部分的区块链状态信息,需要解决的一致性问题与上述类似。

而交易分片的实现更为简单。在基于账户的区块链系统中,每一笔交易将会有一个发送者的地址,然后系统可以根据发送者的地址分配一个碎片。这确保了两笔双花交易将在相同的碎片中得到验证,因此系统可以很容易地检测到双花交易,而不需要进行任何跨碎片的通信。如果节点是确定的,那么几乎不存在上述讨论的元数据的更新带来的问题。但是如果交易验证时涉及跨碎片之间的通信,通常成本很高,将影响网络的吞吐量和经济效益。

区块链的网络分片指将矿工划分成几个组,同时验证交易,提高系统并行处理交易的能力。通常可以通过定期以随机数生成来决定选取达成共识的节点,将其映射到已经编好号的分片中。但是如果有节点宕机,重新分配节点时,就需要在分片之间形成一致性共识。

值得注意的是,在区块链中采用网络分片技术,也就是将矿工分成几个子网络分别负责验证该碎片上的交易,需要保证恶意节点的数目足够小,因此在分配矿工的规则上注意保证随机性。



8.5  小结


分片技术的关键在于由于每个片区里的数据是分开更新的,在设计应用逻辑时,必须确保在平衡效率的前提下,对信息进行成功更新,同时也需要预留出一定的鲁棒性,来应对达成最终一致性过程中可能出现的问题。在区块链中应用分片技术,还需要考虑的问题是对各种攻击如女巫攻击、DDOS  攻击、双花攻击的防御,需要在权衡效率的同时,保证每个分片内的总节点数目足够多,并且诚实的节点占大多数,分片技术对安全性要求极高,同时,区块链系统中的节点数目比传统数据库中的可能要多,并且面临带宽的限制,需要充分考虑到延迟带来的不一致性导致的性能和安全性问题,因此很少有落地的相关项目。需要在大规模的网络中进行长时间的测试验证,并结合严谨的理论方案证明,才能令人信服。