【StarRocks】starrocks 3.2.12 【share-nothing】 多Be集群容器化部署

文章目录

一. 集群规划

部署文档

https://docs.starrocks.io/zh/docs/2.5/deployment/plan_cluster/

分类 描述
FE节点 1. 主要负责元数据管理、客户端连接管理、查询计划和查询调度。 2. 三个节点实现高可用以及请求的流量转发, 对于请求的高可用和流量转发使用 nginx 实现。(对于单宿主机来说:这里的fe部署一个) 3. 建议为每个 FE 节点分配 8 个 CPU 内核和 16GB RAM,在大多数场景下,每个 FE 节点只需要 100GB 的 HDD 存储。
BE节点 1. 负责数据存储和 SQL 执行。 2. 对于 StarRocks 生产集群,建议至少部署三个 BE 节点,这些节点会自动形成一个 BE 高可用集群,避免单点故障影响数据可靠性和服务可用性。 3. 建议为每个 BE 节点分配 16 个 CPU 内核和 64GB RAM。 4. StarRocks 集群所有 BE 节点所需的 -- 总存储空间 = 原始数据大小 x 数据副本数/数据压缩算法压缩比 -- 原始数据大小 = 单行数据大小 x 总数据行数

说明

1.FE 节点:负责元数据管理、客户端连接、查询调度等任务,配置要求较低。

2.BE 节点:负责数据存储和 SQL 查询执行,配置要求较高,尤其是 CPU 和内存。

3.存储空间估算公式:根据数据大小、数据副本数和压缩比来计算 BE 节点的存储需求。

二.docker compose以及启动脚本

参考:

https://github.com/StarRocks/demo/blob/master/deploy/docker-compose/docker-compose-3BE.yml

yaml 复制代码
# 定义starrocks be共用配置
x-starrocks-be-common: &starrocks-be-common
  image: starrocks/be-ubuntu:3.2.12
  command:
    - /bin/bash
    - -c
    - |
      chmod +x /data/starrocks/be_entrypoint.sh
      /data/starrocks/be_entrypoint.sh starrocks-fe-0
  environment:
    - HOST_TYPE=FQDN
    - TZ=Asia/Shanghai
    - MYSQL_ROOT_PASSWORD=1111111
  depends_on:
    - starrocks-fe-0
  restart: always
  networks: # network config, can be configured to your preferred port and ip address, if not specified, it will use default network and assign a dynamic ip
    starrocks-network:

services:
  # starrocks:1 fe 3be
  starrocks-fe-0:
    image: starrocks/fe-ubuntu:3.2.12
    hostname: starrocks-fe-0
    container_name: starrocks-fe-0
    command:
      - /bin/bash
      - -c
      - |
        /opt/starrocks/fe_entrypoint.sh starrocks-fe-0
    environment:
      - HOST_TYPE=FQDN
      - TZ=Asia/Shanghai
      - MYSQL_ROOT_PASSWORD=radar_360
    ports:
      - "1030:8030"  # Frontend service port (HTTP)
      - "2020:9020"  # Backend service port (HTTP)
      - "3030:9030" # Frontend service port (MySQL)
    volumes:
      - './starrocks/fe-0/meta:/opt/starrocks/fe/meta:rw'
      - './starrocks/fe-0/log:/opt/starrocks/fe/log:rw'
    restart: always
    networks: # network config, can be configured to your preferred port and ip address, if not specified, it will use default network and assign a dynamic ip
      starrocks-network:
  starrocks-be-0:
    <<: *starrocks-be-common
    hostname: starrocks-be-0
    container_name: starrocks-be-0
    volumes:
      - './starrocks/be-0/storage:/opt/starrocks/be/storage:rw'
      - './starrocks/be-0/log:/opt/starrocks/be/log:rw'
      - './sr/bin:/data/starrocks:rwx'
  starrocks-be-1:
    <<: *starrocks-be-common
    hostname: starrocks-be-1
    container_name: starrocks-be-1
    volumes:
      - './starrocks/be-1/storage:/opt/starrocks/be/storage:rw'
      - './starrocks/be-1/log:/opt/starrocks/be/log:rw'
      - './sr/bin:/data/starrocks:rwx'
  starrocks-be-2:
    <<: *starrocks-be-common
    hostname: starrocks-be-2
    container_name: starrocks-be-2
    volumes:
      - './starrocks/be-2/storage:/opt/starrocks/be/storage:rw'
      - './starrocks/be-2/log:/opt/starrocks/be/log:rw'
      - './sr/bin:/data/starrocks:rwx'
