用于批量插入的缓冲区数据

Posted

技术标签:

【中文标题】用于批量插入的缓冲区数据【英文标题】:Buffer data for bulk insertion 【发布时间】:2017-08-07 05:18:13 【问题描述】:

每次在我的网站上提出请求时,一些有关该事件的数据都会记录到数据库(Yandex ClickHouse)中。如果插入是在至少 1000 条记录的批量中完成的,ClickHouse 的工作速度会大大加快。在每个请求上,我都想将数据发送到另一台将存储数据的计算机,然后在缓冲区达到一定大小(例如 1000)时将其刷新到数据库。我正在考虑使用 RabbitMQ 进行消息传递/缓冲,但我`我不确定它是否是正确的工具。有什么建议吗?

【问题讨论】:

【参考方案1】:

Buffer 直接为此目的创建的表引擎。 很快,您使用这种类型的引擎创建表并写入该表/从该表读取。 所有记录都会缓存在 RAM 中,并根据设置自动刷新到源表。

【讨论】:

【参考方案2】:

我们选择让 nginx 将 json 格式的访问日志发送到 syslog 服务器(syslog-ng) syslog-ng 可以使用外部应用程序。并且可以将 STDIN 数据导入应用程序。所以我们编写了一个 golang 实用程序来批量插入到 clickhouse。

这对我们来说效果很好。

您还可以编写一个 golang 工具从 rabbitmq 中使用并批量插入到 clickhouse。

在峰值时,我们每秒处理 14 万条消息,所以我写到 golang 每秒执行一个查询。所以它会根据每秒的消息量自动放大和缩小。

https://www.balabit.com/documents/syslog-ng-ose-latest-guides/en/syslog-ng-ose-guide-admin/html/configuring-destinations-program.html

http://nginx.org/en/docs/syslog.html

【讨论】:

【参考方案3】:

是的,RabbitMQ 它是适合您用例的工具 但你也可以尝试使用缓冲表引擎 https://clickhouse.yandex/docs/en/table_engines/buffer.html

【讨论】:

【参考方案4】:

我们一直在使用 clickhouse 从大量节点服务器以大约 300k qps 收集数据,并一直在使用 Buffer tables 来处理“部件过多”的问题。我们在使用缓冲区表时遇到了一些限制。最重要的是,它更容易导致单点故障:平均负载高、内存消耗难以控制、进程挂起时丢失数据。

我们的前端服务器是用Nodejs编写的,所以我们为每个服务器节点做了一个分布式缓冲层,称为clickhouse-cargo。

现在数据流是这样的: 服务器 -> clickhouse-cargo -> 缓冲表 -> 真正的 Clickhouse 表

此实施工作稳定。没有数据丢失,平均负载低,在 Clickhouse 服务器上需要更少的内存,并且使整个事情的运行成本更低。

【讨论】:

以上是关于用于批量插入的缓冲区数据的主要内容,如果未能解决你的问题,请参考以下文章

mongodb批量插入数据

C#:几种数据库的大数据批量插入 - faib

c#实现几种数据库的大数据批量插入

用于原始查询的 Laravel 批量插入

Java:如何使用用于 Sql Server 的 java jdbc 执行带有标识列的批量插入

批量插入数据