批量插入的缓冲数据

时间:2017-08-07 05:18:13

标签: logging rabbitmq clickhouse

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

4 个答案:

答案 0 :(得分:1)

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

这对我们来说非常有效。

你可以写一个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

答案 1 :(得分:1)

为此目的直接创建了

Buffer表引擎。 不久,您使用此类引擎创建表并写入此表/从此表读取。 所有记录都将缓存在RAM中,并根据设置自动刷新到源表。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

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

此实现稳定运行。无数据丢失,平均负载低,需要的 Clickhouse 服务器内存少得多,并使整个系统的运行成本低得多。