networks:
  starrocks-network:
    driver: bridge
shell 复制代码
#!/bin/bash

HOST_TYPE=${HOST_TYPE:-"IP"}
FE_QUERY_PORT=${FE_QUERY_PORT:-9030}
PROBE_TIMEOUT=60
PROBE_INTERVAL=2
HEARTBEAT_PORT=9050
MY_SELF=
MY_IP=`hostname -i`
MY_HOSTNAME=`hostname -f`
STARROCKS_ROOT=${STARROCKS_ROOT:-"/opt/starrocks"}
STARROCKS_HOME=${STARROCKS_ROOT}/be
BE_CONFIG=$STARROCKS_HOME/conf/be.conf
MYSQL_ROOT_PW=${MYSQL_ROOT_PASSWORD:-121111}


log_stderr()
{
    echo "[`date`] $@" >&2
}

update_conf_from_configmap()
{
    if [[ "x$CONFIGMAP_MOUNT_PATH" == "x" ]] ; then
        log_stderr 'Empty $CONFIGMAP_MOUNT_PATH env var, skip it!'
        return 0
    fi
    if ! test -d $CONFIGMAP_MOUNT_PATH ; then
        log_stderr "$CONFIGMAP_MOUNT_PATH not exist or not a directory, ignore ..."
        return 0
    fi
    local tgtconfdir=$STARROCKS_HOME/conf
    for conffile in `ls $CONFIGMAP_MOUNT_PATH`
    do
        log_stderr "Process conf file $conffile ..."
        local tgt=$tgtconfdir/$conffile
        if test -e $tgt ; then
            # make a backup
            mv -f $tgt ${tgt}.bak
        fi
        ln -sfT $CONFIGMAP_MOUNT_PATH/$conffile $tgt
    done
}

show_backends() {
     #先尝试无密码连接
    output=$(timeout 15 mysql --connect-timeout 2 -h $svc -P $FE_QUERY_PORT -u root --skip-column-names --batch -e 'SHOW BACKENDS;')
    if [ $? -ne 0 ]; then
        log_stderr '使用密码进行尝试连接,检查be的状态'
        # 如果无密码连接失败,则使用密码进行连接
        output=$(timeout 15 mysql --connect-timeout 2 -h $svc -P $FE_QUERY_PORT -u root -p$MYSQL_ROOT_PW --skip-column-names --batch -e 'SHOW BACKENDS;')
    fi
    echo "$output"
}

parse_confval_from_cn_conf()
{
    # a naive script to grep given confkey from cn conf file
    # assume conf format: ^\s*<key>\s*=\s*<value>\s*$
    local confkey=$1
    local confvalue=`grep "\<$confkey\>" $BE_CONFIG | grep -v '^\s*#' | sed 's|^\s*'$confkey'\s*=\s*\(.*\)\s*$|\1|g'`
    echo "$confvalue"
}

collect_env_info()
{
    # heartbeat_port from conf file
    local heartbeat_port=`parse_confval_from_cn_conf "heartbeat_service_port"`
    if [[ "x$heartbeat_port" != "x" ]] ; then
        HEARTBEAT_PORT=$heartbeat_port
    fi

    if [[ "x$HOST_TYPE" == "xIP" ]] ; then
        MY_SELF=$MY_IP
    else
        MY_SELF=$MY_HOSTNAME
    fi

}

