Skip to main content

数据管理

Managing the data on your Sui Full node is critical to ensuring a healthy Sui network. This topic provides a high-level description of data management on Sui Full nodes that you can use to optimize your Full node configuration. For more information about Sui Full nodes, such as pruning policies and archival settings, see Run a Sui Full Node.

基本 Sui 全节点功能

Sui 全节点的最小版本执行所有 Sui 验证人提交的交易。Sui 全节点还协调将新交易提交到系统:

Basic Sui Full node functionality

上图显示了数据如何通过全节点流动:

  1. State sync 协议: Sui 全节点执行以下操作以实现状态同步:
    • 通过点对点类似的 p2p 协议检索有关已提交检查点的信息
    • 本地执行交易以验证效果是否与验证人的法定数量认证的效果相匹配
    • 根据最新的对象值更新本地状态。
  2. RPC: Sui 全节点暴露 Sui RPC 端点,用于查询系统的最新状态,包括最新的状态元数据(如 sui_getProtocolConfig)和最新的状态对象数据(sui_getObject)。
  3. 交易提交: 每个 Sui 全节点协调将交易提交到 Sui 验证人的法定数量,并且如果配置的话,本地执行已完成的交易(称为快速路径执行),从而绕过等待检查点同步的过程。

Sui 全节点数据和 RPC 类型

Sui 全节点在其永久存储中存储多个类别的数据。

info

每个纪元的 Sui 存储超出了本主题的范围。Sui 在内部使用每个纪元存储(在每个纪元开始时重置)用于授权和共识操作。

Sui 全节点存储以下类型的数据:

  1. 具有关联效果和事件的交易: Sui 使用唯一的交易摘要检索有关交易的信息,包括其效果和发出的事件。Sui 全节点不需要基本全节点操作的历史交易信息。为了节省驱动器空间,你可以启用修剪以删除此历史数据。
  2. 检查点: Sui 将已提交的交易分组到检查点中,然后使用这些检查点实现状态同步。检查点保留包含附加完整性元数据的交易摘要。 Sui 全节点不需要来自检查点的数据来执行和提交交易,因此你也可以为此数据配置修剪。
  3. 对象: 变异对象的交易创建新的对象版本。每个对象都有一个唯一的 (objectId, version) 对,用于标识该对象。Sui 全节点不需要历史对象版本来执行和提交交易,因此你也可以配置全节点来修剪此数据。
  4. 索引信息: 默认情况下,全节点会对已提交的交易进行后处理:它索引已提交的信息以实现高效的聚合和过滤查询。例如,索引对于检索给定发送方的所有历史交易或查找由地址拥有的所有对象可能是有用的。

Sui 全节点支持超过 40 种 RPC 类型,其中包括以下类别:

  • 一般元数据,如 sui_getProtocolConfigsui_getChainIdentifier。这些请求不依赖于额外的索引,也不需要历史数据来处理。
  • 直接查找,如 sui_getObjectsui_getEvents。这些请求不依赖于额外的索引,但在某些情况下需要历史数据,如 sui_tryGetPastObjectsui_getTransactionBlock
  • 累积和过滤查询,如 suix_getOwnedObjectssuix_getCoins。这些请求依赖于额外的索引,并在某些情况下需要历史数据,如 suix_queryTransactionBlocks
info

Sui 计划在不久的将来将需要额外索引的 RPC 端点从 Sui 全节点中迁移出去。这个计划将事务执行的后台存储与更适合数据索引的存储分离。

Sui 档案数据

Sui 档案实例以与数据库无关的格式存储自创世以来的完整 Sui 交易历史。这包括有关交易(带有客户端身份验证)、效果、事件和检查点的信息。因此,档案存储可用于数据审计和重播历史交易。

info

当前的档案存储格式不包括历史对象版本。

作为全节点操作员,你可以通过指定上传档案数据的 URL 来为你的全节点启用档案回退。目前,Mysten Labs 管理一个 Sui 档案并将其存储在 AWS S3 中。为了确保网络的健康,我们鼓励 Sui 社区设置额外的档案以确保在整个网络中的档案数据可用性。在典型的配置中,一个档案大约滞后最新检查点约 10 分钟。

从头开始的全节点可以通过 配置档案回退fullnode.yaml 配置文件中指向存储档案的 S3 存储桶来重播(从而重新验证)自 Sui 创世以来发生的交易。

如果 Sui 全节点无法从其对等节点通过状态同步协议中检索检查点,则会回退到从其预配置的档案中下载缺失的检查点。这种回退使得全节点能够赶上系统的其余部分,而不受其对等体的修剪策略的影响。

Sui 全节点修剪策略

如前所述,持续的磁盘使用要求 Sui 全节点修剪有关历史对象版本以及具有相应效果和事件的历史交易的信息,包括旧的检查点数据。

