跳转到主要内容

Crate开发者命令行工具集合

项目描述

github actions Wheel PyPI Version Python Version

Crate开发人员(以及可能的用户)提供命令行工具集合。

目录

为什么是cr8? 🤔

  1. 快速生成样本数据。通常,如果有人报告问题,则需要样本数据才能重现它。 插入假数据插入JSON 解决了这个问题。

  2. 为了基准测试查询并比较Crate不同版本的运行时间。 timeit 🕐运行规范运行跟踪 可以用于获取查询的运行时统计信息。这些工具专注于响应延迟。能够进行吞吐量基准测试不是cr8的目标。同样,能够模拟现实世界用例也不是cr8的目标。

安装 💾

使用命令行工具需要 Python >= 3.7。

使用 pip 进行安装。

python3 -m venv venv
venv/bin/python -m pip install cr8

这将把 cr8 安装到 venv/bin 目录。另一种方法是下载单个 zipapp 文件,可以从 发布页面 获取。

用法

主二进制文件名为 cr8,其中包含几个子命令。

使用 cr8 -hcr8 <subcommand> -h 获取更详细的用法描述。

下面更详细地描述了包含的子命令

提示:

任何带有 --hosts 参数的 <subcommand> 都支持像这样进行密码认证

cr8 <subcommand> --hosts http://username:password@localhost:4200 <remaining args>

Shell完成

cr8 通过 argcompletebashzsh 中支持命令补全。

  • 安装 argcomplete

  • 运行 activate-global-python-argcomplete

确保您使用的是 argcomplete > 3.0。在较旧版本的 argcomplete 中,需要在 zsh 中使用 bashcompinit 兼容层,并通过 eval "$(register-python-argcomplete cr8)" 注册应用程序。有关详细信息,请参阅上游文档。

子命令

timeit 🕐

一个可以用来测量在集群上给定 SQL 语句运行时间的工具

>>> echo "select name from sys.cluster" | cr8 timeit --hosts localhost:4200
Runtime (in ms):
    mean:    ... ± ...
    min/max: ... → ...
Percentile:
    50:   ... ± ... (stdev)
    95:   ...
    99.9: ...

插入假数据

一个可以用来用随机数据填充表的工具。脚本将使用 faker 生成记录。

例如,给定以下表

create table x.demo (
    id int,
    name text,
    country text
);

可以使用以下命令插入 1000 条记录

>>> cr8 insert-fake-data --hosts localhost:4200 --table x.demo --num-records 200
Found schema:
{
    "country": "text",
    "id": "integer",
    "name": "text"
}
Using insert statement:
insert into "x"."demo" ("id", "name", "country") values ($1, $2, $3)
Will make 1 requests with a bulk size of 200
Generating fake data and executing inserts
<BLANKLINE>

它将自动从表中读取模式,并将列映射到 faker providers,并插入指定数量的记录。

(目前仅支持顶级列)

生成随机记录的另一种方法是使用 mkjson,它可以与 insert-json 一起使用。

插入JSON

insert-json 可以用来从 JSON 文件中插入记录

>>> cat tests/demo.json | cr8 insert-json --table x.demo --hosts localhost:4200
Executing inserts: bulk_size=1000 concurrency=25
Runtime (in ms):
    mean:    ... ± 0.000

或者简单地从 JSON 字符串中打印生成的插入语句

>>> echo '{"name": "Arthur"}' | cr8 insert-json --table mytable
('insert into mytable ("name") values ($1)', ['Arthur'])
...

从SQL插入

从一个 CrateDB 集群或 PostgreSQL 服务器复制数据到另一个。

>>> cr8 insert-from-sql \
...   --src-uri "postgresql://crate@localhost:5432/doc" \
...   --query "SELECT name FROM x.demo" \
...   --hosts localhost:4200 \
...   --table y.demo \
INSERT INTO y.demo ("name") VALUES ($1)
Runtime (in ms):
...

该命令的 concurrency 选项仅影响并发写操作的数量。始终只有一个读取操作,因此复制操作可能受限于读取性能。

运行规范

一个可以对集群进行基准测试并将结果存储在另一个集群中的工具。基准测试本身是在一个规范文件中定义的,该文件定义了 setupbenchmarkteardown 指令。

指令本身只是 SQL 语句(或包含 SQL 语句的文件)。

specs 文件夹中有一个示例规范文件。

用法

>>> cr8 run-spec specs/sample.toml localhost:4200 -r localhost:4200
# Running setUp
# Running benchmark
<BLANKLINE>
## Running Query:
   Name: count countries
   Statement: select count(*) from countries
   Concurrency: 2
   Duration: 1