attempt_add_self() {
    # 第一次尝试执行命令
    output=$(timeout 15 mysql --connect-timeout 2 -h $svc -P $FE_QUERY_PORT -u root  --skip-column-names --batch -e "ALTER SYSTEM ADD BACKEND \"$MY_SELF:$HEARTBEAT_PORT\";")
    if [ $? -ne 0 ]; then
        # 如果第一次失败,添加密码
        log_stderr '使用密码进行尝试连接,来添加be到fe'
        output=$(timeout 15 mysql --connect-timeout 2 -h $svc -P $FE_QUERY_PORT -u root -p$MYSQL_ROOT_PW --skip-column-names --batch -e "ALTER SYSTEM ADD BACKEND \"$MY_SELF:$HEARTBEAT_PORT\";")
    fi
    echo "$output"
}

add_self()
{
    local svc=$1
    start=`date +%s`
    local timeout=$PROBE_TIMEOUT

    while true
    do
        log_stderr "Add myself ($MY_SELF:$HEARTBEAT_PORT) into FE ..."
        # 这里当root添加密码时,需要通过密码进行设置。
        #timeout 15 mysql --connect-timeout 2 -h $svc -P $FE_QUERY_PORT -u root -pradar_360 --skip-column-names --batch -e "ALTER SYSTEM ADD BACKEND \"$MY_SELF:$HEARTBEAT_PORT\";"
        attempt_add_self
        # 查看be是否加入成功
        memlist=`show_backends $svc`
        if echo "$memlist" | grep -q -w "$MY_SELF" &>/dev/null ; then
            break;
        fi

        let "expire=start+timeout"
        now=`date +%s`
        if [[ $expire -le $now ]] ; then
            log_stderr "Time out, abort!"
            exit 1
        fi

        sleep $PROBE_INTERVAL

    done
}

svc_name=$1
if [[ "x$svc_name" == "x" ]] ; then
    echo "Need a required parameter!"
    echo "  Example: $0 <fe_service_name>"
    exit 1
fi

update_conf_from_configmap
collect_env_info
add_self $svc_name || exit $?
log_stderr "Add myself ($MY_SELF:$HEARTBEAT_PORT) into FE success!!!"
log_stderr "run start_be.sh"

addition_args=
if [[ "x$LOG_CONSOLE" == "x1" ]] ; then
    # env var `LOG_CONSOLE=1` can be added to enable logging to console
    addition_args="--logconsole"
fi
$STARROCKS_HOME/bin/start_be.sh $addition_args
ret=$?
if [[ $ret -ne 0 && "x$LOG_CONSOLE" != "x1" ]] ; then
    nol=50
    log_stderr "Last $nol lines of be.INFO ..."
    tail -n $nol $STARROCKS_HOME/log/be.INFO
    log_stderr "Last $nol lines of be.out ..."
    tail -n $nol $STARROCKS_HOME/log/be.out
fi
exit $ret

卷映射

对于fe:

涉及到元数据(已存在的表、以及系统操作)和日志

yaml 复制代码
volumes:  
  - './starrocks/fe-0/meta:/opt/starrocks/fe/meta:rw'  
  - './starrocks/fe-0/log:/opt/starrocks/fe/log:rw'

对于be:

涉及到数据存储和日志

yaml 复制代码
volumes:  
  - './starrocks/be-1:/opt/starrocks/be/storage:rw'  
  - './starrocks/be-1:/opt/starrocks/be/log:rw'

对于网络

要实现starrocks容器之间的内部通讯:主要是通过主机名+端口。

yaml 复制代码
networks:  
  starrocks-network:  
    driver: bridge

环境变量

  • MYSQL_ROOT_PASSWORD=radar_360
    用于be容器启动时be添加到fe时的脚本使用。

三. 集群测试

用户新建、赋权、库表初始化

sql 复制代码
-- 1. root 创建密码  
-- 只能root自己创建密码 Can not set password for root user, except root itself.
SET PASSWORD FOR 'root' = PASSWORD('123456');  
  
show users;  


