#client #tikv #component #testing

tikv-client-common

TiKV Rust 客户端的通用组件

2 个不稳定版本

0.1.0 2021年5月12日
0.0.99 2021年4月29日

#8#tikv

Download history 37/week @ 2024-03-12 32/week @ 2024-03-19 30/week @ 2024-03-26 65/week @ 2024-04-02 23/week @ 2024-04-09 22/week @ 2024-04-16 31/week @ 2024-04-23 19/week @ 2024-04-30 34/week @ 2024-05-07 25/week @ 2024-05-14 19/week @ 2024-05-21 23/week @ 2024-05-28 14/week @ 2024-06-04 16/week @ 2024-06-11 20/week @ 2024-06-18 17/week @ 2024-06-25

每月 下载量 70
4 crate 中使用(2 个直接使用)

Apache-2.0

73KB
202 代码行

TiKV 客户端 (Rust)

Docs Build Status

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

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

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

请注意,当前版本不适合生产使用 - 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-storetikv-client-pd crate 比直接使用 protobuf 定义和 gRPC 库更容易,但提供相同的控制级别。

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

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

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

类型

Key:存储中的键。StringVec<u8> 实现 Into<Key>,因此可以直接将它们传递到客户端函数中。

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

KvPair:键和值的配对。它提供了转换到和从其他类型的便利方法。

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

原始请求

请求 主要参数类型 结果类型 值得关注的行为
put KvPair
get Key Option<Value>
delete Key
delete_range BoundRange
scan BoundRange Vec<KvPair>
batch_put Iter<KvPair>
batch_get Iter<Key> Vec<KvPair> 跳过不存在的键;不保留顺序
batch_delete Iter<Key>
batch_scan Iter<BoundRange> Vec<KvPair> 有关 each_limit 参数行为的说明,请参阅文档。范围顺序得到保留。
batch_scan_keys Iter<BoundRange> Vec<Key> 有关 each_limit 参数行为的说明,请参阅文档。范围顺序得到保留。
compare_and_swap Key + 2x Value (Option<Value>, bool)

事务性请求

请求 主要参数类型 结果类型 值得关注的行为
put KvPair
get Key Option<value>
get_for_update Key Option<value>
key_exists Key bool
delete Key
scan BoundRange Iter<KvPair>
scan_keys BoundRange Iter<Key>
batch_get Iter<Key> Iter<KvPair> 跳过不存在的键;不保留顺序
batch_get_for_update Iter<Key> Iter<KvPair> 跳过不存在的键;不保留顺序
lock_keys Iter<Key>
send_heart_beat u64(TTL)
gc 时间戳 bool 如果 PD 中的最新安全点等于参数,则返回 true

开发和贡献

我们欢迎您的贡献!代码贡献很棒,我们也感谢提交 问题 来识别错误并提供反馈,添加测试或示例,以及改进文档。

构建和测试

我们使用标准的Cargo工作流程,例如,使用cargo build来构建和使用cargo test/nextest来运行单元测试。您需要使用夜间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 issues或PR上提问;如果您没有收到回复,应该ping @ekexium或@andylokandy。

依赖项

~41MB
~795K SLoC