2 个版本

0.1.0-surreal.22023年7月22日
0.1.0-surreal.12023年6月19日

#2374数据库接口

Download history 4/week @ 2024-03-14 6/week @ 2024-03-21 77/week @ 2024-03-28 3/week @ 2024-04-04 80/week @ 2024-06-06 11/week @ 2024-06-13

每月 91 次下载

Apache-2.0

88KB
580

TiKV客户端(Rust)

Docs Build Status

此crate提供了一个易于使用的TiKV客户端,TiKV是一个用Rust编写的分布式、事务性键值数据库。

此crate允许您连接到TiKV(>= v5.0.0)集群,并使用事务性或原始(简单get/put风格,不保证事务一致性)API访问和更新您的数据。

TiKV Rust客户端是一个开源(Apache 2)项目,由TiKV作者维护。我们欢迎贡献,更多信息请见下文。

请注意,当前版本不适合生产使用 - API尚不稳定,crate尚未在实际应用中进行彻底测试。

入门

TiKV客户端是一个Rust库(crate)。要在项目中使用此crate,请将以下依赖项添加到您的 Cargo.toml

[dependencies]
tikv-client = "0.3"

先决条件

  • rust >= 1.56.1,需要 hashbrown-v0.12.1

使用客户端crate的一般流程是创建一个原始或事务客户端对象(可配置),然后使用客户端对象发送命令,或者用它来创建事务对象。在后一种情况下,事务通过各种命令构建,然后提交(或回滚)。

示例

原始模式

use tikv_client::RawClient;

let client = RawClient::new(vec!["127.0.0.1:2379"], None).await?;
client.put("key".to_owned(), "value".to_owned()).await?;
let value = client.get("key".to_owned()).await?;

事务模式

use tikv_client::TransactionClient;

let txn_client = TransactionClient::new(vec!["127.0.0.1:2379"], None).await?;
let mut txn = txn_client.begin_optimistic().await?;
txn.put("key".to_owned(), "value".to_owned()).await?;
let value = txn.get("key".to_owned()).await?;
txn.commit().await?;

由于TiKV客户端提供了异步API,您需要使用异步运行时(我们目前仅支持Tokio)。有关完整示例,请参阅getting-started.md

API摘要

TiKV Rust客户端支持多个抽象级别。使用客户端最方便的方式是通过RawClientTransactionClient。这提供了一个非常高级的API,主要抽象了存储的分布式特性,并为所有协议提供了合理的默认值。此接口可配置,主要是在创建客户端或事务对象时通过ConfigTransactionOptions结构体进行配置。使用某些选项,您可以自己接管部分协议(例如重试失败的消息)。

最低级别的抽象是直接创建和发送gRPC消息到TiKV(和PD)节点。`tikv-client-store`和`tikv-client-pd`crate使这比直接使用protobuf定义和gRPC库更容易,但提供了相同级别的控制。

在这些抽象级别之间,您可以向TiKV集群发送和接收单个消息,但可以利用库代码进行常见操作,例如将数据解析到区域以及集群中的节点,或重试失败的消息。这可以用于测试TiKV集群或某些高级用例。请参阅此API的`client_rust::request`模块,以及`client_rust::raw::lowering`和`client_rust::transaction::lowering`模块中的便利方法以创建请求对象。

本文件的其余部分仅描述了RawClient/TransactionClient API。

重要提示:不推荐或支持在同一个数据库上同时使用原始和事务API。

类型

Key:存储中的一个键。`String`和`Vec<u8>`实现了`Into<Key>`,因此您可以直接将它们传递给客户端函数。

Value:存储中的一个值;仅仅是`Vec<u8>``的一个别名。

KvPair:一对`Key`和`Value`。它提供了转换到和从其他类型的便利方法。

BoundRange:用于范围相关的请求,如`scan`。它实现了Rust范围以`From`,因此您可以传递Rust键的范围到请求中,例如,`client.delete_range(vec![]..)`。

原始请求

请求 主要参数类型 结果类型 值得关注的行为
put KvPair
get Key Option<Value>
delete Key
删除范围 边界范围
扫描 边界范围 向量<KvPair>
批量插入 迭代器<KvPair>
批量获取 迭代器<Key> 向量<KvPair> 跳过不存在的键;不保留顺序
批量删除 迭代器<Key>
批量扫描 迭代器<边界范围> 向量<KvPair> 请参阅 each_limit 参数行为的相关文档。范围顺序被保留。
批量扫描键 迭代器<边界范围> 向量<Key> 请参阅 each_limit 参数行为的相关文档。范围顺序被保留。
比较并交换 Key + 2x Value (Option<Value>, 布尔类型)

事务请求

请求 主要参数类型 结果类型 值得关注的行为
put KvPair
get Key Option<>
获取更新 Key Option<>
键存在 Key 布尔类型
delete Key
扫描 边界范围 迭代器<KvPair>
扫描键 边界范围 迭代器<Key>
批量获取 迭代器<Key> 迭代器<KvPair> 跳过不存在的键;不保留顺序
批量获取更新 迭代器<Key> 迭代器<KvPair> 跳过不存在的键;不保留顺序
锁定键 迭代器<Key>
发送心跳 u64 (TTL)
垃圾收集 时间戳 布尔类型 如果 PD 中最新的安全点等于参数,则返回 true

开发和贡献

我们欢迎您的贡献!贡献代码是很好的,我们也赞赏提交 问题 以识别错误和提供反馈,添加测试或示例,以及改进文档。

构建和测试

我们使用标准的 Cargo 工作流程,例如,使用 cargo build 构建,并使用 cargo test/nextest 运行单元测试。您将需要使用 nightly Rust 工具链来构建和运行测试。可以使用 nextest 来加速 ut,首先安装 nextest。

cargo install cargo-nextest --locked

运行集成测试或手动使用 TiKV 集群测试客户端稍微复杂一些。最简单的方法是使用 TiUp (>= 1.5) 在本地机器上初始化集群

tiup playground nightly --mode tikv-slim

然后如果您想运行集成测试

PD_ADDRS="127.0.0.1:2379" cargo test --package tikv-client --test integration_tests --features integration-tests

创建 PR

我们使用标准的 GitHub PR 工作流程。我们对每个 PR 运行 CI,并要求所有 PR 无警告构建(包括 clippy 和 Rustfmt 警告),通过测试,有 DCO 签名(提交时使用 -s,DCO 机器人将引导您完成第一个 PR 的 DCO 协议),并且至少有一个审查。如果您在这方面有任何困难,不要担心,可以在 PR 上提问。

要在本地运行类似于 CI 的测试,我们建议在提交 PR 之前运行 cargo clippycargo test/nextest runcargo fmt。有关运行集成测试的说明见上文,但您可能不需要担心这一点,尤其是在您提交的第一个几个 PR 中。

请遵循 PingCAP 的 Rust 风格指南。所有代码 PR 应包括新的测试或测试用例。

寻求帮助

如果您需要帮助,无论是寻找可以工作的内容,还是遇到任何技术问题,最快的方法是通过 internals.tidb.io,这是 TiDB 开发者的论坛。

您也可以在 Slack 上提问。我们监视 tikv-wg slack 上的 #client-rust 频道。

您可以直接在 GitHub 问题和 PR 中提问;如果没有得到回复,您应该 ping @ekexium 或 @andylokandy。

依赖项

~41MB
~813K SLoC