跳到主要内容
跳到主要内容

异步插入 (async_insert)

将数据以大批量插入 ClickHouse 是一种最佳实践。它可以节省计算周期和磁盘 I/O,因此可以节省资金。如果您的使用场景允许您在 ClickHouse 外部批量处理插入操作,那么这是一种选择。如果您希望 ClickHouse 创建批次,那么您可以使用此处描述的异步 INSERT 模式。

通过启用 async_insert 设置,使用异步插入作为客户端批量处理数据和将插入速率保持在每秒一次插入查询左右的替代方案。这使得 ClickHouse 能够在服务器端处理批处理。

默认情况下,ClickHouse 同步写入数据。发送到 ClickHouse 的每个插入操作都会导致 ClickHouse 立即创建一个包含来自插入操作数据的 part。当 async_insert 设置为其默认值 0 时,这是默认行为。

compression block diagram

通过将 async_insert 设置为 1,ClickHouse 首先将传入的插入操作存储在内存缓冲区中,然后再定期刷新到磁盘。

有两种可能的情况会导致 ClickHouse 将缓冲区刷新到磁盘

任何时候满足上述任一条件,ClickHouse 都会将其内存缓冲区刷新到磁盘。

注意

一旦数据写入存储上的 part,您的数据就可以用于读取查询。当您想要修改 async_insert_busy_timeout_ms(默认设置为 1 秒)或 async_insert_max_data_size(默认设置为 10 MiB)设置时,请记住这一点。

使用 wait_for_async_insert 设置,您可以配置是否希望 insert 语句在数据插入缓冲区后立即返回确认(wait_for_async_insert = 0),或者默认情况下,在数据从缓冲区刷新后写入 part 后返回确认(wait_for_async_insert = 1)。

以下两个图表说明了 async_insert 和 wait_for_async_insert 的两个设置

compression block diagram

compression block diagram

启用异步插入

可以为特定用户或特定查询启用异步插入

  • 在用户级别启用异步插入。此示例使用用户 default,如果您创建了不同的用户,请替换该用户名

    ALTER USER default SETTINGS async_insert = 1
  • 您可以使用 insert 查询的 SETTINGS 子句来指定异步插入设置

    INSERT INTO YourTable SETTINGS async_insert=1, wait_for_async_insert=1 VALUES (...)
  • 当使用 ClickHouse 编程语言客户端时,您还可以将异步插入设置指定为连接参数。

    例如,当您使用 ClickHouse Java JDBC 驱动程序连接到 ClickHouse Cloud 时,您可以在 JDBC 连接字符串中这样做

    "jdbc:ch://HOST.clickhouse.cloud:8443/?user=default&password=PASSWORD&ssl=true&custom_http_params=async_insert=1,wait_for_async_insert=1"

我们强烈建议,如果使用异步插入,则使用 async_insert=1,wait_for_async_insert=1。使用 wait_for_async_insert=0 非常危险,因为您的 INSERT 客户端可能不知道是否存在错误,并且如果您的客户端在 ClickHouse 服务器需要减慢写入速度并创建一些背压以确保服务可靠性的情况下继续快速写入,则还可能导致潜在的过载。

使用异步插入时,默认情况下禁用自动重复数据删除

手动批处理(请参阅 批量插入)的优势在于,如果(完全)相同的 insert 语句多次发送到 ClickHouse Cloud,例如由于客户端软件中的自动重试导致一些临时网络连接问题,它支持表数据的 内置自动重复数据删除