StarRocks 容器镜像构建

news/2024/10/5 19:37:21/文章来源:https://www.cnblogs.com/freeweb/p/18288761

StarRocks 官方只提供了单节点运行的镜像,如果是构建可以分布式运行的 StarRocks 的容器镜像,那么基于基础镜像可以有两种选择,分别是:starrocks/artifacts-ubuntu 和 starrocks/allin1-ubuntu,这两个都是基于 Ubuntu 22.04 的基础镜像。其中前者是其中只包含 StarRocks 编译好的安装文件,并不包含任何可运行的环境,需要抠出来放到 Ubuntu 22.04 环境上才可以运行,而且需要安装 JDK 等基础镜像。而后者是编写了具体的启动脚本,可以单机运行所有的服务,作为快速开始使用的,所以里面很多必要的环境都存在,我们可以基于 allin1-ubuntu 做一些修改即可和标准运行方式一样。

artifacts-ubuntu Docker Hub 地址:https://hub.docker.com/r/starrocks/artifacts-ubuntu/tags

allin1-ubuntu Docker Hub 地址:https://hub.docker.com/r/starrocks/allin1-ubuntu/tags

如果基于 artifacts-ubuntu 构建需要我们将镜像里面的安装文件拷贝出来,然后自己编写 Dockerfile 实现,例如:

FROM ubuntu:22.04RUN sed -i "s@http://.*archive.ubuntu.com@http://mirrors.huaweicloud.com@g" /etc/apt/sources.list && sed -i "s@http://.*security.ubuntu.com@http://mirrors.huaweicloud.com@g" /etc/apt/sources.list
RUN apt update && apt install -y openjdk-11-jdk libbinutilsWORKDIR /opt/StarRocks-3.2.3ADD starrocks-artifacts/ .CMD ["/bin/bash", "-c", "echo \"StarRocks.\""]

而且这样 FE 和 BE 必须单独启动,也就是启动两个容器。另外这个镜像体积比较大,有 8 个多 GB,原因是 BE 包含了 debuginfo 符号表,这个是方便开发人员 GDB 调试的,正常运行不需要,所以我们最好删除 be/lib/starrocks_be.debuginfo 这个文件。

另外是使用 allin1-ubuntu 镜像,里面使用 Supervisor 来管理 FE 和 BE 等进程,这样比较合理,所以我们可以直接基于这个镜像做一些修改,首先运行镜像并进入容器:

docker run -it starrocks/allin1-ubuntu:3.2.3 /bin/bash

然后我们修改 Supervisor 配置文件 /etc/supervisor/supervisord.conf 在其中调大文件数限制:

[supervisord]
# 添加配置
minfds=1048576

然后查看脚本 entrypoint.sh 默认如下:

#!/bin/bash
# Copyright 2021-present StarRocks, Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.set -eget_fe_http_port()
{source $SR_HOME/fe/bin/common.shexport_env_from_conf $SR_HOME/fe/conf/fe.confecho ${http_port:-8030}
}update_feproxy_config()
{# process fe http_port from a sub shell to avoid env var escalationfehttpport=`get_fe_http_port`cat $SR_HOME/feproxy/feproxy.conf.template | sed -e "s|{{feproxyhome}}|$SR_HOME/feproxy|g" -e "s|{{fewebport}}|${fehttpport}|g" > $SR_HOME/feproxy/feproxy.conf
}setup_priority_networks()
{echo "priority_networks = 127.0.0.1/32" >> $SR_HOME/fe/conf/fe.confecho "priority_networks = 127.0.0.1/32" >> $SR_HOME/be/conf/be.conf
}# print banner
if [ -f $SR_HOME/../banner.txt ] ; thencat $SR_HOME/../banner.txt
fi# setup log directories
mkdir -p $SR_HOME/{supervisor,fe,be,apache_hdfs_broker,feproxy}/logupdate_feproxy_config
# use 127.0.0.1 for all the services, include fe/be/broker
setup_priority_networks# setup supervisor and start
SUPERVISORD_HOME=$SR_HOME/supervisor
# allow supervisorctl to find the correct supervisord.conf
ln -sfT $SUPERVISORD_HOME/supervisord.conf /etc/supervisord.confcd $SUPERVISORD_HOME
exec supervisord -n -c $SUPERVISORD_HOME/supervisord.conf

