StarRocks 如何在本地搭建存算分離集群
最近在本地調試一個場景,需要 CN 節點是以集群的方式啟動,我還是按照老方法[2]通過 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.2docker 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"這樣這兩個節點就可以綁定成功了。
引用鏈接
[1] StarRocks 開發環境搭建踩坑指北之存算分離篇: https://crossoverjie.top/2025/02/26/ob/StarRocks-dev-shard-data-build/
[2] 老方法: https://crossoverjie.top/2025/02/26/ob/StarRocks-dev-shard-data-build/





























