【问题标题】:KSQLDB Cluster Failure when on Multiple Bare Metal machines running docker在运行 docker 的多台裸机机器上时 KSQLDB 集群失败
【发布时间】:2020-06-22 08:18:08
【问题描述】:

我在尝试加入 KSQLDB 集群并为请求提供服务时遇到了失败。我制作了一张图片,比我写的更好地解释了这个问题。标题为“集群失败”的框是我的问题。

有趣的是,它肯定会尝试集群,因为当我拨打 192.168.150.125:8087 时会收到 {"@type":"statement_error","error_code":40001,"message":"Unable to execute pull query:

@罗宾·莫法特 因此,对于 KDQLDB 版本,使用的 docker 映像是最新的

image: confluentinc/ksqldb-server

至于登录192.168.150.125 docker镜像我看

root@192.168.150.125:~/docker/images/ksqldb# docker logs 0ea930c887f8 ===> 配置 ksqlDB... ===> 正在启动 ksqlDB 服务器... OpenJDK 64 位服务器 VM 警告:选项 UseConcMarkSweepGC 在 >version 9.0 中已弃用,并且可能会在未来的版本中删除。 [2020-06-22 14:38:07,797] 信息 KsqlConfig 值: ksql.access.validator.enable = 自动 ksql.any.key.name.enabled = false ksql.authorization.cache.expiry.time.secs = 30 ksql.authorization.cache.max.entries = 10000 ksql.connect.url = http://localhost:8083 ksql.connect.worker.config = ksql.extension.dir = 分机 ksql.hidden.topics = [_confluent.*, __confl.........

docker logs [imageid] 日志文件中根本没有显示错误。我从头到尾浏览了一遍,甚至在尝试查询时,但日志中没有任何内容告诉我“我无法连接或加入集群”甚至“我已经尝试加入集群”。我会认为,因为这个容器正在尝试加入一个集群,所以会有一些关于它的日志记录,但什么也没有。

我得到的错误是在所有三台服务器上尝试相同的查询时。前两台服务器运行完美,如下所示,但不同机器上的容器出现“无法执行拉取查询:”错误。

root@192.168.150.124:~/docker/images/ksqldb# curl -X "POST" "http://192.168.150.124:8085/query" -H "Content-Type: application/vnd.ksql.v1 +json; charset=utf-8" -d $'{ "ksql": "SELECT * FROM chart_usage_table WHERE ROWKEY='73bd8a1d-5a9e-4343-b0e3-878ab5c37529|+|zn|+|09066437|+|2020-05 -03';", "streamsProperties": {} }' [{"header":{"queryId":"query_1592830554884","schema":"ROWKEY STRING KEY, USERID STRING, ENTITYTYPE STRING, ENTITYID STRING, DATESEARCHED STRING, COUNT BIGINT "}}, {"行":{"列":["73bd8a1d-5a9e-4343-b0e3-878ab5c37529|+|zn|+|09066437|+|2020-05-03","73bd8a1d-5a9e-4343-b0e3-878ab5c37529" ,"pzn","09066437","2020-05-03",100]}}]

root@192.168.150.124:~/docker/images/ksqldb# curl -X "POST" “http://192.168.150.124:8086/query”-H“内容类型: 应用程序/vnd.ksql.v1+json; charset=utf-8" -d $'{ "ksql": "SELECT * FROM chart_usage_table WHERE ROWKEY='73bd8a1d-5a9e-4343-b0e3-878ab5c37529|+|zn|+|09066437|+|2020-05-03';", “流属性”:​​{} }' [{"header":{"queryId":"query_1592830563312","schema":"ROWKEYSTRING 键,USERID 字符串,ENTITYTYPE 字符串,ENTITYID 字符串, DATESEARCHEDSTRING,COUNTBIGINT"}}, {"行":{"列":["73bd8a1d-5a9e-4343-b0e3-878ab5c37529|+|zn|+|09066437|+|2020-05-03","73bd8a1d-5a9e-4343-b0e3-878ab5c37529" ,"pzn","09066437","2020-05-03",100]}}]

root@192.168.150.124:~/docker/images/ksqldb# curl -X "POST" “http://192.168.150.125:8087/query”-H“内容类型: 应用程序/vnd.ksql.v1+json; charset=utf-8" -d $'{ "ksql": "SELECT * FROM chart_usage_table WHERE ROWKEY='73bd8a1d-5a9e-4343-b0e3-878ab5c37529|+|zn|+|09066437|+|2020-05-03';", “流属性”:​​{} }' {"@type":"statement_error","error_code":40001,"message":"无法 执行拉取查询:SELECT * FROM chart_usage_table WHERE ROWKEY='73bd8a1d-5a9e-4343-b0e3-878ab5c37529|+|zn|+|09066437|+|2020-05-03';","stackTrace":[],"statementText":"SELECT * FROM chart_usage_table WHERE ROWKEY ='73bd8a1d-5a9e-4343-b0e3-878ab5c37529|+|zn|+|09066437|+|2020-05-03';","entities":[]}

@安德鲁科茨,

感谢您的澄清,但我更加困惑,因为文档中提到了加入集群,但这并不重要。这里的问题是,即使我尝试了您的解决方案,它也不起作用。我不断收到一个绑定异常,这对我来说似乎是正确的,因为容器无法为其主机绑定任何东西。我也不是 Docker 专家,但我的指关节血腥到足以说问题似乎是 KSQLDB 无法解决某些问题,但没有说明它是什么。

ports:
    - "8087:8088"

extra_hosts:
    - "ACCL-FFM-SRV-125:192.168.150.125"
    - "ACCL-FFM-SRV-124:192.168.150.124"

environment:
    KSQL_LISTENERS: http://ACCL-FFM-SRV-125:8088

Caused by: java.net.BindException: Cannot assign requested address at java.base/sun.nio.ch.Net.bind0(Native Method)

不过,还有一件事,我在其他机器容器上调用 netcat 服务器没有问题。所以我知道网络解析从一台机器上的容器到另一台机器上的另一个容器运行良好。

[root@ksqldbservermvcu1 ~]# curl -X "POST" "http://ACCL-FFM-SRV-125:8086/query" 
-d $'NETCAT on container will receive this.'

并且在容器中设置了 netcat 来接收。

[root@ksqldbservermvcu4 ~]# nc -l -p 8086  
POST /query HTTP/1.1  
Host: ACCL-FFM-SRV-124:8086  
User-Agent: curl/7.61.1 Accept: */*
Content-Length: 38  
Content-Type: application/x-www-form-urlencoded

NETCAT on container will receive this.

顺便尝试使用 KSQL_ADVERTISED_LISTENER:http://192.168.150.125:8088 不会以任何方式得到尊重。注意's'

root@ksqldbservermvcu4:~/docker/images/ksqldb# docker logs a746f993b9d9 | grep advertised
    ksql.advertised.listener = null
[2020-07-02 10:44:52,127] WARN The configuration 'advertised.listener' was supplied but isn't a known config. (org.apache.kafka.clients.consumer.ConsumerConfig:355)

root@ksqldbservermvcu4:~/docker/images/ksqldb# docker logs 61fa63d920a3 | grep advertised
    ksql.advertised.listener = null
[2020-07-02 11:12:18,298] WARN The configuration 'advertised.listeners' was supplied but isn't a known config. (org.apache.kafka.clients.consumer.ConsumerConfig:355)

也许我遗漏了什么,请帮忙。

【问题讨论】:

  • 您能否编辑您的问题以指定 ksqlDB 服务器日志中的任何错误,以及您正在使用的版本
  • 应该是KSQL_KSQL_ADVERTISED_LISTENER,而不是KSQL_ADVERTISED_LISTENER

标签: docker confluent-platform ksqldb


【解决方案1】:

在引入拉查询之前,ksqlDB 节点之间没有相互通信。 ksqlNodes 的“集群”利用共享命令主题和 Kafka 的 Kafka 消费者组协议来共享工作。这就是您没有看到任何有关尝试加入集群的消息的原因:节点未加入集群。

在后台使用 Kafka Streams 的 交互式查询 拉取查询。这通过每个 ksqlDB 节点通告其他节点可以到达的端点来工作。这些通告的端点使用 Kafka 消费者组协议在 ksqlDB 节点之间共享,即节点通过与 Kafka 的通信相互了解。

当您向未托管您所需信息的节点发出拉取查询时,它将尝试通过在其通告的端点上联系该节点来将该请求转发到该节点。在您的情况下,正在发生的事情是您的节点从一台机器发布的端点无法从另一台机器访问。

KsqlDB v0.8 - 0.9 采用listeners 配置中的第一个侦听器并将其用作其广告侦听器/端点。一个常见的问题是人们在他们的监听器配置中使用通配符或环回地址,例如

listeners=localhost:8088
# or
listeners=127.0.0.1:8088

问题是在另一台机器上运行的 ksqlDB 节点无法使用这些地址到达该节点。

您可以通过更新您的listeners 配置以使用您运行它的机器的外部可访问名称来解决您的问题。例如

listeners=my.machine.name:8088

另外,KsqlDB 也有一个 ksql.advertised.listener,它本身不会导致 ksqlDB 创建另一个侦听器,而是允许您将与其他节点共享的侦听器设置为它们可以解析的东西,例如

listeners=localhost:8088
ksql.advertised.listener=host.that.all.nodes.can.resolve:8088

我自己没有尝试过以这种方式配置 docker 映像,我也不是 docker 专家,但是其中一个或两个应该允许您配置 ksqlDB,以便广告的侦听器可解析并可从所有节点访问集群。

【讨论】:

  • 安德鲁请参阅上面对原始问题的更新。
【解决方案2】:

好吧,我可以确认我终于在我的 docker-compose 文件中使用了下面显示的配置。但是我必须做的另一件事是重新启动机器(这台机器几乎一年没有重新启动)。我还必须删除 Kafka 集群中的所有主题。所有这些结合起来为这项工作扫清了道路。希望它可以帮助某人。

ksqldb-server-mvcu1:
    image: confluentinc/ksqldb-server
    hostname: ksqldbservermvcu1
    container_name: ksqldbservermvcu1
    volumes:
        - /root/docker/images/ksqldb/docker_mapped_folders/ksqldb:/tmp/ksqldb
    ports:
        - "8087:8088"
        - "31095:31099"
    extra_hosts:
        - "ACCL-FFM-SRV-125:192.168.150.125"
        - "ACCL-FFM-SRV-124:192.168.150.124"
    environment:
        KSQL_LISTENERS: http://0.0.0.0:8088
        KSQL_BOOTSTRAP_SERVERS: 192.168.150.156:9092,192.168.150.145:9092,192.168.150.160:9092
        KSQL_KSQL_LOGGING_PROCESSING_STREAM_AUTO_CREATE: "true"
        KSQL_KSQL_LOGGING_PROCESSING_TOPIC_AUTO_CREATE: "true"
        KSQL_KSQL_SERVICE_ID: "ksqldb_msg_shown_cluster"
        KSQL_KSQL_ADVERTISED_LISTENER: http://192.168.150.125:8087 

顺便说一句:请查看 Robin Moffatt 的此链接,以获得出色的听众解释 https://www.confluent.io/blog/kafka-listeners-explained/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 2020-08-05
    • 2021-01-07
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多