2个不稳定版本
0.6.0 | 2020年6月5日 |
---|---|
0.4.0 | 2020年2月17日 |
#168 在 缓存 中
每月 23 次下载
在 2 包 中使用
785KB
17K SLoC
Noria:高性能Web应用程序的数据流
Noria是一个新的流数据流系统,旨在作为基于Jon Gjengset的博士论文以及这篇论文和这篇论文(来自OSDI'18)的快速存储后端。它像一个数据库,但预先计算并缓存关系查询结果,从而使读取速度极快。Noria会自动在持久存储的基础表中更新缓存结果,以便在底层数据变化时保持最新。Noria使用部分状态数据流来减少内存开销,并支持动态运行时数据流和查询更改。
Noria附带MySQL适配器,该适配器实现了二进制MySQL协议。这使得任何当前与MySQL或MariaDB通信的应用程序都可以以最小的努力切换到Noria。例如,运行Lobsters-like工作负载,该工作负载发出等效SQL查询到真正的Lobsters网站,Noria可以将吞吐量提高5倍。
从高层次来看,Noria接受一组参数化SQL查询(想想预编译语句),并生成一个数据流程序,该程序为这些查询的输出维护物化视图。读取现在变为直接对这些物化视图的快速查找,就像值已经被直接缓存到memcached中一样。然后通过数据流增量地保持这些视图的更新,从而实现高写入吞吐量。
运行Noria
像大多数数据库一样,Noria遵循服务器-客户端模型,其中许多客户端连接到一个(可能是分布式的)服务器。在这种情况下,服务器是noria-server
二进制文件,必须在客户端可以连接之前启动。Noria还使用Apache ZooKeeper来宣布其服务器位置,因此ZooKeeper必须正在运行。
您(目前)需要每晚构建 noria-server
需要使用 nightly 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
包提供与 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在实现层面的内部结构。尽管它有时会落后,尤其是在大型变更之后,但它应该能帮助你相对快速地熟悉基本构建块。
每个子crate都承担着不同的角色
-
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,该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许可证定义,您提交的任何有意包含在作品中的贡献,将按上述方式双许可,没有任何额外的条款或条件。
依赖关系
~49–83MB
~1.5M SLoC