事务和对象修剪器都在后台运行。从 RocksDB 中逻辑删除条目最终触发磁盘上的数据物理压实,这由 RocksDB 后台作业管理:对磁盘使用的修剪效果不是立即的,可能需要多天。

要了解有关对象修剪策略的更多信息,请参阅 对象修剪。你可以在两种模式下配置修剪器:

  • 激进修剪num-epochs-to-retain: 0):首选选项。Sui 尽快修剪旧的对象版本。
  • 基于纪元的修剪num-epochs-to-retain: X):Sui 在 X 个纪元后修剪旧的对象版本。
tip

测试表明,激进修剪可以实现更有效的全节点操作。

要了解有关事务修剪策略的更多信息,请参阅 事务修剪。要配置事务修剪,请指定 num-epochs-to-retain-for-checkpoints: X 配置选项。检查点,包括其交易、效果和事件,将被修剪到 X 个纪元之前。我们建议将事务修剪设置为 2 个纪元。

设置存档水印

如果你的全节点配置为将已提交的信息上传到存档,则应确保修剪在相应数据上传之后发生。为此,在 Fullnode.yaml 文件中设置 use-for-pruning-watermark: true,如 档案回退 中所述。

Sui 全节点键值存储备份

为了为修剪旧事务数据的 Sui 全节点启用历史数据查询,全节点 RPC 实现配置为从远程存储中查询丢失的事务数据。

如果本地没有交易摘要、效果、事件或检查点的信息,则全节点会自动从云端键值存储(目前由 MystenLabs 管理)中检索历史数据。请注意,当前的键值存储实现仅保留历史事务数据:我们计划在未来的发布中为检索历史对象版本提供类似的设置。

修剪策略示例

使用本节的示例配置你的 Sui 全节点。你可以复制示例,然后根据你的环境适当修改值。

最小全节点

此配置将磁盘使用保持在最低水平。具有此配置的全节点无法回答需要索引或历史数据的查询。

# Do not generate or maintain indexing of Sui data on the node
enable-index-processing: false

authority-store-pruning-config:
# default values
num-latest-epoch-dbs-to-retain: 3
epoch-db-pruning-period-secs: 3600
max-checkpoints-in-batch: 10
max-transactions-in-batch: 1000
# end of default values

# Prune historic object versions
num-epochs-to-retain: 0
# Prune historic transactions of the past epochs
num-epochs-to-retain-for-checkpoints: 2
periodic-compaction-threshold-days: 1

具有索引但无历史记录的全节点

此设置在维护最新状态的同时管理辅助索引,但激进修剪历史数据。具有此配置的全节点:

  • 可以回答需要索引的 RPC 查询,如 suix_getBalance()
  • 可以回答需要通过回退从远程键值存储检索数据的历史交易的 RPC 查询:sui_getTransactionBlock()
  • 无法回答需要历史对象版本的 RPC 查询:sui_tryGetPastObject()
    • sui_getTransactionBlock() 查询的 showBalanceChanges 过滤器依赖于历史对象版本,因此它无法与此配置一起使用。
authority-store-pruning-config:
# default values
num-latest-epoch-dbs-to-retain: 3
epoch-db-pruning-period-secs: 3600
max-checkpoints-in-batch: 10
max-transactions-in-batch: 1000
# end of default values

# Prune historic object versions
num-epochs-to-retain: 0
# Prune historic transactions of the past epochs
num-epochs-to-retain-for-checkpoints: 2
periodic-compaction-threshold-days: 1

具有完整对象历史但修剪的交易历史的全节点

此配置在仍然修剪历史交易的同时管理完整的对象历史。具有此配置的全节点可以回答所有历史和索引查询(使用事务查询回退进行事务数据),包括需要历史对象的查询,如 sui_getTransactionBlock()showBalanceChanges 过滤器。

主要的注意事项是当前的设置使得事务修剪器领先于对象修剪器。对象修剪器可能无法正确清理已被修剪的事务修改的对象。你应该密切监视具有此配置的全节点的磁盘空间增长。

除了常规(修剪的)快照之外,Mysten Labs 还维护具有完整对象版本历史的特殊 RocksDB 快照,供使用此配置的操作员使用。

authority-store-pruning-config:
# default values
num-latest-epoch-dbs-to-retain: 3
epoch-db-pruning-period-secs: 3600
max-checkpoints-in-batch: 10
max-transactions-in-batch: 1000
# end of default values

# No pruning of object versions (use u64::max for num of epochs)
num-epochs-to-retain: 18446744073709551615
# Prune historic transactions of the past epochs
num-epochs-to-retain-for-checkpoints: 2
periodic-compaction-threshold-days: 1