为庞大的用户群提供可靠、一致和低延迟的数据对于任何后端团队来说都是一项艰巨的挑战。 在 Ledger,我们做出了托管我们自己的区块链核心数据服务的战略选择。 通过不依赖第三方,我们可以自行管理客户的数据,确保底层流程符合我们的安全准则和以性能为导向的服务水平目标 (SLO)。
但这一战略也带来了一系列挑战。
我们的第一个挑战是将这些提供核心数据的服务从酷炫的 noSQL 工具中迁移出来。 在本文中,我将深入探讨我们做出这个艰难决定的原因、我们遇到的复杂情况以及我们获得的好处。
本文的目的是展示导致我们选择 PostgreSQL 作为我们新的区块链数据基准存储层的技术方面。
深入研究区块链数据
区块链数据有几个关键特征。
首先,它一直在增长,并且从未从中删除任何内容。 然而在实践中,虽然大部分区块链是不可变的,但区块链最年轻的部分可能会由于需要解决的冲突而发生变化。 事实上,由于该链是一个点对点网络,几个合法区块可能会暂时共存。 通常,较旧的会被删除,从而导致我们所说的重组。 长话短说,数据分为不可变的冷尾和很少改变的头部状态。
我们试图解决的问题是,虽然区块链非常适合拥有拜占庭容错数据,但它们在多个轴上的切片和切块方面效率较低。 即,获取影响帐户的操作列表非常困难。 当您还没有交易清单时,即使在像比特币这样的区块链上获得账户余额也是一个挑战。
为了克服这些挑战,Ledger Explorer Services 索引了整个区块链。它是一个大型、关键且对性能敏感的服务,完全用 Scala 编写,使用 猫效应 高性能运行时。 我们在比特币上超过 10k rps,同时将 tail p95 延迟保持在 100 毫秒以下。 我们也在招聘 😊。
一点点历史
在我们故事的开始,在我加入公司之前,Ledger 数据服务层由嵌入式 Neo4j 数据库处理。 每个服务框都在索引自己的数据并在本地提供服务,这导致了很多问题。
无法保证实例之间的数据一致性,并且需要索引的状态的绝对大小,加上 neo4j 磁盘和 ram 使用,是不可扩展的。 随着公司的发展,这个问题只会变得更糟,这使得产生新实例变得越来越具有挑战性。
卡桑德拉 然后被选为这个新设置的主要驱动程序:它是一个集群的、水平可扩展的数据库,位于 CAP 定理的 AP 端。 它解决了与数据共享相关的问题,并允许在索引、区块链感知组件和无头 API 服务器之间明确分离。
但是,如果我们永远不会真正从中读取历史状态,那么拥有整个历史状态有什么意义呢?
关于我们的用例,很少需要原始历史数据,因为我们的用户帐户状态可以从中聚合。 这让我们开始挑战现有的基于Cassandra分布式数据库的数据存储方案。
我们需要在每个区块链上存储的数据量虽然在 TB 范围内,但并不是所谓的“大数据”。 此外,用于回答大部分查询的 if 部分(又名热路径)甚至更小。 如今,可以轻松找到具有超过 16TB NVMe SSD 存储的商用硬件服务器。 垂直扩展是一个非常强大的工具,关系数据库也是。
最后,我们当前的 cassandra 设置的主要问题既不是浪费的存储模型,也不是不合适的数据用例,而是缺乏开发人员友好性。 在 cassandra 上开发一个新的基于数据的功能已被证明是不必要的耗时。 我们努力实施我们需要提供数据的每个新轴。
鉴于我们团队在数据建模技能和 SQL 熟练程度方面的专业知识, PostgreSQL的 是完美的候选人。 该解决方案经过实战检验、健壮、易于扩展,是理想的选择。
为什么我们选择 SQL 而不是 NoSQL:
- 读取/写入余额:区块链数据用例严重偏向于读取而不是写入(区块链以非常合理的速率写入非常少的数据,即使对于像 Polygon 这样的区块链也是如此)。 Cassandra 具有吸收大量写入的能力——读取路径实际上是 不再 比写入路径。
- 索引支持:索引是 DBMS 的关键组成部分,用于回答查询和新的业务案例或机会。 Cassandra 对索引的支持有限。 只有当查询已经指定了一种方法来限制查询将在其上运行的分区时,索引才有效。 我们在这里支付费用 任意分布 数据库。 PostgreSQL 对索引的支持是高效的、可扩展的并且在边缘。
- 聚合支持: 聚合情况相同; 由于 Cassandra 不允许多分区聚合并且在其查询语言中不允许 GROUP BY 子句,因此它的支持有点缺乏。 PostgreSQL 提出了广泛的聚合支持,即使是在像范围和 jsonb blob 这样的奇异数据类型上也是如此。
- 资料建模:Cassandra 在数据建模的方式上非常非常有限。 几乎每个要回答的请求都必须创建一个表,并且必须将数据非规范化为大行(完全使用 宽列存储 C* 的一个方面,以及编写器非常便宜的事实)。 PostgreSQL 允许我们利用区块链的关系方面(调用、事务、块)和备用磁盘空间,鼓励数据重用。
- 即席查询和审计:能够使用完整的 SQL 标准并执行任意查询意味着我们可以探索和搜索潜在的错误根本原因或为未来的用例提供探索性数据。 我们可以真正将数据库用作交互式智能工具,而不是哑存储。 在没有像 Presto、Spark 等广泛且昂贵的分析计算集群的情况下在 Cassandra 上这样做(并且由于我们在裸机服务器上运行,我们无法访问像 EMR 这样容易产生的分布式数据分析工具)。
- 存储使用率:Cassandra 的假设是存储非常便宜并且集群可以很容易地用新机器扩展。 这意味着 索引和聚合的所有限制都必须用存储来支付. 没有全局有效的索引和连接支持意味着我们必须为我们要查询的每个轴非规范化和存储整个表的副本。 PostgreSQL 为我们节省了数 TB 的存储空间。
- 持续一致:由于 Cassandra 是一个分布式的、面向 AP 的数据库(通信是通过节点之间的 gossiping 进行的),一致性只是在写入方面的最终结果。 您可以为读取和写入调整每个语句的一致性策略,但该数据库的目标永远不会具有强一致性。 PostgreSQL 具有用于关键任务的强大故事,并且具有很高的弹性。 集中化还意味着写入路径中不涉及网络。
- 事务和 MVCC:
- 工装: PostgreSQL 还有很多工具被广泛使用,可以轻松操作数据库。 此外,像这样的工具 飞路 确保我们维护数据库模式的强版本控制。 我们已经成功地将它与我们的代码库集成。 在 Cassandra 上没有与这种成熟度相当的东西。
- 水平可扩展性:这是 Cassandra 的主要卖点。随着数据的扩展,只需添加更多机器即可。 没有 PostgreSQL 的等价物,因为必须手动进行分片和分区。
我们计划如何扩展
正如我们所见,使用 Postgres 设置的唯一缺点是在读取和存储方面都需要扩展。 我们可以做些什么来克服这个限制?
我们拥有的第一个有效工具是将我们支持的每个协议或区块链隔离到它自己的数据库中,这样就可以根据数量和流量进行适当扩展。 按业务领域划分可确保第一层扩展。
通过进一步利用这个概念,我们还可以将冷的历史数据分割成时间分区。 最新版本的 Postgres 大大提高了分区表的可用性,可以在机器集群之间无缝移动数据。 例如,我们可以使用计算能力较低的廉价机器来托管大部分历史数据,同时保留强大的用户服务 RAM 堆叠庞然大物来托管聚合表和用户的最新操作。
这种方法在我们的用例中非常有效,因为历史存储中没有跨分区外键(所有内容最终都附加到块)。 从主服务器的角度来看,甚至可以使用分区和 postgres_fdw 扩展透明地访问历史数据。
为了帮助完成所有这些工作,我们还研究了 TimescaleDB 扩展。 这个扩展为基线 postgres 添加了很多功能,其中大部分非常适合我们的用例:
- 基于类似时间列的表自动分区(在我们的例子中,我们通过将区块链高度作为我们的参考来调整它)。
- 自动、数据类型感知和基于列的旧块压缩。 通过对非常相似的数据使用最先进的算法,这确保了近乎完美的压缩率。
- 基于高效时间段的聚合,可轻松计算历史余额和市场数据图表。
我们刚刚开始有关存储的实验,这解锁了很多用例。 使用少量数据的概念证明(以太坊主网上约 10k 个块,因此大约 2 天的数据) 显示磁盘空间减少高达 40%.
正如我们所见,只要我们使用正确的策略,数据量就不是问题。 但是如何根据我们的用户群规模进行扩展呢?
我们在这里已经有了一个很好的优势:我们索引了整个区块链数据。 因此,所需的存储不会像用户数量一样增长,而是像区块链总大小一样增长。 存储和读取优化在它们的分辨率上是完全正交的。
这种设置,加上与需要服务的读取量成比例的非常低的写入需求,是分类领导者-跟随者副本模式的理想设置。 为了进一步提高性能和吞吐量,我们还可以将 postgres 只读副本放置在与 API 服务器相同的机器上,并利用 UNIX 域套接字来跳过网络往返。
这是我们可以用来扩展读取的数据复制策略的示例。 浅灰色框代表单个服务器。 我们可以在这里看到,API pod 直接与最热数据的副本位于同一位置,以确保存储和用户之间的传输时间最短。 前面描述的存档实例未表示为不会使模式过于复杂。
结束语
作为 Cassandra 的长期用户,我想强调的是,它在设计上是一个很棒的数据库,适用于各种应用程序。 不幸的是,Ledger 选择使用它是基于一个从未实现过的数据用例。
我们的团队生产力受到了影响,并且期待着我们必须解决的挑战,我们选择硬着头皮而不是陷入沉没成本谬误。
在许多情况下,您的数据不是大数据。 在大多数情况下,管理数据分布并不是一项艰巨的任务,真正需要仔细考虑成熟的分布式数据库的权衡。 关键考虑因素是开发人员体验,因为它可以腾出宝贵的时间来构建其他任何东西。这是我们需要大量投资的真实用例。
- SEO 支持的内容和 PR 分发。 今天得到放大。
- 柏拉图爱流。 Web3 数据智能。 知识放大。 访问这里。
- 与 Adryenn Ashley 一起铸造未来。 访问这里。
- 使用 PREIPO® 买卖 PRE-IPO 公司的股票。 访问这里。
- Sumber: https://www.ledger.com/blog/serving-web3-at-web2-scale
- :具有
- :是
- :不是
- $UP
- 10
- 10
- 20
- a
- 对,能力--
- Able
- ACCESS
- 访问
- 账号管理
- 横过
- 通
- 适应
- 加
- 添加
- 坚持
- 优点
- 聚合
- 算法
- 所有类型
- 让
- 允许
- 已经
- 还
- 尽管
- 量
- an
- 分析
- 分析
- 和
- 回答
- 任何
- 什么
- API
- 应用领域
- 应用的
- 的途径
- 适当
- 档案
- 保健
- 围绕
- 艺术
- 刊文
- AS
- 方面
- 方面
- 假设
- At
- 可使用
- 察觉
- 远离
- 轴
- 轴
- 后端
- 当前余额
- 结余
- 基地
- 基于
- 底线
- BE
- 因为
- 很
- before
- 开始
- 巨兽
- 作为
- 好处
- 之间
- 大
- 大数据运用
- 位
- 比特币
- 阻止
- blockchain
- 区块链数据
- 块链
- 吹氣梢
- 都
- 盒子
- 箱
- 带来
- 问题
- 建立
- 商业
- 但是
- by
- 呼叫
- 呼叫
- CAN
- 候选人
- 帽
- 小心
- 案件
- 例
- 原因
- 造成
- 集中
- 链
- 挑战
- 挑战
- 挑战
- 更改
- 改变
- 廉价
- 便宜
- 便宜的机器
- 选择
- 选择
- 选择
- 清除
- 簇
- 码
- 代码库
- 冷
- 柱
- 结合
- 商品
- 沟通
- 公司
- 复杂性
- 元件
- 计算
- 概念
- 概念
- 考虑
- 考虑
- 一贯
- Cool
- 核心
- 价格
- 可以
- 创建
- 危急
- 电流
- data
- 数据分析
- 数据共享
- 数据存储
- 数据库
- 一年中的
- 决定
- 描述
- 设计
- 开发商
- 发展
- 难
- 直接
- 污垢
- 分布
- 分配
- 分
- do
- 不
- 做
- 域
- 别
- 缺点
- 梦想
- 司机
- 两
- e
- 每
- 容易
- 易
- 边缘
- 有效
- 高效
- 其他
- 嵌入式
- 强调
- enable
- 鼓励
- 提高
- 确保
- 确保
- 保证
- 等
- 复仇
- 以太坊主网
- 甚至
- 最终的
- EVER
- 所有的
- 一切
- 例子
- 现有
- 异国情调
- 展开
- 体验
- 专门知识
- 探索
- 探险家
- 延长
- 延期
- 广泛
- 事实
- 秋季
- 专栏
- 特征
- 少数
- 找到最适合您的地方
- 姓氏:
- 适合
- 针对
- 国外
- 向前
- 友善
- 止
- ,
- 成熟的
- 充分
- 功能
- 进一步
- 未来
- 越来越
- 特定
- 在全球范围内
- 目标
- 去
- 图表
- 灰色
- 大
- 团队
- 增长
- 成长
- 保证
- 方针
- 民政事务总署
- 硬
- 硬件
- 有
- 有
- 头
- 严重
- 高度
- 帮助
- 此处
- 高
- 高度
- 历史的
- 主持人
- 热卖
- 最热
- 创新中心
- How To
- 但是
- HTML
- HTTPS
- i
- 理想
- if
- 一成不变
- 影响
- 实施
- 改善
- in
- 日益
- 指数
- 指数
- 例
- 集成
- 互动
- 成
- 投资
- 参与
- 问题
- 问题
- IT
- 它的
- 加入
- 加盟
- JPG
- 只是
- 保持
- 键
- 键
- 类
- 缺乏
- 语言
- 大
- 潜伏
- 最新
- 层
- 导致
- 莱杰
- 合法
- 减
- Level
- 杠杆作用
- 光
- 轻巧
- 喜欢
- 局限性
- 限制
- 有限
- 清单
- 小
- 当地
- 长
- 看着
- 寻找
- 占地
- 低
- 机
- 制成
- 主要
- mainnet
- 保持
- 多数
- 制作
- 管理
- 管理的
- 手动
- 许多
- 市场
- 市场数据
- 到期
- 最大宽度
- 可能..
- 手段
- 某些金属
- 迁移
- 最小
- 任务
- 模型
- 造型
- 更多
- 此外
- 最先进的
- 移动
- 许多
- 必须
- 亦即
- 几乎
- 需求
- 打印车票
- 需要
- 也不
- 网络
- 决不要
- 全新
- 不错
- 没有
- 节点
- 没什么
- 数
- 众多
- 目标
- of
- on
- 一
- 仅由
- 操作
- 运营
- 机会
- or
- 秩序
- 我们的
- 我们自己
- 超过
- 克服
- 己
- 支付
- 部分
- 各方
- 径
- 模式
- 窥视
- 对等
- 性能
- 透视
- 地方
- 计划
- 柏拉图
- 柏拉图数据智能
- 柏拉图数据
- 豆荚
- 点
- 政策
- Polygon
- 可能
- PostgreSQL的
- 潜力
- 功率
- 强大
- 在练习上
- 市场问题
- 过程
- 生产率
- 证明
- 比例
- 建议
- 协议
- 成熟
- 提供
- 提供
- 放
- 查询
- 内存
- 范围
- 率
- 宁
- 比
- 原
- 阅读
- 真实
- 真
- 合理
- 减少
- 关于
- 有关
- 可靠
- 重组
- 回复
- 复制
- 代表
- 代表
- 请求
- 弹性
- 分辨率
- 解决
- 导致
- 重用
- 右
- 健壮
- 根
- 圆
- 行
- 运行
- 运行
- 同
- 斯卡拉
- 可扩展性
- 鳞片
- 缩放
- 无缝
- 搜索
- 保安
- 看到
- 看到
- 段
- 分割
- 卖房
- 卖点
- 服务
- 特色服务
- 服务
- 集
- 格局
- 几个
- 分片
- 共享
- 短
- 显示
- 侧
- 类似
- 自
- 单
- 尺寸
- 技能
- 小
- 小
- 智能
- So
- 方案,
- 解决
- 解决
- 一些
- 太空
- 火花
- 卵
- SQL
- 标准
- 州/领地
- 个人陈述
- 存储
- 商店
- 故事
- 善用
- 策略
- 强烈
- 非常
- 顺利
- SUPPORT
- 支持
- 表
- 采取
- 服用
- 任务
- 团队
- 文案
- 展示
- 条款
- 比
- 这
- 该座
- 国家
- 其
- 然后
- 那里。
- 博曼
- 他们
- 第三
- 第三者
- Free Introduction
- 吞吐量
- 次
- 至
- 也有
- 工具
- 工具
- 合计
- 完全
- 交通
- 交易
- 交易
- 转让
- 透明地
- 类型
- 类型
- 最终
- 下
- 相关
- 不幸
- UNIX
- 解锁
- 不必要的
- us
- 可用性
- 用法
- 使用
- 用例
- 用过的
- 用户
- 用户
- 运用
- 平时
- 有价值
- 各种
- 垂直
- 非常
- 体积
- 想
- 是
- 方法..
- we
- Web2
- Web3
- 井
- 什么是
- 什么是
- ,尤其是
- 这
- 而
- 虽然
- 全
- 为什么
- 宽
- 广泛
- 将
- 也完全不需要
- 合作
- 写
- 书面
- 您
- 最年轻的
- 您一站式解决方案
- 和风网