Cassandra:如何使用多个应用程序正确实施 "global" 背压?

Cassandra : how to properly implement "global" back-pressure with multiples applications?

如您所知,对于 Cassandra,当节点过载时,根据所需的一致性,它可能会严重损害您的生产,因为节点可能变得无响应,整个守护进程也可能崩溃,提示可能会填满您的数据挂载点等等。

所以这里的关键词是back-pressure.

Spark on Cassandra做适当的back-pressure,特别有以下性质:

--conf "spark.cassandra.output.throughputMBPerSec=2"
--total-executor-cores 24

(也有与 Datastax drivercqlsh 类似的 back-pressure 选项。您基本上限制了每个核心的吞吐量,以应用一些 back-pressure

比方说,我在我的 Cassandra 集群上找到了我的全局写入吞吐量,我为我的 application1 设置了适当的设置,效果很好。

但挑战仍然在于 Cassandra 集群上有许多开发人员。所以在给定时间,我可能有 Spark application1application2application3、...并发运行。

问题:我有什么选择来确保给定时间的写入吞吐量(无论有多少应用程序同时运行)在全局范围内不会达到太大的压力Cassandra,从而损害了我的生产工作量?

谢谢

我建议人们为分离分析工作负载而做的是启动另一个(逻辑)数据中心。当然,它可能位于同一个 物理 数据中心。但您想要的是独立的计算和存储,以防止分析负载干扰生产流量。

首先,请确保您是 运行 GossipingPropertyFileSnitch (cassandra.yaml) 并且您的键空间正在使用 NetworkTopologyStrategy。同样,您需要确保您的键空间定义包含一个命名的数据中心,并且您的生产 application/services 被配置为使用该数据中心(例如:dc1,如下所示)作为它们的默认 DC:

ALTER KEYSPACE product_data WITH
    REPLICATION={'class':'NetworkTopologyStrategy',
                 'dc1':'3'};

一旦新的基础设施启动,安装 Cassandra 并通过在 cassandra-rackdc.properties 文件中指定新名称将节点作为新 DC 加入集群。类似于:

dc=dc1_analytics

接下来调整您的密钥空间以将数据复制到新的 DC。

ALTER KEYSPACE product_data WITH
    REPLICATION={'class':'NetworkTopologyStrategy',
                 'dc1':'3','dc1_analyitcs':'3'};

运行 一个 repair/rebuild 在新的 DC 上,然后将 Spark 作业配置为仅使用 dc1_analytics.