2个不稳定版本
0.6.0 | 2020年6月5日 |
---|---|
0.4.0 | 2020年2月17日 |
#37 在 #dataflow
用于 3 crates
200KB
4.5K SLoC
Noria:高性能Web应用的数据流
Noria是一个新的流式数据流系统,设计用于作为基于Jon Gjengset的博士论文《博士论文》以及这篇论文(来自OSDI'18)的读取密集型Web应用的高速存储后端。它像一个数据库,预先计算并缓存关系查询结果,使读取速度极快。Noria自动保持缓存结果与持久存储在持久基表中的底层数据同步。Noria使用部分有状态的数据流来减少内存开销,并支持动态、运行时数据流和查询变更。
Noria附带一个MySQL适配器,该适配器实现了二进制MySQL协议。这使得任何目前与MySQL或MariaDB通信的应用程序都可以用最少的努力切换到Noria。例如,运行一个类似Lobsters的工作负载,该工作负载发出等效SQL查询到真实的Lobsters网站,Noria将支持的吞吐量提高了5倍
从高层次来看,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
要运行测试套件,请使用
$ 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(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证(《LICENSE-MIT》或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义,您有意提交的任何贡献,将按上述方式双许可,不附加任何额外条款或条件。
依赖项
~28MB
~511K SLoC