CrateDB 6.4.0 发布:面向机器数据的分布式 SQL 数据库继续演进

2026-07-07 24 预计阅读时间: 1 分钟
来源: oschina.net AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:9 分钟

CrateDB 6.4.0 已正式发布。对于正在处理日志、指标、IoT 事件、设备遥测这类机器数据的团队来说,CrateDB 的定位一直很直接:用 SQL 查询分布式数据,同时保留接近 NoSQL 系统的扩展性和灵活性。这个版本带来了若干亮点更新,也包含 Breaking Changes,升级前需要认真读变更说明并在测试环境跑一遍现有查询。

为什么 CrateDB 适合机器数据场景

机器数据的共同特点是写入频繁、字段可能变化、查询往往带有时间窗口和聚合条件。传统关系型数据库可以提供成熟 SQL,但横向扩展和高吞吐写入通常需要额外工程;NoSQL 系统能扛写入,但分析查询经常要绕一层查询语言、ETL 或外部计算引擎。

CrateDB 试图把这两类诉求放在一起:

  • 使用 SQL 建表、写入、查询,降低分析和运维门槛。
  • 以分布式集群承载数据,支持横向扩展。
  • 面向大量机器数据做实时摄取和临时查询。
  • 支持在整个集群上并行执行查询,而不是只在单点数据库里排队。

来源摘要提到,最小的 CrateDB 集群也可以轻松达到每秒数万条记录的摄取能力。实际落地时,吞吐还会受节点规格、磁盘、网络、分片设计、批量写入方式和索引字段影响,不能只看数据库名字就假设性能已经到位。

6.4.0 的升级重点:新功能之外,先看 Breaking Changes

这次发布明确包含 Breaking Changes。摘要没有列出具体破坏性变更,因此工程上不能直接把生产集群从旧版本滚到 6.4.0 就结束。

更稳妥的升级路径是:

  • 在测试环境部署 6.4.0,导入一份接近真实规模的数据样本。
  • 跑现有 DDL、写入链路、报表 SQL、告警 SQL 和后台任务。
  • 检查客户端驱动、连接池、认证配置、SQL 语法和系统表查询是否受影响。
  • 验证写入吞吐、查询延迟、磁盘增长和节点重启行为。
  • 再决定是否做滚动升级或窗口升级。

对于机器数据平台,Breaking Changes 的风险不只在“服务能不能启动”,还在“聚合结果是否一致”“字段映射是否兼容”“高峰写入是否退化”。这些问题最好用自动化脚本提前暴露。

可以这样实践:用 Docker 跑一个本地 CrateDB 并写入事件

下面示例不是 6.4.0 发布说明中的官方配置细节,而是一个可以改造的本地验证流程。你可以用它快速体验 CrateDB 的 SQL 写入和查询方式。运行前请把镜像标签替换为你要验证的 CrateDB 版本,例如 6.4.0

# 启动一个单节点 CrateDB,用于本地验证,不建议直接作为生产配置
CRATEDB_VERSION=6.4.0

docker run --rm \
  --name cratedb \
  -p 4200:4200 \
  -p 5432:5432 \
  crate:$CRATEDB_VERSION \
  -Cdiscovery.type=single-node

CrateDB 默认提供 HTTP 接口,下面用 curl 执行 SQL。你可以把 sensor_idtemperaturestatus 换成自己的设备、日志或指标字段。

curl -sS -H 'Content-Type: application/json' \
  -X POST 'http://localhost:4200/_sql' \
  -d '{
    "stmt": "CREATE TABLE IF NOT EXISTS machine_events (ts TIMESTAMP, sensor_id TEXT, temperature DOUBLE, status TEXT)"
  }'

插入几条模拟机器事件:

