StarRocks 如何在本地搭建存算分離集群
最近在本地調(diào)試一個場景,需要 CN 節(jié)點是以集群的方式啟動,我還是按照老方法[2]通過 docker 啟動 CN,然后 export 端口的方式讓 FE 進行綁定。
比如用以下兩個命令可以啟動兩個 CN 節(jié)點。
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 中手動綁定這兩個節(jié)點:
ALTER SYSTEM ADD COMPUTE NODE "127.0.0.1:9050";
ALTER SYSTEM ADD COMPUTE NODE "127.0.0.1:9051";
show compute nodes;
圖片
此時會出現(xiàn)新增的第二個節(jié)點的狀態(tài)有問題,比如 metrics 取不到,workerId 是-1(-1 代表節(jié)點創(chuàng)建失敗了,默認值是 -1)
圖片
圖片
經(jīng)過 debug 發(fā)現(xiàn)是在添加節(jié)點的時候,由于生成的 workerIpPort 與上一個節(jié)點相同(127.0.0.1:9060) 從而導(dǎo)致這個節(jié)點被跳過了。
也就是說我這兩個 CN 節(jié)點不能是相同的 IP(用不同的端口來區(qū)分)。
解決這個問題有以下幾個辦法:
? 再找一個臺機器來跑 CN2 節(jié)點
? 啟動一個虛擬機來跑 CN2 節(jié)點
? 使用 docker compose 來啟動 CN 集群,會在集群內(nèi)自動分配不同的 IP
? 利用 Docker Bridge 創(chuàng)建一個虛擬網(wǎng)絡(luò),由他來分配 IP
第一種方案直接 Pass 了,我手上沒有多余的設(shè)備。
第二種方案倒是可以直接用 OrbStack 啟動一個 VM,但是還不如后面的 docker 來的輕量,此外還需要我安裝運行環(huán)境,也 pass 了。
第三種方案看似可行,但也比較繁瑣,由于 CN 給 docker compose 管理了,F(xiàn)E 要和 CN 網(wǎng)絡(luò)打通也得在 docker compose 里運行,這樣我 Debug 就不方便了,更別提如果需要頻繁修改源碼的情況。
甚至每次修改代碼后都得重新打包上傳鏡像,以及開啟 remote debug,非常麻煩。
這么看來就第四種方案最為合適了。
使用 Docker Bridge 網(wǎng)絡(luò)
我們可以使用 Docker Bridge 創(chuàng)建一個虛擬網(wǎng)絡(luò),使用這個虛擬網(wǎng)絡(luò)啟動的鏡像會自動分配自定義范圍的 IP;同時本地啟動的 FE 也能直接訪問。
docker network create --subnet=172.18.0.0/16 --gateway=172.18.0.1 my_custom_net首先用 docker 創(chuàng)建一個 network。
- ? --subnet=172.18.0.0/16: 定義網(wǎng)絡(luò)的 IP 地址范圍。這里我們使用了 172.18.x.x 這個私有網(wǎng)段。
- ? --gateway=172.18.0.1: 指定這個網(wǎng)絡(luò)的網(wǎng)關(guān)地址。
之后我們就可以使用這個虛擬網(wǎng)絡(luò)來啟動容器了。
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,并且網(wǎng)絡(luò)和宿主機也是互通的。
需要注意的是這里的子網(wǎng)盡量選擇 172.16.0.0 到 172.31.255.255 這個 IP 段,192.168.0.0 到 192.168.255.255 這個范圍段很有可能家里或公司的路由器占用了。
而這里的網(wǎng)關(guān) --gateway=172.18.0.1地址也需要在我們自定義的 IP 范圍里。
同時我們也不需要在這兩個容器內(nèi)為 CN 指定 priority_networks 參數(shù)了。
同理 minio 也得使用這個虛擬網(wǎng)絡(luò)啟動:
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"'設(shè)置 token 的時候也要指定對應(yīng)的 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 節(jié)點:
ALTER SYSTEM ADD COMPUTE NODE "172.18.0.20:9050";
ALTER SYSTEM ADD COMPUTE NODE "172.18.0.30:9050"這樣這兩個節(jié)點就可以綁定成功了。
引用鏈接
[1] StarRocks 開發(fā)環(huán)境搭建踩坑指北之存算分離篇: 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/






