这其中执行了 setup_priority_networks 函数,会将配置追加到 fe.confbe.conf ,但是我们需要将这个配置文件拷贝出来再映射进去,所以不需要每次都执行,我们将这行函数注释掉。

然后我们把容器内的配置文件拷贝到容器外面:

docker cp dddddbc9232a:/data/deploy/starrocks/fe/conf/fe.conf .
docker cp dddddbc9232a:/data/deploy/starrocks/be/conf/be.conf .

最后我们再编辑 /data/deploy/starrocks/supervisor/supervisord.conf,默认内容如下:

[unix_http_server]
file=%(ENV_SR_HOME)s/supervisor/supervisor.sock[supervisord]
logfile=%(ENV_SR_HOME)s/supervisor/log/supervisord.log
logfile_maxbytes=50MB
logfile_backups=10
loglevel=info
pidfile=%(ENV_SR_HOME)s/supervisor/supervisord.pid
user=root
nodaemon=true[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface[supervisorctl]
serverurl=unix://%(ENV_SR_HOME)s/supervisor/supervisor.sock[program:feservice]
command=%(ENV_SR_HOME)s/fe/bin/start_fe.sh
numprocs=1
directory=%(ENV_SR_HOME)s/fe
autostart=true
autorestart=true
startsecs=5
startretries=3
stopwaitsecs=15
stopasgroup=true
killasgroup=true
redirect_stderr=true
stdout_logfile=%(ENV_SR_HOME)s/fe/log/fe.out
stdout_logfile_maxbytes=200MB
stdout_logfile_backups=20[program:beservice]
command=%(ENV_SR_HOME)s/be/bin/start_be.sh
numprocs=1
directory=%(ENV_SR_HOME)s/be
autostart=true
autorestart=true
startsecs=5
startretries=3
# do force kill before BE is good with graceful shutdown
stopsignal=KILL
stopwaitsecs=15
stopasgroup=true
killasgroup=true
redirect_stderr=true
stdout_logfile=%(ENV_SR_HOME)s/be/log/be.out
stdout_logfile_maxbytes=200MB
stdout_logfile_backups=20[program:broker]
command=%(ENV_SR_HOME)s/apache_hdfs_broker/bin/start_broker.sh
numprocs=1
directory=%(ENV_SR_HOME)s/apache_hdfs_broker
autostart=true
autorestart=true
startsecs=5
startretries=3
stopwaitsecs=15
stopasgroup=true
killasgroup=true
redirect_stderr=true
stdout_logfile=%(ENV_SR_HOME)s/apache_hdfs_broker/log/apache_hdfs_broker.out
stdout_logfile_maxbytes=200MB
stdout_logfile_backups=20[program:feproxy]
command=nginx -g "daemon off;" -c %(ENV_SR_HOME)s/feproxy/feproxy.conf
numprocs=1
directory=%(ENV_SR_HOME)s/feproxy
autostart=true
autorestart=true
startsecs=5
startretries=3
stopwaitsecs=15
redirect_stderr=true
stdout_logfile=%(ENV_SR_HOME)s/feproxy/log/feproxy.out
stdout_logfile_maxbytes=200MB
stdout_logfile_backups=20[program:director]
command=%(ENV_SR_HOME)s/director/run.sh
numprocs=1
directory=%(ENV_SR_HOME)s/director
autostart=true
autorestart=true
startsecs=5
startretries=3
stopwaitsecs=15
redirect_stderr=true
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0

其中 brokerfeproxy 以及 director 的配置我们用不到,如果开启 director 由于集群配置了密码等还会导致报错重启,所以这个没必要开启,因此将这几个块直接删除掉即可,删除后保存配置文件。

最后我们清理历史命令:

history -c
# 退出容器
exit

然后我们将容器保存为镜像:

docker commit -m "StarRocks 3.2.3 from allin1-ubuntu:3.2.3" dddddbc9232a starrocks:3.2.3

然后我们使用 Docker Compose 管理 StarRocks 进程,创建 docker-compose.yml 配置如下:

version: '3'
services:starrocks:image: starrocks:3.2.3container_name: starrocks-containercommand: ./entrypoint.shrestart: alwaysnetwork_mode: "host"environment:- TZ=Asia/Shanghaivolumes:- ./conf/fe.conf:/data/deploy/starrocks/fe/conf/fe.conf- ./conf/be.conf:/data/deploy/starrocks/be/conf/be.conf- /var/log/starrocks/fe:/data/deploy/starrocks/fe/log- /var/log/starrocks/be:/data/deploy/starrocks/be/log- /data/starrocks/meta:/data/deploy/starrocks/fe/meta- /data/starrocks/storage:/data/deploy/starrocks/be/storage

为了保证性能我们直接使用主机网络模式,这样我们只需要正常配置我们外部的配置文件即可,所有的端口都是直接在主机上监听,所以不要忘记修改 priority_networks 配置。另外我们分别映射了 StarRocks 的 FE 和 BE 日志目录,这个也无需修改内部的配置。最后就是数据目录,我们将外部自定义的数据目录映射到了内部默认位置,所以配置文件中的数据目录也无需修改,只需要修改我们映射的外部目录即可。但是我们要加上 command 指定容器启动的命令,因为我们后面进入容器的时候用了 /bin/bash 这样会将原有镜像默认的 CMD 覆盖掉,当我们提交镜像后默认就变成容器初次启动时的命令 /bin/bash 了,这个时候我们也可以用 entrypoint.sh 启动一次镜像再提交,或者是初次启动容器时用默认命令,我们再用 docker exec 进入容器这样也不会破坏原有镜像默认的入口。

另外注意如果是从之前手动部署的 StarRocks 集群上升级成容器化集群,那么需要设置容器的主机名,如果是 IP 地址访问那么需要将主机名设置为 IP:

version: '3'
services:starrocks:hostname: x.x.x.x

否则如果启用了主机名访问,那么需要设置为本机实际的主机名并且需要映射主机的 hosts 文件:

version: '3'
services:starrocks:hostname: host1

默认主机上的 /etc/hosts会自动映射进去可以无需其他配置。

经过上面的调整这样才可以正常启动,否则会报错:

Detect FE service hostname mismatch, FE service won't start.
This is probably caused by persisted fe/meta from outside container, but the container's hostname is not fixed. If running with docker engine, use '-h <hostname>' to assign a fixed hostname and restart.

因为原来的集群 meta 信息已经保存了原来的主机名,启动的时候 FE 会进行校验,不符合将会退出。如果是新部署集群则没有这个问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/739867.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ComfyUI进阶篇:ComfyUI核心节点(三)

ComfyUI核心节点(三)前言:学习ComfyUI是一场持久战。当你掌握了ComfyUI的安装和运行之后,会发现大量五花八门的节点。面对各种各样的工作流和复杂的节点种类,可能会让人感到不知所措。在这篇文章中,我们将用通俗易懂的语言对ComfyUI的核心节点进行系统梳理,并详细解释每…

版本控制系统

GIT 分布式版本控制系统 分布式版本控制,没有中央服务器的概念,每个人都有自己的版本库,因此每个人在工作时候,不需要联网,版本库本地即可管理。 既然每个人都是一个完整的版本库,同事之间如果需要协作开发,就需要找一个用于“交换文件”的中央服务器,这个服务器不存在…

2024-07-07 如何把ipad当作windows副屏使用 ==》 通过软件dute display和数据线连接

windows:进入dutedisplay官网https://www.duetdisplay.com/zh#download,下载并安装 ipad:在苹果应用商店搜索dutedisplay,选中并下载注意:你需要注册一个dutedisplay账号,才能登录该软件,它是付费的,so,我看到付费我就放弃了。 如果,你给钱了,那么,接下来我也不知道…

AtCoder Beginner Contest 361

AtCoder Beginner Contest 361 A - Insert给定一个长度为\(N\)的序列\(A\),现在希望将数字\(X\)插入到序列的第\(K\)个数字后面,变成一个新的序列\(B\)。输出序列\(B\)。 \(K,N,A_i,X\le 100\)模拟题。先读入\(N,K,X\)。接着在读入\(A\)的过程中一遍读入一遍输出,如果读到了…

2024暑假第一周总结

JAVA开发环境搭建和HelloWorld编译 1、JDK安装(java开发环境安装) 更改环境变量 Path环境变量 Path环境变量用于记住程序路径,方面在命令行窗口的任意目录启动程序 老版本的jdk需要进行配置环境变量,将jdk和bin包路径复制,新建path路径 Java_home环境变量 告诉操作系统JDK…

前端取唯一标识 UUID

// 使用工具 fingerprintjs 可以简单取到UUID1 <!DOCTYPE html>2 <html lang="en">3 4 <head>5 <meta charset="UTF-8">6 <meta http-equiv="X-UA-Compatible" content="IE=edge">7 <meta nam…

srpingboot 自定义 start

自动配置工程绑定配置文件,上逼格的 start 都支持自定义配置,我们也装像点~~ @ConfigurationProperties("cyrus.hello") public class CyrusHelloProperties {// 绑定配置文件 cyrus.hello.username 属性private String username;public String getUsername() {re…

Spring 配置文件加密

前文 在某些场景下,使用 Spring 作为开发组件时,不可避免地需要使用到配置文件,然而,对于配置文件中的某些敏感数据(如密码等信息字段),如果使用明文的方式,则可能在一定程度上导致信息泄露。为此,需要一种有效的方式来对这些字段进行加密处理,当前主流的一种加密方式…

博客搭建-图床篇

我们的博客难免少不了图片,图片管理是一个不小的难题。我们的博客难免少不了图片,图片管理是一个不小的难题。如果我们将图片全部放到我们自己的服务器上,那么带宽就基本上会被图片所占满了,这会导致网站加载很慢(特别是图片加载很慢)。 ‍ 什么是图床 为了解决图片的问题…

FPGA以太网学习-RGMII与GMII

以太网口都叫RJ45接口,从功能角度说,网口只是信号连接,本身没有通信能力。PHY(物理层),这边需要一个芯片,将并行的以太网数据到符合以太网物理层链路数据传输格式的电平信号转换。 上图PHY右边是经过编码后的串行数据信号,左侧是提供多种并行信号。网络变压器连接串行信…

网络通信系统的voronoi图显示与能耗分析matlab仿真

1.程序功能描述两层基站(BS)组成整个通讯网络,第 1 层为 Macro 基站记为 ,第 2 层为 Micro 基站记为 ,均服从泊松分布,相互独立,在坐标为 1010km 的面积内、按照泊松分布随机生成若干个点(随机抛洒两遍 nodes,两层叠加起来)。然后画成 voronoi 图: 也就是在相邻两个…

Django详细笔记

django 学习 特点快速开发 安全性高 可伸缩性强URL 组成部分 URL: 同意资源定位符 一个URL由以下几部分组成 scheme://host:port/path/?query-string=xxx#anchorscheme: 代表的是访问的协议,一般为http或https协议 host: 主机名,域名 port: 端口 http 默认:80端口 …