BNB Chain 近日为其 BNB 智能链(BSC)Geth 节点推出了一种新的多数据存储解决方案,旨在解决由于数据量迅速增加而引起的性能低效问题。据 BNB Chain Blog 称,这种新方法解决了与混合数据存储模式、查询效率降低以及单一键值数据库内优化冲突有关的问题。
当前挑战
目前,BSC 节点数据存储在单一键值数据库实例中,并通过不同前缀进行分类。这种设置导致了若干问题:
- 由于存储不同模式的数据混杂在一起,性能低效。
- 随着数据库规模的增长,特别是执行过程中,查询效率降低。
- 无法针对不同的数据模式优化数据库参数,因为读写优化往往存在冲突。
现有的存储模式包括一个单一的 KV 存储和两个 Ancient 存储,分别处理不同类型的数据访问模式。
提议的解决方案
多数据库方法
新解决方案将区块链数据分隔成三个独立的数据库:块数据库、Trie 数据库和快照数据库,每个数据库都根据特定的数据架构和访问行为设计。
- 块数据库: 存储块相关数据,如头部、主体、收据、难度和历史块数据。
- Trie 数据库: 包含当前状态和大约 90,000 个区块的历史状态数据的所有 Trie 节点。
- 快照数据库: 存储快照数据、交易索引、合约代码及其他元数据。此数据库以读取为主,并在块执行过程中频繁访问。
文件结构
新文件结构包括 chaindata/ 文件夹中的原始数据库,并引入新的 block/ 和 state/ 文件夹分别存储块和 Trie 数据。此外,每个目录下还包括一个用于存储历史数据的 ancient 文件夹。
影响与性能
多数据库方法预计将提升 BSC 节点的性能、可扩展性和可维护性。通过根据数据架构和访问行为分隔数据库,解决方案旨在减少读/写延迟并改善整体区块链性能。
块数据库
块数据库将在迁移到 ancient 数据库之前,将最近的区块存储在键值数据库中,减少磁盘带宽使用。BNB Chain 计划在键值数据库中仅保留 20-30 个最近的区块,而不再是先前的 90,000 个区块,以符合其权益证明-权威共识机制。
Trie 数据库
Trie 数据库将处理快速增长的 Merkle Patricia Trie (MPT) 节点。此分离将减少数据库压缩成本并提高读/写速度,从而提升块执行和验证性能。
快照数据库
通过将快照数据隔离到其自己的数据库中,BNB Chain 旨在减少日志结构合并 (LSM) 树的深度,提高读/写性能。在区块链执行期间,频繁访问快照数据将受益于这种减少的延迟。
测试结果
在带有 Geth v1.3.10 的 EC2 m6i.4xlarge 机器上进行的测试显示显著的性能提升。多数据库设置在数据库分布到多个磁盘时,明显优于单一数据库模型。
ETH 采用
这种多数据库解决方案也将贡献给以太坊 Geth 客户端。与 Geth 开发者的讨论正在进行中,预计在合并拉取请求后,此功能将成为以太坊 Geth 客户端的一部分。
展望未来
随着区块链数据的持续增长,BNB Chain 强调为不同类型数据构建高效存储模型的重要性。多数据库支持有助于独立存储状态数据,为高性能状态数据引擎铺平道路。此举旨在使 BSC 网络更健壮和高效。
Image source: Shutterstock