0

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

4

4 回答 4

4

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

于 2017-09-20T08:46:30.733 回答
1

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

这对我们来说非常有效。

Ofcrouse,您还可以编写一个 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

于 2017-09-06T11:59:20.220 回答
0

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

于 2017-08-08T10:02:41.693 回答
0

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

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

现在数据流是这样的:Servers -> clickhouse-cargo -> Buffer tables -> Real Clickhouse tables

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

于 2021-06-24T04:07:32.017 回答