2个不稳定版本

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

#37#dataflow


用于 3 crates

MIT/Apache

200KB
4.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是一个新的流式数据流系统,设计用于作为基于Jon Gjengset的博士论文《博士论文》以及这篇论文(来自OSDI'18)的读取密集型Web应用的高速存储后端。它像一个数据库,预先计算并缓存关系查询结果,使读取速度极快。Noria自动保持缓存结果与持久存储在持久基表中的底层数据同步。Noria使用部分有状态的数据流来减少内存开销,并支持动态、运行时数据流和查询变更。

Noria附带一个MySQL适配器,该适配器实现了二进制MySQL协议。这使得任何目前与MySQL或MariaDB通信的应用程序都可以用最少的努力切换到Noria。例如,运行一个类似Lobsters的工作负载,该工作负载发出等效SQL查询到真实的Lobsters网站,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子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,它以人类可消费的形式提供REST API端点,并包括图形可视化。

许可证

许可证下任选其一

由您选择。

贡献

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

依赖项

~28MB
~511K SLoC