2 个不稳定版本
0.6.0 | 2020年6月5日 |
---|---|
0.4.0 | 2020年2月17日 |
#2024 in 数据库接口
2MB
37K SLoC
Noria:为高性能Web应用提供数据流
Noria 是一个新的流式数据流系统,旨在作为基于 这篇论文(来自 OSDI'18)的快速存储后端,该论文设计用于读写密集型的Web应用。它就像一个数据库,但预先计算并缓存关系查询结果,从而使读取非常快。Noria 在底层数据(存储在持久 基础表 中)更改时自动保持缓存的最新状态。Noria 使用部分有状态的数据流来减少内存开销,并支持动态、运行时数据流和查询更改。
Noria 随带 一个MySQL适配器,实现了二进制MySQL协议。这使得任何当前与MySQL或MariaDB通信的应用程序都可以以最少的努力切换到Noria。例如,运行一个 类似于Lobsters的工作负载,该工作负载发出与真实 Lobsters网站 相当的SQL查询,Noria 可以将吞吐量提高5倍
从高层次来看,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
要运行测试套件,请使用
$ 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