2 个不稳定版本

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

#2024 in 数据库接口

MIT/Apache

2MB
37K 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必须运行。

您(目前)需要每晚编译 noria-server 需要使用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 crate 提供了与 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是一个大型软件项目,跨越许多子crate和外部工具(请参阅文本中的链接)。每个子crate负责Noria架构的某个组件,例如外部API(noria)、将SQL映射到数据流(server/mir)以及执行数据流操作(server/dataflow)。server/src/ 中的代码通过建立物化、安排数据流工作、编排Noria程序更改、处理故障转移等来将这些部分连接在一起。

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

每个子crates都有其独特的角色

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

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

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

    • dataflow/:实现数据流图内部的代码。这包括不同运算符的实现(ops/)、“特殊”运算符(如叶视图和分片器)(node/special/)、视图存储的实现(state/),以及在线程域内协调控制、数据和回填消息执行的代码(domain/)。
    • mir/:实现Noria将SQL映射到数据流的代码。这包括解析列和键、创建数据流运算符、检测复用机会以及触发迁移,以便在添加新的SQL查询后进行更改。@ms705是该子crate的主要作者,它主要基于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端点,并包括图可视化。

依赖项

~53–91MB
~1.5M SLoC