-- 2. 创建用户radar与密码  
CREATE USER 'radar' IDENTIFIED by 'radar_360';  
-- 新增密码和修改密码都可用此密码  
SET PASSWORD FOR 'root' = PASSWORD('1234567');  
  
-- 3. 授予相关权限  
SHOW GRANTS;  
show roles;  
grant root to user radar;  
-- 激活角色  
-- 每一个链接会话中都需要执行  
-- #  Inactivated role(s): [user_admin, root].  
SET ROLE root;  
-- 创建库表  
create database middle;  
  
-- 注意:  
-- 授权所有库表的权限,对于创建库没有权限  
GRANT ALL PRIVILEGES ON *.* TO 'radar';

断电重启

改造官方的docker启动脚本:主要涉及到给root设置密码之后,be添加到fe时的操作。

shell 复制代码
# 添加自己到fe
attempt_add_self() {  
    # 第一次尝试执行命令  
    output=$(timeout 15 mysql --connect-timeout 2 -h $svc -P $FE_QUERY_PORT -u root  --skip-column-names --batch -e "ALTER SYSTEM ADD BACKEND \"$MY_SELF:$HEARTBEAT_PORT\";")  
    if [ $? -ne 0 ]; then  
        # 如果第一次失败,添加密码  
        log_stderr '使用密码进行尝试连接,来添加be到fe'  
        output=$(timeout 15 mysql --connect-timeout 2 -h $svc -P $FE_QUERY_PORT -u root -p$MYSQL_ROOT_PW --skip-column-names --batch -e "ALTER SYSTEM ADD BACKEND \"$MY_SELF:$HEARTBEAT_PORT\";")  
    fi  
    echo "$output"  
}

# 查看存在的be
show_backends() {
     #先尝试无密码连接
    output=$(timeout 15 mysql --connect-timeout 2 -h $svc -P $FE_QUERY_PORT -u root --skip-column-names --batch -e 'SHOW BACKENDS;')
    if [ $? -ne 0 ]; then
        log_stderr '使用密码进行尝试连接,检查be的状态'
        # 如果无密码连接失败,则使用密码进行连接
        output=$(timeout 15 mysql --connect-timeout 2 -h $svc -P $FE_QUERY_PORT -u root -p$MYSQL_ROOT_PW --skip-column-names --batch -e 'SHOW BACKENDS;')
    fi
    echo "$output"
}

扩容 BE 集群

be的启动脚本天然支持容器启动时就会将自己加入到Fe中,所以新增时,正常些docker compose即可,如下示例:

yaml 复制代码
  starrocks-be-3:
    <<: *starrocks-be-common
    hostname: starrocks-be-3
    container_name: starrocks-be-3
    volumes:
      - './starrocks/be-3/storage:/opt/starrocks/be/storage:rw'
      - './starrocks/be-3/log:/opt/starrocks/be/log:rw'
      - './sr/bin:/data/starrocks:rwx'
相关推荐
ZNineSun15 小时前
新一代MPP数据库:StarRocks
starrocks·olap·数据湖·mpp·oltp
StarRocks_labs8 天前
腾讯大数据基于 StarRocks 的向量检索探索
starrocks·人工智能·搜索引擎·开源
漫步者TZ18 天前
Starrocks 对比 Clickhouse
数据库·starrocks·clickhouse
小Tomkk18 天前
Docker 部署 Starrocks 教程
运维·starrocks·docker·容器
书忆江南1 个月前
StarRocks BE源码编译、CLion高亮跳转方法
starrocks·源码·编译·be
鸿乃江边鸟1 个月前
StarRocks 怎么让特定的SQL路由到FE master节点的
大数据·starrocks·sql
大鳥1 个月前
深入了解 StarRocks 表类型:解锁高效数据分析的密码
数据库·starrocks·sql
京河小蚁2 个月前
StarRocks 生产部署一套集群,存储空间如何规划?
starrocks
一条路上的咸鱼2 个月前
StarRocks元数据无法合并
starrocks