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



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

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

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

这对我们来说效果很好。

Ofcrouse您还可以编写一个golang工具,从rabbitmq消费并批量插入到clickhouse中。

在高峰期,我们每秒执行 140 K 条消息,所以我写道 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

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

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

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

现在数据流是这样的: 服务器 -> 点击屋-货物 -> 缓冲区表 -> 真正的点击屋表

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

最新更新