赖珊
2025-8-5 09:53:08
之前写过一篇 StarRocks 开发环境搭建踩坑指北之存算分离篇讲解如何在本地搭建一个可以 debug 的存算分离版本。
但最近在本地调试一个场景,需要 CN 节点是以集群的方式启动,我还是按照老方法通过 docker 启动 CN,然后 export 端口的方式让 FE 进行绑定。
比如用以下两个命令可以启动两个 CN 节点。docker run -p 9060:9060 -p 8040:8040 -p 9050:9050 -p 8060:8060 -p 9070:9070 -itd --rm --name cn -e "TZ=Asia/Shanghai" starrocks/cn-ubuntu:3.5.2 复制代码 docker run -p 9061:9060 -p 8041:8040 -p 9051:9050 -p 8061:8060 -p 9071:9070 -itd --rm --name cn2 -e "TZ=Asia/Shanghai" starrocks/cn-ubuntu:3.5.2 复制代码 然后按照之前的方式在 FE 中手动绑定这两个节点:ALTER SYSTEM ADD COMPUTE NODE "127.0.0.1:9050"; ALTER SYSTEM ADD COMPUTE NODE "127.0.0.1:9051"; show compute nodes; 复制代码
此时会出现新增的第二个节点的状态有问题,比如 metrics 取不到,workerId 是-1(-1 代表节点创建失败了,默认值是 -1)
经过 debug 发现是在添加节点的时候,由于生成的 workerIpPort 与上一个节点相同(127.0.0.1:9060) 从而导致这个节点被跳过了。
也就是说我这两个 CN 节点不能是相同的 IP(用不同的端口来区分)。
解决这个问题有以下几个办法:
再找一个台机器来跑 CN2 节点
启动一个虚拟机来跑 CN2 节点
使用 docker compose 来启动 CN 集群,会在集群内自动分配不同的 IP
利用 Docker Bridge 创建一个虚拟网络,由他来分配 IP
第一种方案直接 Pass 了,我手上没有多余的设备。
第二种方案倒是可以直接用 OrbStack 启动一个 VM,但是还不如后面的 docker 来的轻量,此外还需要我安装运行环境,也 pass 了。
第三种方案看似可行,但也比较繁琐,由于 CN 给 docker compose 管理了,FE 要和 CN 网络打通也得在 docker compose 里运行,这样我 Debug 就不方便了,更别提如果需要频繁修改源码的情况。
甚至每次修改代码后都得重新打包上传镜像,以及开启 remote debug,非常麻烦。
这么看来就第四种方案最为合适了。
使用 Docker Bridge 网络
我们可以使用 Docker Bridge 创建一个虚拟网络,使用这个虚拟网络启动的镜像会自动分配自定义范围的 IP;同时本地启动的 FE 也能直接访问。docker network create --subnet=172.18.0.0/16 --gateway=172.18.0.1 my_custom_net 复制代码 首先用 docker 创建一个 network。
--subnet=172.18.0.0/16: 定义网络的 IP 地址范围。这里我们使用了 172.18.x.x 这个私有网段。
--gateway=172.18.0.1: 指定这个网络的网关地址。
之后我们就可以使用这个虚拟网络来启动容器了。docker run --ip 172.18.0.20 --net my_custom_net -p 9060:9060 -p 8040:8040 -p 9050:9050 -p 8060:8060 -p 9070:9070 -itd --rm --name cn -e "TZ=Asia/Shanghai" starrocks/cn-ubuntu:3.5.2 docker run --ip 172.18.0.30 --net my_custom_net -p 9061:9060 -p 8041:8040 -p 9051:9050 -p 8061:8060 -p 9071:9070 -itd --rm --name cn2 -e "TZ=Asia/Shanghai" starrocks/cn-ubuntu:3.5.2 复制代码 这样这两个容器就会被分配不同的 IP,并且网络和宿主机也是互通的。
需要注意的是这里的子网尽量选择 172.16.0.0 到 172.31.255.255 这个 IP 段,192.168.0.0 到 192.168.255.255 这个范围段很有可能家里或公司的路由器占用了。
而这里的网关 --gateway=172.18.0.1地址也需要在我们自定义的 IP 范围里。
同时我们也不需要在这两个容器内为 CN 指定 priority_networks 参数了。
同理 minio 也得使用这个虚拟网络启动:docker run -d --rm --name minio \ --ip 172.18.0.10 \ --net my_custom_net \ -e MINIO_ROOT_USER=miniouser \ -e MINIO_ROOT_PASSWORD=miniopassword \ -p 9001:9001 \ -p 9000:9000 \ --entrypoint sh \ minio/minio:latest \ -c 'mkdir -p /minio_data/starrocks && minio server /minio_data --console-address ":9001"' 复制代码 设置 token 的时候也要指定对应的 IP:mc alias set myminio http://172.18.0.10:9000 miniouser miniopassword; mc admin user svcacct add --access-key AAAAAAAAAAAAAAAAAAAA --secret-key BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB myminio miniouser 复制代码 当 CN 和 minio 都启动之后,我们在 FE 里手动绑定这两个 CN 节点:ALTER SYSTEM ADD COMPUTE NODE "172.18.0.20:9050"; ALTER SYSTEM ADD COMPUTE NODE "172.18.0.30:9050" 复制代码 这样这两个节点就可以绑定成功了。
Blog
来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除
相关推荐