Skip to content

[Bug] Stream Load connection redirect to 127.0.0.1:8040 fails in Docker environment #438

@zhangzhefang-github

Description

@zhangzhefang-github

环境信息

  • Flink version: 1.20.1
  • StarRocks connector version: 1.2.11
  • StarRocks version: 3.5.0 (allin1-ubuntu image)
  • Environment: Docker Compose
  • OS: Linux (WSL2)

问题描述
在Docker环境中使用StarRocks Flink连接器时,当配置'load-url' = 'starrocks:8030'(按照官方文档推荐配置),连接器会因为重定向处理失败而无法工作。

根本原因分析
通过源码分析发现,问题出现在StarRocks的HTTP重定向机制:
正常流程:客户端 → starrocks:8030 (FE) → FE重定向到BE节点
问题流程:FE重定向返回 Location: http://127.0.0.1:8040,而不是 http://starrocks:8040
结果:连接器尝试连接 127.0.0.1:8040 失败

  1. 复现步骤
services:
  starrocks:
    image: starrocks/allin1-ubuntu:3.5.0
    ports:
      - "8030:8030"
      - "9030:9030" 
      - "8040:8040"
    networks:
      - flink-network

  jobmanager:
    image: custom-flink:1.20.1
    depends_on:
      - starrocks
    networks:
      - flink-network
  1. Flink SQL配置:
CREATE TABLE test_table (
    id INT,
    name STRING
) WITH (
    'connector' = 'starrocks',
    'jdbc-url' = 'jdbc:mysql://starrocks:9030',
    'load-url' = 'starrocks:8030',  -- 按官方文档配置
    'database-name' = 'test_db',
    'table-name' = 'test_table',
    'username' = 'root',
    'password' = '',
    'sink.semantic' = 'at-least-once'
);

INSERT INTO test_table VALUES (1, 'test');
  1. 错误结果:
java.net.ConnectException: Connect to 127.0.0.1:8040 [/127.0.0.1] failed: Connection refused

错误堆栈
<details>
<summary>完整错误日志</summary>
org.apache.flink.runtime.JobException: Recovery is suppressed by NoRestartBackoffTimeStrategy
...
Caused by: java.net.ConnectException: Connect to 127.0.0.1:8040 [/127.0.0.1] failed: Connection refused
    at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:156)
    at com.starrocks.data.load.stream.DefaultStreamLoader.doHttpPut(DefaultStreamLoader.java:xxx)

网络连接验证

# DNS解析正常
$ nslookup starrocks
Name:   starrocks
Address: 172.25.0.10

# 服务正常运行
$ curl -I http://starrocks:8030
HTTP/1.1 401 Unauthorized  # 服务正常

临时解决方案
使用多个load-url地址可以解决:

源码分析
相关源码位置:

  • StarRocksDynamicSinkFunctionV2.java:276 - 调用flush
  • StreamLoadManagerV2.java - 管理stream load
  • DefaultStreamLoader.java - HTTP重定向处理

问题点:

  1. HTTP客户端使用默认重定向策略,没有处理Docker环境下的主机名映射
  2. 重定向响应中的Location头使用了127.0.0.1而不是容器网络中的正确地址

建议修复方案

  1. 短期方案:在文档中说明Docker环境需要使用多load-url配置
  2. 长期方案:改进重定向处理逻辑

检测到127.0.0.1重定向时,替换为原始主机名
或者提供配置项让用户指定重定向主机映射

影响范围

  • 所有使用Docker/Kubernetes等容器化环境的用户
  • 按照官方文档配置但无法正常工作

期望行为
使用官方文档推荐的 'load-url' = 'starrocks:8030' 配置应该能够正常工作,无需额外配置。
提交建议:

  1. 在StarRocks Flink连接器的GitHub仓库提交
  2. 选择 "Bug report" 标签
  3. 可以同时在StarRocks主仓库提交相关issue,因为重定向逻辑可能在FE端
  4. 附上我们分析过程中的关键源码片段截图
  5. 这样的issue提交显示了您对问题的深度理解,有助于开发团队快速定位和修复问题。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions