在多台裸机机器上时 KSQLDB 集群失败 运行 docker

KSQLDB Cluster Failure when on Multiple Bare Metal machines running docker

我在尝试加入 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.125docker图片我看

root@192.168.150.125:~/docker/images/ksqldb# docker logs 0ea930c887f8 ===> Configuring ksqlDB... ===> Launching ksqlDB Server... OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in >version 9.0 and will likely be removed in a future release. [2020-06-22 14:38:07,797] INFO KsqlConfig values: ksql.access.validator.enable = auto 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 = ext ksql.hidden.topics = [_confluent.*, __confl.........

docker 日志 [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"}}, {"row":{"columns":["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 "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_1592830563312","schema":"ROWKEY STRING KEY, USERID STRING, ENTITYTYPE STRING, ENTITYID STRING, DATESEARCHED STRING, COUNT BIGINT"}}, {"row":{"columns":["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 "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": {} }' {"@type":"statement_error","error_code":40001,"message":"Unable to execute pull query: 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 节点不会相互通信。 ksqlNodes 的 'clustering' 利用共享命令主题和 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,以便通告的侦听器可从集群中的所有节点解析和访问。

好吧,我可以确认我终于可以使用我的 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 的 link 的精彩听众解释 https://www.confluent.io/blog/kafka-listeners-explained/