用于批量插入的缓冲区数据
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 服务器上需要更少的内存,并且使整个事情的运行成本更低。
【讨论】:
以上是关于用于批量插入的缓冲区数据的主要内容,如果未能解决你的问题,请参考以下文章