多少个连接/订阅可以处理Kafka KSQL?

时间:2018-08-24 07:50:56

标签: apache-kafka ksql

我们正在尝试将Kafka KSQL迁移到我们的系统,并希望分享一些在此过程中无法解决的问题。 集群中有3个Kafka节点,每个服务器都有:

8 CORE  
50G+ RAM  
100G ssd  

在每台服务器上,我们都有Zookeeper来管理集群。 所有操作系统限制都增加了,因此节点可以使用超出其所需资源的资源:

Xmx: 10G  
Xms: 10G  
nofiles: 500000

目前,从生产者到集群的流量很小(每秒约10条消息)。现在我们只有一个生产者,消息格式为:

{"user_id": <id|INT>, "action_id": <id|INT>, "amount": <amount|FLOAT>}

Kafka中的主题分为1个复制项的6个分区:

Topic:<some_topic>   PartitionCount:6        ReplicationFactor:1     Configs:
        Topic: <some_topic>  Partition: 0    Leader: 0       Replicas: 0     Isr: 0
        Topic: <some_topic>  Partition: 1    Leader: 1       Replicas: 1     Isr: 1
        Topic: <some_topic>  Partition: 2    Leader: 2       Replicas: 2     Isr: 2
        Topic: <some_topic>  Partition: 3    Leader: 0       Replicas: 0     Isr: 0
        Topic: <some_topic>  Partition: 4    Leader: 1       Replicas: 1     Isr: 1
        Topic: <some_topic>  Partition: 5    Leader: 2       Replicas: 2     Isr: 2

现在,当然,节点没有得到充分利用,而在kafka方面,一切都还可以。

我们希望在Kafka上使用KSQL,以便能够使用SQL过滤进入系统的数据。 以下是KSQL服务器资源:

32 CORE
100G+ RAM
50G+ ssd

我们只有一张桌子:

 Field   | Type                      
-------------------------------------
 ROWTIME   | BIGINT           (system) 
 ROWKEY    | VARCHAR(STRING)  (system) 
 ACTION_ID | INTEGER                   
 USER_ID   | INTEGER                   
 AMOUNT    | DOUBLE         

以下是创建表的命令:

create table <some_table> (action_id INT, user_Id INT, amount DOUBLE) with (KAFKA_TOPIC='<some_topic>', VALUE_FORMAT='JSON', KEY = 'user_id');

在我们的应用程序中,我们需要通过user_id预订表,如下所示:

SELECT * FROM <some_table> WHERE USER_ID=<some_user_id>;

对于生产KSQL服务器配置,我们使用来自合流的官方建议: https://docs.confluent.io/current/ksql/docs/installation/server-config/config-reference.html#recommended-ksql-production-settings

KSQL服务器的操作系统和软件限制也有所增加:

Xmx: 10G  (we have tried till 50G)
Xms: 10G  (we have tried till 50G)
nofiles: 500000

如果仅使用一个订阅,则不会出现任何问题(在这种情况下,一切都很好)。
但是我们总共需要超过200000个订阅。因此,当我们尝试获得100-200个并行订阅时,我们的客户端就会出现“读取超时”。在服务器中,我们看不到任何可能影响KSQL的异常负载。
我们认为该问题仅与KSQL有关,因为当我们尝试使用另一台KSQL服务器(在另一台机器上)时,同时我们可以看到第二台服务器工作正常并且可以处理大约1-20个订阅。

我在与KSQL服务器连接的Internet上找不到任何基准,在文档中,我也没有提及KSQL的用例,也许它仅设计用于为少量连接提供大量数据,或者也许我们的系统配置不正确,所以我们应该对其进行修复以使用该软件来实现我们的目标。
任何建议都会有所帮助。
预先感谢)

1 个答案:

答案 0 :(得分:0)

您遇到ksqlDB的可伸缩性问题的原因是,您正在以不被设计为使用推式查询的方式来使用推查询...。

推送查询:

SELECT * FROM <some_table> WHERE USER_ID=<some_user_id>;

您要用来为特定用户订阅更新似乎是完全明智的选择。

但是,在ksql版本中,您使用的是此类推式查询,我们只打算供在CLI上执行命令的人员使用。每个此类查询将在内部消耗大量服务器资源,并消耗源主题中的所有行。

基本上,推送查询不会扩展。

ksqlDB团队正在积极致力于增强ksql以支持这种确切的用例样式,因为我们认识到这是常见的事情。 (请参见https://github.com/confluentinc/ksql/issues/5517)。

同时,实现此目标的方法是使用您自己的使用者直接从Kafka使用数据并在本地进行过滤。