2个不稳定版本

0.6.0 2020年6月5日
0.4.0 2020年2月17日

#168缓存

每月 23 次下载
2 包 中使用

MIT/Apache

785KB
17K SLoC

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

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

Noria是一个新的流数据流系统,旨在作为基于Jon Gjengset的博士论文以及这篇论文这篇论文(来自OSDI'18)的快速存储后端。它像一个数据库,但预先计算并缓存关系查询结果,从而使读取速度极快。Noria会自动在持久存储的基础表中更新缓存结果,以便在底层数据变化时保持最新。Noria使用部分状态数据流来减少内存开销,并支持动态运行时数据流和查询更改。

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

Noria speeds up Lobsters queries by 5x

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

运行Noria

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

您(目前)需要每晚构建 noria-server 需要使用 nightly Rust。如果您使用 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 UI

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

Noria 开发

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

server/src/lib.rs 的顶部有一段非常详尽的注释,解释了Noria在实现层面的内部结构。尽管它有时会落后,尤其是在大型变更之后,但它应该能帮助你相对快速地熟悉基本构建块。

每个子crate都承担着不同的角色

  • noria/:一切与Noria通信的外部程序所需的。这包括在RPC中使用作为参数/返回类型的类型,以及通过ZooKeeper发现Noria工作者的代码,通过ZooKeeper建立到Noria的连接,以及调用Noria控制器暴露的各种RPC(server/src/controller.rs)。noria子crate还包含一些必须由客户端和服务器之间共享的内部数据结构,如DataType(Noria的"值"类型)。这些带有#[doc(hidden)]注释,并在noria/src/lib.rs中很容易找到。

  • applications/:一系列Noria基准测试。最常用的一个是vote,它运行OSDI论文第8.2节的投票基准测试。你可以以多种方式运行它(--help应该很有用),并且与许多不同的后端一起运行。localsoup后端是最容易启动和运行的。

  • server/src/:Noria服务器,包括RPC处理、域调度、连接管理以及所有控制器操作(监听心跳、处理失败的工作者等)。它包含两个显著的子crate

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

要运行测试套件,请使用

$ 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端点,并包含图形可视化。

许可证

根据您的选择,许可如下:

贡献

除非您明确说明,否则根据Apache-2.0许可证定义,您提交的任何有意包含在作品中的贡献,将按上述方式双许可,没有任何额外的条款或条件。

依赖关系

~49–83MB
~1.5M SLoC