用于批量插入的缓冲数据

问题描述 投票:0回答:5

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

logging rabbitmq clickhouse
5个回答
5
投票

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


1
投票

我们选择让 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


0
投票

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


0
投票

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

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

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

该实施工作进展顺利。无数据丢失、平均负载低、Clickhouse 服务器上需要的内存少得多,并使整个运行成本便宜得多。


0
投票

我们找到了开源应用程序来在 kubernetes 上部署和运行它。仅在摄取和检索部分的情况下,这可能会有所帮助。它仅是自我管理的。 我已经在 Kubernetes 的单个 POD 上以 50K TPS 进行了测试。

https://github.com/Hardik94/syslog-db-k8s

https://www.reddit.com/r/techsupport/comments/1fl6qtd/syslog_clickhouse_kubernetes/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button

© www.soinside.com 2019 - 2024. All rights reserved.