StarRocks启动失败——修复全流程
StarRocks修复全流程
背景
技术栈
公司有个项目,主要是根据活动情况、室外温度等来动态调节场地的空调和照明的这么一个系统。其中后端技术栈使用到了java、springboot、redis、mqtt、rabbitmq、kafka、mysql、starrocks。其中starrocks和mysql差不多,都是用来存数据的,不过starrocks有一个特性叫routine load,可以自动从kafka里取数据,而不需要写代码。
事情原委
在五月份,上任实习生误把生产环境中的kafka、starrocks删除了,老板请外面的人来修复,对于容器以及里面的表单进行了重构,之后问题解决。但在一个月前(八月份),生产环境的设备故障重启了一次,需要重新把服务启动,但是发现starrocks总是启动失败。
日志如下:
StarRocks [(Blazing Fast)]> _
2025-08-13 10:48:59,840 INFO Set uid to user 0 succeeded
2025-08-13 10:48:59,866 INFO RPC interface ‘supervisor’ initialized
2025-08-13 10:48:59,866 CRIT Server ‘unix_http_server’ running without any HTTP authentication checking
2025-08-13 10:48:59,867 INFO supervisord started with pid 7
2025-08-13 10:49:00,875 INFO spawned: ‘beservice’ with pid 50258
2025-08-13 10:49:00,880 INFO spawned: ‘broker’ with pid 50259
2025-08-13 10:49:00,883 INFO spawned: ‘director’ with pid 50260
2025-08-13 10:49:00,886 INFO spawned: ‘feproxy’ with pid 50261
2025-08-13 10:49:01,148 INFO spawned: ‘feservice’ with pid 50687
2025-08-13 10:49:00+00:00 INFO checking if need to perform auto registring Backend and Broker …
2025-08-13 10:49:06,155 INFO success: beservice entered RUNNING state, process has stayed up for > than 5 seconds (startsecs)
2025-08-13 10:49:06,155 INFO success: broker entered RUNNING state, process has stayed up for > than 5 seconds (startsecs)
2025-08-13 10:49:06,155 INFO success: director entered RUNNING state, process has stayed up for > than 5 seconds (startsecs)
2025-08-13 10:49:06,155 INFO success: feproxy entered RUNNING state, process has stayed up for > than 5 seconds (startsecs)
2025-08-13 10:49:06,155 INFO success: feservice entered RUNNING state, process has stayed up for > than 5 seconds (startsecs)
2025-08-13 10:49:41+00:00 INFO checking if FE service query port:9030 alive or not …
2025-08-13 10:49:41+00:00 WARN FE service query port:9030 is NOT alive yet!
2025-08-13 10:49:43+00:00 WARN FE service query port:9030 is NOT alive yet!
2025-08-13 10:49:45+00:00 WARN FE service query port:9030 is NOT alive yet!
2025-08-13 10:49:47+00:00 WARN FE service query port:9030 is NOT alive yet!
2025-08-13 10:49:49+00:00 WARN FE service query port:9030 is NOT alive yet!
2025-08-13 10:49:51+00:00 WARN FE service query port:9030 is NOT alive yet!
2025-08-13 10:49:53+00:00 WARN FE service query port:9030 is NOT alive yet!
2025-08-13 10:49:55+00:00 WARN FE service query port:9030 is NOT alive yet!
2025-08-13 10:49:57+00:00 INFO FE service query port:9030 is alive!
2025-08-13 10:49:57+00:00 INFO generate my.cnf file …
2025-08-13 10:50:33+00:00 INFO check if need to add BE into FE service …
2025-08-13 10:50:33+00:00 ERROR Password error, stop retrying!
If the root user password is changed, please re-run the container with ‘-e MYSQL_PWD=<root_password>’
2025-08-13 10:50:33+00:00 ERROR will force shutdown in 15 seconds …
2025-08-13 10:50:48,668 INFO waiting for beservice, broker, director, feproxy, feservice to die
Shut down
2025-08-13 10:50:48,704 INFO exited: director (exit status 1; not expected)
2025-08-13 10:50:49,706 INFO stopped: feservice (exit status 143)
2025-08-13 10:50:49,712 INFO stopped: feproxy (exit status 0)
2025-08-13 10:50:50,713 INFO stopped: broker (terminated by SIGTERM)
2025-08-13 10:50:50,716 INFO stopped: beservice (terminated by SIGKILL)
进行过的尝试
-
新建一个starrocks,查看java程序运行时能否自动建表。
结果:没有自动建表。
-
旧容器挂载数据卷到宿主机,启一个新容器用挂载的数据卷。
结果:同样无法启动,错误日志和旧容器一模一样。
-
看错误日志可能是启动密码的配置问题,启新容器挂载数据卷,并指定密码
结果:启动失败,同样的报错。
-
经过以上尝试,证明旧容器的数据卷有问题,尝试完全抛弃旧的容器,从零开始开一个新的starrocks,并使用前任员工给出的建表语句。
结果:可以启动,部份表有数据。 怀疑建表语句不是最新,或后来有过修改。
偶然的发现
前提一:
新建的数据库是空的,也没有密码,甲方那边说还是要新建一个密码,故通过exec进入容器内部,mysql -h的方式设置了starrocks的登录密码,同时通过DBeaver用密码可以连接。
前提二:
前一天晚上老板和同事研究下来,可能是starrocks的版本与linux系统版本不匹配导致的,生产环境的系统是Anolis OS release 8.9,是阿里云的系统,与CentOS8同源,但starrocks的镜像为starrocks/allin1-ubuntu。
但经查阅后,发现starrocks是通过docker部署的,已经容器化了,与宿主机环境没有影响,同时exec进入starrocks内部可以看见当前环境就是ubuntu。即便如此,老板还是坚持要换成CentOS的starrocks (心里吐槽了一万遍,byd不懂技术还瞎指挥),没办法,谁发钱谁就是老大,只得乖乖照做。。。
不过转念一想,既然原来的没报错,那我根本没必要重新搞一套,把原来的镜像重命名一下不就好了嘛😂说干就干,用创建了新的镜像,为了搞得真实一点,不让大小一样,我还往里面塞了1.5G的垃圾,乍一看跟真的一样。
之后发现docker ps查看到的容器也会显示images,已经启了的还没法改,只得忍痛抛弃昨天搞了一半的重新再启动一个。正在操作之时,发现昨天加了密码的restart了之后,居然没法用DBeaver连接了,遂进入日志,发现居然和旧容器的报错一模一样!
这绝对不是偶然,这时心里已经大致有概念了,立即复盘,猜测可能是后加密码的问题。相同命令再新建一个容器,配置密码,DBeaver连接,没有报错…还差了一步重启!restart之后,我想要的画面出现了——无限重启,进入日志,果然!相同的错误。
至此,bug能够复现,说明马上就能解决了。问deepseek怎么解决,按照它给出的方法一步一步地搞定了,测试连接完美。总结是之前外面请的人修复出现了问题,他当时配置下来是正常可以使用的,但当重启之后bug就出现了。
问题分析
启动流程冲突
StarRocks 的容器启动脚本 (entrypoint.sh
) 在初始化时会检测是否需要进行 BE/Broker 自动注册,此过程需要通过 root 账户连接 FE(Frontend)服务。
密码变更未同步
当手动修改密码后,容器重启时启动脚本仍尝试使用默认空密码连接 FE,导致认证失败(日志中的 ERROR Password error
)。
解决方式
-
复制容器内文件到宿主机
docker cp starrocks:/data/deploy/entrypoint.sh ./entrypoint_backup.sh
-
在宿主机编辑
nano entrypoint_backup.sh
-
在文件开头添加:
export MYSQL_PWD=“Your Password”
但是注意:Shell 脚本中的
#!/bin/bash
(shebang)必须是文件的第一行,所以这一行要放在#!/bin/bash
之后。 -
回传到容器
docker cp entrypoint_backup.sh starrocks:/data/deploy/entrypoint.sh
-
修改权限
docker exec starrocks chmod +x /data/deploy/entrypoint.sh
-
重启容器
docker restart starrocks
-
查看日志
docker logs -f --tail 100 starrocks
至此,问题完美解决。