【问题标题】:Cassandra write throttling with multiple clientsCassandra 对多个客户端的写入限制
【发布时间】:2019-10-21 19:12:03
【问题描述】:

我有两个客户端(单独的 docker 容器)都写入 Cassandra 集群。

第一个是写入实时数据,以集群可以处理的速度摄取,尽管剩余容量很少。这被视为高优先级数据,我们不想丢弃任何数据。摄取率每分钟变化很大。有时数据会在客户端读取的队列中备份,有时客户端已清除队列并(短暂)等待更多数据。

第二个是来自在线商店的批量数据转储。我们希望以尽可能快的速度将其写入 Cassandra,以吸收写入实时数据后的任何空闲容量,但不会导致集群开始发出超时。

使用 DataStax Python 驱动程序并保持两个客户端分开(即它们不应该相互了解或交互),我如何限制来自第二个客户端的写入,以便在受约束的情况下最大化写入吞吐量不影响第一个客户端的写入吞吐量?

【问题讨论】:

  • 我认为您正在寻找过载保护。我认为目前 Cassandra 中没有任何可用的过载保护插件,但我的公司可能会在今年晚些时候开源我们的解决方案,提示提示;)您可以为 Cassandra QueryHandler 编写自己的插件并设置“-Dcassandra.custom_query_handler_class " cassandra-env.sh 中的 Java 变量。

标签: python cassandra datastax-python-driver


【解决方案1】:

我想出的解决方案是让两个数据生产者都写入相同的队列。

为了满足低优先级批量数据不干扰高优先级直播数据的要求,我让低优先级数据的生产者检查队列长度,然后才在队列中添加一条记录队列长度低于合适的阈值(在我的情况下为 5 条消息)。

结果是任何实时数据消息在队列中的前面都不能有超过 5 条批量数据消息。如果消息开始在队列中备份,那么批量数据生产者会停止排队更多数据,直到队列长度低于阈值。

我还将批量数据拆分为许多小消息,以便消费者可以相对快速地处理它们。

这种方法有三个缺点:

  1. 无法查看有多少排队的消息是低优先级的,有多少是高优先级的。但是我们知道,低优先级消息不能超过 5 条。
  2. 低优先级消息的生产者必须轮询队列以获取当前长度,这会在队列服务器上产生少量额外负载。
  3. 没有严格应用阈值,因为从检查队列长度到排队消息的两个生产者之间存在竞争。这并不严重,因为低优先级生产者在竞争失败时只排队一条消息,下次它会知道队列太长并等待。

【讨论】:

    猜你喜欢
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 2015-06-21
    • 2021-09-01
    相关资源
    最近更新 更多