Runtime (in ms):
    mean:    ... ± ...
    min/max: ... → ...
Percentile:
    50:   ... ± ... (stdev)
    95:   ...
    99.9: ...
...
## Skipping (Version ...
   Statement: ...
# Running tearDown
<BLANKLINE>

-r 是可选的,可以用来将基准测试结果保存到集群中。如果不存在,将创建一个名为 benchmarks 的表。

也支持使用 Python 编写规范文件。

>>> cr8 run-spec specs/sample.py localhost:4200
# Running setUp
# Running benchmark
...

运行Crate

启动一个 Crate 实例

> cr8 run-crate 0.55.0

这需要 Java 8。

run-crate 支持使用 -- 连接额外的命令。在 run-crate 的上下文中,任何主机 URL 都可以使用 {node.http_url} 格式字符串进行格式化。

>>> cr8 run-crate latest-stable -- timeit -s "select 1" --hosts '{node.http_url}'
 # run-crate
===========
<BLANKLINE>
...
Starting Crate process
CrateDB launching:
    PID: ...
    Logs: ...
    Data: ...
<BLANKLINE>
...
Cluster ready to process requests
<BLANKLINE>
<BLANKLINE>
# timeit
========
<BLANKLINE>
<BLANKLINE>
<BLANKLINE>
<BLANKLINE>

在上面的例子中,timeit 是一个 cr8 特定的子命令。但也可以通过在命令前加上 @ 来使用任意命令。

cr8 run-crate latest-nightly -- @http '{node.http_url}'

脚本重现

这个功能的一个常见用途是快速重现错误报告。

cr8 run-crate latest-nightly -- @crash --hosts {node.http_url} <<EOF
    create table mytable (x int);
    insert into mytable (x) values (1);
    refresh mytable;
    ...
EOF

查找回归

另一个用例是将 run-craterun-specgit bisect 结合使用。

git bisect run cr8 run-crate path/to/crate/src \
    -- run-spec path/to/spec.toml '{node.http_url}' --fail-if '{runtime_stats.mean} > 15'

这也可以与 timeout 结合使用。

性能分析

这也可以与 Java 飞行记录器结合使用,以进行性能分析。

cr8 run-crate latest-nightly \
    -e CRATE_HEAP_SIZE=4g \
    -e CRATE_JAVA_OPTS="-Dcrate.signal_handler.disabled=true -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints -XX:+UnlockCommercialFeatures -XX:+FlightRecorder" \
    -s discovery.type=single-node \
    -- run-spec path/to/specs/example.toml {node.http_url} --action setup \
    -- @jcmd {node.process.pid} JFR.start duration=60s filename=myrecording.jfr \
    -- run-spec path/to/specs/example.toml {node.http_url} --action queries \
    -- @jcmd {node.process.pid} JFR.stop

创建CrateDB集群

cr8 不包含用于启动 CrateDB 集群的专用命令。但可以通过运行 cr8 run-crate <version> -s cluster.name=<name> 来启动多个节点。如果集群名称匹配,它将形成一个集群。

运行跟踪

一个运行 .toml 跟踪文件的工具。跟踪是节点版本、配置和规范文件的矩阵定义。

对于每个版本和配置,都会启动一个 Crate 节点,并执行所有规范。

>>> cr8 run-track tracks/sample.toml
# Version:  latest-testing
## Starting Crate latest-testing, configuration: default.toml
### Running spec file:  sample.toml
# Running setUp
# Running benchmark
...

重新索引

一个命令,用于重新索引集群中所有在先前主版本中创建的表。因此,如果您正在运行 3.x CrateDB 集群,所有 2.x 的表都将被重新创建。

>>> cr8 reindex --help
usage: cr8 reindex [-h] --hosts HOSTS
...

协议

cr8 支持使用 HTTPpostgres 协议。

请注意,使用 postgres 协议会导致 cr8 测量往返时间而不是服务时间。因此,测量结果将不同。

要使用 postgres 协议,必须在主机 URI 中使用 asyncpg 方案。

>>> echo "select 1" | cr8 timeit --hosts asyncpg://:5432
Runtime (in ms):
...

开发 ☢

要获得带有所有依赖项的沙盒环境,请使用 venv

python -m venv .venv
source .venv/bin/activate

使用 pip 安装 cr8 包。

python -m pip install -e .

运行 cr8

cr8 -h

测试使用 python -m unittest 运行。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码分发

cr8-0.27.1.tar.gz (63.4 kB 查看哈希值)

上传时间 源代码

构建分发

cr8-0.27.1-py3-none-any.whl (44.9 kB 查看哈希值)

上传时间 Python 3