Hybrid Blockchain Database Systems: Design and Performance(VLDB‘2022)



Abstract

随着混合区块链数据库系统的出现,我们旨在深入分析一些代表性系统之间的性能和权衡。为了实现这一目标,我们从头开始实施 Veritas 和 BlockchainDB。对于 Veritas,我们针对崩溃容错 (CFT) 和拜占庭容错 (BFT) 应用场景提供了两种风格。具体来说,我们用 Apache Kafka 实现 Veritas 来针对 CFT 应用场景,用 Veritas 和 Tendermint 来针对 BFT 应用场景。我们将这三个系统与 BigchainDB 的现有开源实现进行比较。 BigchainDB 使用 Tendermint 达成共识,并提供两种风格:一种具有区块链流水线的默认实现,以及一个包括区块链流水线和并行交易验证的优化版本。我们的实验分析证实,分布式数据库通常使用的 CFT 设计比特定于区块链的 BFT 设计表现出更高的性能。另一方面,我们的广泛分析突出了开发人员面临的各种设计选择,并阐明了在设计混合区块链数据库系统时需要进行的权衡。


提示:以下是本篇文章正文内容,下面案例可供参考

2 background and related work

在过去的几年里,在数据库会议上发表了一些将区块链和数据库集成在一起的作品 [22, 30, 31, 37, 42, 46]。 这样的系统使公司可以放心地开展业务,因为每个数据库操作都由分布式分类帐跟踪。 但是,不同的业务场景有不同的需求,因此针对不同的应用场景构建了很多混合区块链数据库系统。 在本节中,我们将描述现有的混合区块链数据库系统,并简要提及一些可以归类为分类帐数据库的类似系统。

2.1 混合区块链数据库系统

Veritas [22] 是一种共享数据库设计,它集成了底层区块链(分类帐)以保持可审计和可验证的证明。数据库和区块链之间的交互是通过验证者完成的。验证者从数据库中获取事务日志,做出正确性检查决定,并将其发送给其他验证者。所有验证者同意的最终决定都记录在区块链上。因此,可以根据存储在区块链中的历史记录来验证数据的正确性。
我们选择在本文中实现的 Veritas [22] 的替代设计使用共享可验证表作为其密钥存储。在这种设计中,每个节点都有共享表的完整副本和分布式账本形式的防篡改日志,如图1所示。账本存储共享表的更新(写入)日志。每个节点通过广播服务发送其本地日志并接收远程日志。 Veritas 的可验证表设计使用基于时间戳的并发控制。事务的时间戳作为事务日志的序列号,每个节点都有提交日志序列的水印。当一个事务请求被发送到一个节点时,它首先在本地执行事务并将结果缓存在内存中。然后,它通过广播服务将事务日志发送到其他节点。节点在收到所有其他节点的批准后立即刷新事务缓冲区并更新已提交日志的水印。

BigchainDB [42] 使用 MongoDB [3] 作为其存储引擎。 即每个节点都维护自己的本地MongoDB数据库,如图2所示。使用MongoDB是因为它对资产的支持,这是BigchainDB中的主要数据抽象。 Tendermint [8] 用于 BigchainDB 中节点之间的共识。 Tendermint 是一种 BFT 共识协议,它保证当一个节点被恶意黑客控制时,其他节点中的 MongoDB 数据库不会受到影响。 当一个节点收到用户的更新请求时,它首先在本地生成结果,并提出一个交易提案,通过 Tendermint 发送给其他节点。 一旦 BigchainDB 中的大多数节点就该事务达成共识,节点就会提交缓冲的结果并响应用户客户端。
BlockchainDB [30] 采用了在区块链之上构建共享数据库的设计。 它不同于其他系统,因为它将数据库划分为几个分片,如图 3 所示,从而降低了整体存储开销。 虽然节省了一些存储空间,但这种设计会导致更高的延迟,因为数据请求可能需要进行额外的查找来定位相应的分片。 在 BlockchainDB 中,每个对等点都集成了一个分片管理器来定位特定密钥所在的分片。 在验证方面,它提供同步(在线)和异步(离线)验证,分批完成。
FalconDB [46] 是一个通过要求服务器节点和客户端都保留数据摘要来提供可审计性和可验证性的系统。 FalconDB 的服务器节点保存共享数据库和记录共享数据库更新日志的区块链。 客户端节点只保存服务器节点保存的区块链的块头。 使用这些标头,客户端能够验证从服务器节点获得的数据的正确性。 这些客户端节点充当用户和实际数据库之间的中介。
ChainifyDB [37] 提出了一种新的事务处理模型,称为“Whatever-Ledger Consensus”(WLC)。 与其他处理模型不同,WLC 不对本地数据库的行为做出任何假设。 WLC的主要原则是寻求交易效果的共识,而不是交易的顺序。 当 ChainifyDB 服务器接收到来自客户端的交易时,它会向协议服务器请求帮助以验证交易,然后将交易提议发送到排序服务器。 排序服务器将提案按 FIFO 顺序分批成一个块,并通过 Kafka [20] 分发该块。 当交易被共识服务器批准后,最终会在执行服务器的底层数据库中按顺序执行。

在高层次上,区块链关系数据库 [31] 与 Veritas [22] 非常相似。 然而,在区块链关系数据库 [31] (BRD) 中,共识用于对交易块进行排序,而不是在单个块内序列化交易。 BRD 块中的事务与每个节点上的可序列化快照隔离(SSI)同时执行,并且它们被串行验证和提交。 PostgreSQL [5] 支持 Serializable Snapshot Isolation,被用作 BRD 中的底层存储引擎。 事务在所有“不受信任的”数据库上独立执行,但随后它们通过排序服务以相同的可序列化顺序提交。

