8 个不稳定版本 (3 个重大变更)

0.6.1 2020年6月6日
0.6.0 2020年6月5日
0.5.0 2020年4月29日
0.4.1 2020年2月25日
0.1.2 2018年10月15日

#1713 in 数据库接口


4 个crate使用 (3个直接使用)

MIT/Apache

180KB
3.5K SLoC

Noria:高性能Web应用程序的数据流

noria on crates.io noria on docs.rs noria-server on crates.io noria-server on docs.rs Azure Status

Noria是一个新的流数据流系统,旨在作为基于这篇论文(来自OSDI'18)的高性能Web应用程序的快速存储后端。它像数据库一样工作,但预先计算并缓存关系型查询结果,从而使读取速度极快。当底层数据(存储在持久性基础表中)发生变化时,Noria会自动更新缓存的结果。Noria使用部分有状态的数据流来减少内存开销,并支持动态的运行时数据流和查询变更。

Noria附带一个MySQL适配器,实现了二进制MySQL协议。这使得任何目前与MySQL或MariaDB通信的应用程序可以以最小的努力切换到Noria。例如,运行类似Lobsters的工作负载,该工作负载发出与真实Lobsters网站等效的SQL查询,Noria将支持的吞吐量提高了5倍。

Noria speeds up Lobsters queries by 5x

从高层次来看,Noria接受一组参数化SQL查询(类似于预定义语句),并生成一个数据流程序,该程序维护那些查询的输出物化视图。现在读取变成了直接对这些物化视图的快速查找,就像值直接被缓存在了memcached中一样。然后通过数据流增量地保持视图的更新,这带来了高写入吞吐量。

运行Noria

与大多数数据库一样,Noria遵循服务器-客户端模型,其中许多客户端连接到一个(可能是分布式的)服务器。在这个情况下,服务器是noria-server二进制文件,必须在客户端连接之前启动。Noria还使用Apache ZooKeeper来宣布其服务器位置,因此ZooKeeper必须运行。

您(目前)需要每晚的 Rust 来构建 noria-server。如果您使用 rustup.rs,这将被自动安排。自动设置。要构建 noria-server,请运行

$ cargo build --release --bin noria-server

您可能需要安装一些依赖项以便上述操作正常进行

  • clang
  • libclang-dev
  • libssl-dev
  • liblz4-dev
  • build-essential

要启动一个长时间运行的 noria-server 实例,请确保 ZooKeeper 正在运行,然后运行

$ cargo r --release --bin noria-server -- --deployment myapp --no-reuse --address 172.16.0.19 --shards 0

myapp 这里是一个 部署。多个 noria-server 实例可以同时在一个部署中运行,并将工作负载在它们之间共享。同一部署中的工作者将自动选举一个领导者并通过 ZooKeeper 互相发现。

Noria交互

与Noria交互主要有两种方式:通过 Rust 绑定 或通过 MySQL 适配器。它们都会自动通过 ZooKeeper 定位到正在运行的工人(如果ZooKeeper没有运行在 localhost:2181,请使用 -z)。

Rust绑定

noria 包提供了与 noria-server 交互的原生 Rust 绑定。请参阅 noria 文档 获取如何使用库的详细说明。您还可以查看使用 Noria 客户端 API 的 示例Noria程序。您还可以查看一个包含 noria-server(并且不需要 ZooKeeper)的自包含版本,见 此示例

MySQL适配器

我们为Noria构建了一个 MySQL适配器,它可以接受标准的MySQL查询并使用MySQL协议进行通信,以便于让现有应用程序轻松尝试Noria。一旦适配器运行(参见其 README),您应该可以将应用程序指向 localhost:3306 来向Noria发送查询。如果您的应用程序崩溃,这是一个错误,我们欢迎您 提交问题。您还可以尝试禁用自动重用(使用 --no-reuse)或分片(使用 --shards 0),以防它们表现不佳。

CLI和Web界面

您可以使用任何MySQL客户端(例如,mysql CLI)手动检查Noria中存储的数据,或使用 Noria的Web界面

Noria开发

Noria是一个大型软件,跨越了许多子crate和外部的工具(参见上面的链接)。每个子crate负责Noria架构的一个组件,例如外部API(noria)、将SQL映射到数据流(server/mir)和执行数据流算子(server/dataflow)。server/src/ 中的代码是通过建立实体化、安排数据流工作、协调Noria程序更改、处理故障转移等将这些部分粘合在一起。

server/src/lib.rs 在其顶部有一段非常详尽的注释,描述了 Noria 内部在实现层面的组件如何协同工作。尽管它有时会落后于一些较大的更改,但它应该能帮助你相对快速地熟悉基本构建模块。

各个子仓库各自承担着不同的角色

  • noria/:与 Noria 通信的外部程序所需的一切。这包括在 RPC 中用作参数/返回类型的类型,以及通过 ZooKeeper 发现 Noria 工作节点、通过 ZooKeeper 建立与 Noria 的连接以及调用 Noria 控制器暴露的各种 RPC 的代码(src/controller/inner.rs)。noria 子仓库还包含一些必须由客户端和服务器共享的内部数据结构,如 DataType(Noria 的“值”类型)。这些结构被注解为 #[doc(hidden)],并在 noria/src/lib.rs 中易于识别。

  • applications/:包含各种 Noria 基准测试的集合。最常用的是 vote,它运行了 OSDI 论文中 §8.2 的投票基准测试。你可以用多种方式运行它(--help 应该很有用),以及使用许多不同的后端。其中最简单的是 localsoup 后端。

  • server/src/:Noria 服务器,包括 RPC 处理、领域调度、连接管理以及所有控制器操作(监听心跳、处理失败的工人等)。它包含两个值得注意的子仓库

    • dataflow/:实现数据流图内部代码。这包括不同操作符的实现(ops/)、“特殊”操作符(如叶视图和分片器)(node/special/)、视图存储的实现(state/)以及协调线程域内控制、数据和回填消息执行的代码(domain/)。
    • mir/:实现 Noria SQL 到数据流映射的代码。这包括解析列和键、创建数据流操作符以及检测重用机会,并在添加新的 SQL 查询后触发迁移以进行更改。@ms705 是这个特定子仓库的主要作者,它主要基于 nom-sql 构建。
    • common/:在各个 server 子仓库之间共享的数据结构。

要运行测试套件,使用

$ cargo test

使用以下命令构建和打开文档

$ cargo doc --open

一旦 noria-server 启动,其 API 将在指定的监听地址上的端口 6033 上可用。

或者,您可以通过以下命令通过 ZooKeeper 发现 Noria 的 REST API 监听地址和端口

$ cargo run --bin noria-zk -- \
    --show --deployment myapp
    | grep external | cut -d' ' -f4

一个基本的图形用户界面运行在 http://IP:PORT/graph.html 上,并显示正在运行的数据流图。您还可以部署 Noria 的更高级的 Web UI,该 UI 以人类可消费的形式提供 REST API 端点,并包含图形可视化。

依赖关系

~29MB
~530K SLoC