curl -sS -H 'Content-Type: application/json' \
  -X POST 'http://localhost:4200/_sql' \
  -d '{
    "stmt": "INSERT INTO machine_events (ts, sensor_id, temperature, status) VALUES (?, ?, ?, ?)",
    "bulk_args": [
      ["2026-07-07T10:00:00Z", "sensor-a", 42.7, "ok"],
      ["2026-07-07T10:00:03Z", "sensor-a", 44.1, "ok"],
      ["2026-07-07T10:00:05Z", "sensor-b", 91.2, "hot"]
    ]
  }'

做一个临时聚合查询,观察每个传感器的事件数和最高温度:

curl -sS -H 'Content-Type: application/json' \
  -X POST 'http://localhost:4200/_sql' \
  -d '{
    "stmt": "SELECT sensor_id, count(*) AS events, max(temperature) AS max_temp FROM machine_events GROUP BY sensor_id ORDER BY sensor_id"
  }'

这个流程适合做三件事:确认 SQL 兼容性、验证客户端访问方式、给升级测试准备最小脚本。真正压测时,应改用批量写入工具或应用端批处理,并加入并发、时间窗口查询和节点故障场景。

用 Python 模拟一个小型摄取脚本

如果你的应用侧已经使用 Python,可以通过 HTTP 接口做一个最小写入器。下面脚本依赖 requests,用于演示批量写入结构;生产环境还需要重试、超时、错误分类和指标上报。

python -m venv .venv
. .venv/bin/activate
pip install requests
import random
import time
from datetime import datetime, timezone

import requests

CRATEDB_SQL_ENDPOINT = "http://localhost:4200/_sql"


def sql(stmt, args=None, bulk_args=None):
    payload = {"stmt": stmt}
    if args is not None:
        payload["args"] = args
    if bulk_args is not None:
        payload["bulk_args"] = bulk_args

    response = requests.post(CRATEDB_SQL_ENDPOINT, json=payload, timeout=5)
    response.raise_for_status()
    return response.json()


sql("""
CREATE TABLE IF NOT EXISTS machine_events (
  ts TIMESTAMP,
  sensor_id TEXT,
  temperature DOUBLE,
  status TEXT
)
""")

rows = []
for i in range(100):
    temp = round(random.uniform(35, 95), 2)
    rows.append([
        datetime.now(timezone.utc).isoformat(),
        f"sensor-{i % 5}",
        temp,
        "hot" if temp >= 80 else "ok",
    ])
    time.sleep(0.01)

sql(
    "INSERT INTO machine_events (ts, sensor_id, temperature, status) VALUES (?, ?, ?, ?)",
    bulk_args=rows,
)

result = sql("""
SELECT sensor_id, count(*) AS events, avg(temperature) AS avg_temp
FROM machine_events
GROUP BY sensor_id
ORDER BY sensor_id
""")

for row in result["rows"]:
    print(row)

运行前确保上面的 Docker 容器仍在运行,然后执行:

python ingest_demo.py

这个例子关注接口形态,不代表最佳性能配置。要做高吞吐摄取,应把批次大小、并发连接数、提交频率和失败重试策略纳入压测。

采用建议:把 CrateDB 当作数据平台组件,而不是简单替换品

CrateDB 适合想用 SQL 直接分析机器数据、同时需要分布式写入和查询能力的团队。它的价值不在于“像关系型数据库一样熟悉”或“像 NoSQL 一样能扩”,而在于把实时摄取、临时分析和集群并行查询放进同一个工作流里。

升级或引入 6.4.0 时,可以按这个清单推进:

  • 确认 Breaking Changes 是否影响当前 SQL、驱动和部署参数。
  • 用真实字段和真实查询做一轮本地或测试集群验证。
  • 为写入链路准备批量写入、限流、重试和观测指标。
  • 把高频查询、聚合查询、时间窗口查询纳入基准测试。
  • 明确哪些数据适合进 CrateDB,哪些仍应留在对象存储、消息队列或专用 OLTP 数据库中。

对开发者来说,CrateDB 6.4.0 值得关注的点很实际:它继续强化了“用 SQL 处理大量机器数据”的路线。但只要版本包含破坏性变更,正确姿势就是先验证,再迁移,把性能和兼容性都量出来。


相关推荐