一. 集群规划
部署文档
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
# 定义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
#!/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:
涉及到元数据(已存在的表、以及系统操作)和日志
volumes:
- './starrocks/fe-0/meta:/opt/starrocks/fe/meta:rw'
- './starrocks/fe-0/log:/opt/starrocks/fe/log:rw'
对于be:
涉及到数据存储和日志
volumes:
- './starrocks/be-1:/opt/starrocks/be/storage:rw'
- './starrocks/be-1:/opt/starrocks/be/log:rw'
对于网络
要实现starrocks容器之间的内部通讯:主要是通过主机名+端口。
networks:
starrocks-network:
driver: bridge
环境变量
- MYSQL_ROOT_PASSWORD=radar_360
用于be容器启动时be添加到fe时的脚本使用。
三. 集群测试
用户新建、赋权、库表初始化
-- 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时的操作。
# 添加自己到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即可,如下示例:
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'