2.2 账本数据库Ledger DB

与混合区块链数据库系统不同,分类帐数据库 [6、12、26、44、48] 是集中式的,因为分类帐由单个组织保存。 在本文中,我们简要描述了一些现有的分类帐数据库。 然而,我们并没有评估和分析他们的表现。

Amazon Quantum Ledger Database [6] (QLDB) 包含一个不可变的日志,它以精确和顺序的方式记录每个数据更改。 日志由仅附加的块组成,这些块排列在哈希链中。 这意味着数据只能附加到日志中,不能被覆盖或删除。 整个日志被设计成一个 Merkle Tree,允许用户追踪和检查数据变化的完整性。

Immudb [12] 是一个轻量级、高速的不可变数据库,具有内置的密码证明和验证功能。 Immudb 是用纯 Go 编写的,使用 BadgerDB [17] 作为其存储引擎。 Badger 是一个用纯 Go 实现的快速键值数据库,它使用 LSM 树结构。 Immudb 通过在内部使用 Merkle Tree 结构来保证不变性,其中数据使用 SHA-256 进行哈希处理。此外,immudb 构建了一个一致性检查器来定期检查数据的正确性。

Spitz [48] 是一个支持防篡改的账本数据库
和不可变的交易日志。 它使用 Forkbase [43] 作为其底层存储,为数据提供了类似 git 的多版本控制。 Spitz 提供用于存储数据的单元存储和用于存储交易日志的仅附加分类帐。 此外,它基于账本构建默克尔树以提供可验证性。

LedgerDB [44] 是阿里巴巴集团的集中式数据库。 它使用 TSA 时间公证锚来提供可审计性。 这些锚点是由双向 peg 协议生成的 [41]。 与之前的账本数据库相比,LedgerDB 的不同之处在于它不仅支持创建、更新和查询方法,还支持可验证数据的清除和隐匿方法。 通过这些方法,LedgerDB 旨在满足现实世界的需求。 但是,它可能会破坏不变性,同时提供强大的可验证性。 至于底层存储,LedgerDB 支持包括 HDFS [39] 在内的文件系统、RocksDB [2] 等键值存储、Merkle Patricia Tree [47] 和称为 L-Stream [44] 的线性结构的仅追加文件系统 这是专为 LedgerDB 设计的。

2.3 总结

总而言之,混合区块链数据库是分散式系统,具有三个关键组件,即(1)使用 MySQL、MongoDB、Redis 等存储引擎的共享数据库,(2)通过共识机制复制的共享账本 例如 Kafka (CFT) 和 Tendermint (BFT) 等,以及 (3) 通常支持简单的键值 (KV) 存储和 put 和 get 操作的用户界面 (API)。 在表 1 中,我们总结了现有混合区块链数据库系统用于这三个关键组件的技术。

四、Performence analysis

在本节中,我们将分析上一节中描述的五个系统的性能,即 Veritas(Kafka)、Veritas(TM)、BigchainDB、BigchainDB(PV)和 BlockchainDB。 接下来,我们描述实验设置。

4.1实验设置setup

所有实验均在 Ubuntu 18.04 操作系统(OS)下的本地机器上执行。该机器有 256 个物理 CPU 内核、8 TB RAM 和 3 TB 硬盘 (HDD) 存储。使用iostat工具,机器的IOPS估计为5.35。被测系统的所有服务器和客户端节点都在这台机器上运行在不同 CPU 内核上的 Docker 容器中。

为了评估五个被测系统的性能,我们向每个系统发送了 100,000 个treansaction。我们基于代表客户端数量的并发参数将多个事务并行发送到系统。事务被平均分配到系统中的不同服务器节点。为了计算吞吐量,我们记录了第一个事务的开始时间和所有事务的完成时间。然后,我们记录成功提交的事务的数量,并通过将此数字除以先前记录的时间间隔来计算吞吐量。请注意,我们在计算吞吐量时只考虑成功的事务,但也可能存在失败。我们将每个实验重复 3 次并报告平均值。在执行事务之前,我们将 100,000 个 1,000 字节的键值记录加载到每个系统中。

我们使用雅虎!云服务基准 [13] (YCSB) 数据集它被广泛用于对数据库和区块链进行基准测试 [19, 35]。 YCSB 支持常见的数据库操作,例如写入(插入、修改和删除)和读取。虽然 YCSB 定义了六个工作负载,但在我们的实验中,我们选择了这六个工作负载中的三个。这三个工作负载是 (i) 工作负载 A,由 50% 的更新操作和 50% 的读取操作组成,(ii) 工作负载 B,由 5% 的更新操作和 95% 的读取操作组成,以及 (ii) 工作负载 C,由 100 个% 读取操作。此外,我们使用了三种密钥分布,即(i)均匀分布在所有键上均匀操作,(ii)zipfian 分布,它仅在键的子集上频繁操作,以及(iii)最新分布对最近使用的键进行操作。我们默认使用 Workload A 和均匀分布,除非另有说明。
基准测试工具由我们在 Go 中使用goroutines [14] 和一个通道 [14] 作为并发安全请求队列。通道允许 goroutine 在没有显式锁或条件变量的情况下进行同步。每个基准测试客户端都由一个 goroutine 表示,一旦完成当前请求,它就会从通道获取新请求。

一、pandas是什么?

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、使用步骤

1.引入库

代码如下(示例):

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import  ssl
ssl._create_default_https_context = ssl._create_unverified_context

2.读入数据

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。


总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

猜你喜欢

转载自blog.csdn.net/weixin_41523437/article/details/124555901