8 个不稳定版本 (3 个重大变更)
0.6.1 | 2020年6月6日 |
---|---|
0.6.0 | 2020年6月5日 |
0.5.0 | 2020年4月29日 |
0.4.1 | 2020年2月25日 |
0.1.2 | 2018年10月15日 |
#1713 in 数据库接口
被 4 个crate使用 (3个直接使用)
180KB
3.5K 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必须运行。
您(目前)需要每晚的 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界面
您可以使用任何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 内部在实现层面的组件如何协同工作。尽管它有时会落后于一些较大的更改,但它应该能帮助你相对快速地熟悉基本构建模块。
各个子仓库各自承担着不同的角色
-
noria/
:与 Noria 通信的外部程序所需的一切。这包括在 RPC 中用作参数/返回类型的类型,以及通过 ZooKeeper 发现 Noria 工作节点、通过 ZooKeeper 建立与 Noria 的连接以及调用 Noria 控制器暴露的各种 RPC 的代码(src/controller/inner.rs
)。noria
子仓库还包含一些必须由客户端和服务器共享的内部数据结构,如DataType
(Noria 的“值”类型)。这些结构被注解为#[doc(hidden)]
,并在noria/src/lib.rs
中易于识别。 -
applications/
:包含各种 Noria 基准测试的集合。最常用的是vote
,它运行了 OSDI 论文中 §8.2 的投票基准测试。你可以用多种方式运行它(--help
应该很有用),以及使用许多不同的后端。其中最简单的是localsoup
后端。 -
server/src/
:Noria 服务器,包括 RPC 处理、领域调度、连接管理以及所有控制器操作(监听心跳、处理失败的工人等)。它包含两个值得注意的子仓库
要运行测试套件,使用
$ 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,该 UI 以人类可消费的形式提供 REST API 端点,并包含图形可视化。
依赖关系
~29MB
~530K SLoC