2 个不稳定版本

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

#1439数据库接口


用于 noria-server

MIT/Apache

700KB
16K 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)的高性能读密集型Web应用的快速存储后端。它像数据库一样工作,但预先计算并缓存关系查询结果,使得读取速度极快。Noria会自动根据存储在持久性基础表中的数据变化,来更新缓存结果。Noria使用部分有状态的数据流来减少内存开销,并支持动态的运行时数据流和查询变更。

Noria附带了一个MySQL适配器,它实现了二进制MySQL协议。这使得任何目前与MySQL或MariaDB通信的应用程序可以以最小的努力切换到Noria。例如,运行一个类似于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 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 内部实现级别的组件如何结合在一起。虽然它偶尔会落后,特别是在较大的更改之后,但它应该有助于您快速熟悉基本构建块。

子包各自承担不同的角色

  • noria/:与Noria通信的外部程序所需的一切。这包括在RPC中用作参数/返回类型的类型,以及通过ZooKeeper发现Noria工作节点、通过ZooKeeper建立与Noria的连接以及调用Noria控制器暴露的各种RPC的代码(server/src/controller.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,它以人类可消费的形式提供REST API端点,并包含图形可视化。

许可证

根据以下任一许可证授权

供您选择。

贡献

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

依赖项

~50–83MB
~1.5M SLoC