目录
一、StarRocks 简介
二、StarRocks 架构
2.1 存算一体
2.2 存算分离
三、前期准备
3.1前提条件
3.2 集群规划
3.3 配置环境
3.4 准备部署文件
四、手动部署
4.1 部署FE节点
4.2 部署BE节点
4.3 部署CN节点(可选)
4.4 FE高可用
4.5 故障排除
五、集群管理
5.1 启动集群
5.2 停止集群
一、StarRocks 简介
StarRocks 是一款高性能分析型数据仓库,使用向量化、MPP 架构、CBO、智能物化视图、可实时更新的列式存储引擎等技术实现多维、实时、高并发的数据分析。StarRocks 既支持从各类实时和离线的数据源高效导入数据,也支持直接分析数据湖上各种格式的数据。StarRocks 兼容 MySQL 协议,支持标准 SQL,用户可以轻松地通过 MySQL 客户端连接到 StarRocks 实时查询分析数据。同时 StarRocks 具备水平扩展,高可用、高可靠、易运维等特性。
二、StarRocks 架构
StarRocks 架构简洁明了,整个系统仅由两种组件组成:前端和后端。前端节点称为 FE。后端节点有两种类型,BE 和 CN (计算节点)。当使用本地存储数据时,您需要部署 BE;当数据存储在对象存储或 HDFS 时,需要部署 CN。StarRocks 不依赖任何外部组件,简化了部署和维护。节点可以水平扩展而不影响服务正常运行。此外,StarRocks 具有元数据和服务数据副本机制,提高了数据可靠性,有效防止单点故障 (SPOF)。
2.1 存算一体
作为典型的大规模并行处理 (MPP) 数据库,StarRocks 支持存算一体架构。在存算一体架构中,FE 负责元数据管理和构建执行计划;BE 执行查询计划并存储数据。将数据存储在 BE 中使得数据可以在当前节点中计算,避免了数据传输和复制,从而提供极快的查询和分析性能。该架构支持多副本数据存储,增强了集群处理高并发查询的能力并确保数据可靠性,非常适合追求最佳查询性能的场景。
- FE
FE 负责元数据管理、客户端连接管理、查询规划和查询调度。每个 FE 在其内存中存储和维护一份完整的元数据副本,保证 FE 之间服务的一致性。FE 分为 Leader FE 节点、Follower 节点和 Observer 节点。Follower 节点可以根据类似 Paxos 的 BDB JE(Berkeley DB Java Edition)协议选举主节点。
- BE
BE 负责数据存储和 SQL 执行。
1)数据存储:BE 具有等效的数据存储能力。FE 根据预定义规则将数据分发到各个 BE。BE 转换导入的数据,将数据写入所需格式,并为数据生成索引。
2)SQL 执行:FE 根据查询的语义将每个 SQL 查询解析为逻辑执行计划,然后将逻辑计划转换为可以在 BE 上执行的物理执行计划。BE 在本地存储数据以及执行查询,避免了数据传输和复制,极大地提高了查询性能。
2.2 存算分离
在存算分离架构中,BE 被“计算节点 (CN)”取代,后者仅负责数据计算任务和缓存热数据。数据存储在低成本且可靠的远端存储系统中,如 Amazon S3、GCP、Azure Blob Storage、MinIO 等。当缓存命中时,查询性能可与存算一体架构相媲美。CN 节点可以根据需要在几秒钟内添加或删除。这种架构降低了存储成本,确保更好的资源隔离,并具有高度的弹性和可扩展性。
存算分离架构与存算一体架构一样简单。它仅由两种类型的节点组成:FE 和 CN。唯一的区别是用户必须配置后端对象存储。
- 节点
在存算分离架构中,FE 提供的功能与存算一体架构中的相同。
BE 被 CN (计算节点) 取代,存储功能被转移到对象存储或 HDFS。CN 是无状态的计算节点,可以执行除存储数据外所有 BE 的功能。
- 存储
StarRocks 存算分离集群支持两种存储解决方案:对象存储 (例如,AWS S3、Google GCS、Azure Blob Storage 或 MinIO) 和 HDFS。
在存算分离集群中,数据文件格式与存算一体集群 (存储和计算耦合) 保持一致。数据存储为 Segment 文件,云原生表(专门用于存算分离集群的表)也可以利用存算一体架构中支持的各种索引技术。
- 缓存
StarRocks 存算分离集群将数据存储与计算分离,使两方都能够独立扩展,从而降低成本并提高系统弹性扩展能力。然而,这种架构会影响查询性能。 为减少架构对于性能的影响,StarRocks 建立了包含内存、本地磁盘和远端存储的多层数据访问系统,以便更好地满足各种业务需求。
对于针对热数据的查询,StarRocks 会先扫描缓存,然后扫描本地磁盘。而针对冷数据的查询,需要先将数据从对象存储中加载到本地缓存中,加速后续查询。通过将热数据缓存在计算单元内,StarRocks 实现了真正的高计算性能和高性价比存储。此外,还通过数据预取策略优化了对冷数据的访问,有效消除了查询的性能限制。
可以在建表时启用缓存。启用缓存后,数据将同时写入本地磁盘和后端对象存储。在查询过程中,CN 节点首先从本地磁盘读取数据。如果未找到数据,将从后端对象存储中检索,并将数据缓存到本地磁盘中。
三、前期准备
3.1前提条件
- CPU
StarRocks 依靠 AVX2 指令集充分发挥其矢量化能力。因此,在生产环境中,强烈建议您将 StarRocks 部署于 x86 架构 CPU 的服务器上。
#在终端中运行以下命令来检查 CPU 是否支持 AVX2 指令集
cat /proc/cpuinfo | grep avx2
- 内存
StarRocks 对内存没有特定要求。关于推荐的内存大小,请参考集群规划章节的CPU 和内存部分。
- 存储
StarRocks 支持 HDD 和 SSD 作为存储介质。 在实时数据分析场景、以及涉及大量数据扫描或随机磁盘访问的场景下,强烈建议您选择 SSD 作为存储介质。
- 网络
建议使用万兆网络连接(10 Gigabit Ethernet,简称 10 GE)确保 StarRocks 集群内数据能够跨节点高效传输。
- 操作系统
StarRocks 支持在 CentOS Linux 7.9 和 Ubuntu Linux 22.04 上部署。
- JDK
必须在服务器上安装 JDK 8 以运行 StarRocks。v2.5 及以上版本建议安装 JDK 11。
3.2 集群规划
节点 | 实例数 | CPU | 内存 | 存储 |
---|---|---|---|---|
FE | 1~3 | 8核+ | 16G+ | 100 GB+ |
BE | 3+ | 16核+ | 64G+ | 预估 BE 初始存储空间 |
1. FE规划
- 测试环境可以部署1个节点;生产环境建议至少部署3个节点,防止单节点故障。
- FE 节点主要负责元数据管理、客户端连接管理、查询计划和查询调度,不会消耗大量的 CPU 和内存资源。生产环境建议为每个 FE 节点分配 8 个 CPU 内核和 16 GB RAM。
- 由于 FE 节点仅在其存储中维护 StarRocks 的元数据,因此在大多数场景下,每个 FE 节点只需要 100 GB 的存储。
2. BE规划
- 测试环境可以部署1个节点,生产环境建议您至少部署三个 BE 节点,这些节点会自动形成一个 BE 高可用集群,避免由于发生单点故障而影响数据可靠性和服务可用性。
- BE 节点负责数据存储和 SQL 执行,需要使用大量 CPU 和内存资源。生产环境建议为每个 BE 节点分配 16 个 CPU 内核和 64 GB RAM。
- StarRocks 默认维护三个副本,提供 3:1 到 5:1 的数据压缩比。 通过计算得到总存储空间后,可以简单地将之除以集群中的 BE 节点数,估算出每个 BE 节点所需的平均初始存储空间。
- 如果 BE 存储空间随着原始数据的增长而耗尽,可以通过在 BE 节点上添加额外的存储卷或在 StarRocks 集群中添加新的 BE 节点以补充存储空间。
3.3 配置环境
- 端口规划
StarRocks 为不同的服务使用特定的端口,请检查这些端口是否被占用。
#检查端口是否被占用
netstat -tunlp | grep 8030
节点 | 端口名称 | 默认端口 | 说明 |
---|---|---|---|
FE | http_port | 8030 | FE HTTP Server 端口 |
rpc_port | 9020 | FE Thrift Server 端口 | |
query_port | 9030 | FE MySQL Server 端口 | |
edit_log_port | 9010 | FE 内部通讯端口 | |
cloud_native_meta_port | 6090 | FE 云原生元数据服务 RPC 监听端口 | |
BE | be_port | 9060 | BE Thrift Server 端口 |
be_http_portbe_http_port | 8040 | BE HTTP Server 端口 | |
heartbeat_service_port | 9050 | BE 心跳服务端口 | |
brpc_port | 8060 | BE bRPC 端口 | |
starlet_port | 9070 | BE 和 CN 的额外 Agent 服务端口 | |
CN | be_port | 9060 | CN Thrift Server 端口 |
be_http_port | 8040 | CN HTTP Server 端口 | |
heartbeat_service_port | 9050 | CN 心跳服务端口 | |
brpc_port | 8060 | CN bRPC 端口 | |
starlet_port | 9070 | BE 和 CN 的额外 Agent 服务端口 |
- 主机名
如果StarRocks 集群 启用 FQDN 访问,则必须为每个实例设置一个主机名。 在每个实例的 /etc/hosts 文件中,必须指定集群中其他实例的 IP 地址和相应的主机名。
- JDK 设置
StarRocks 依靠环境变量 JAVA_HOME 定位实例上的 Java 依赖项。
- 文件系统配置
建议使用 ext4 或 xfs 日志文件系。
- 关闭透明大页(Transparent Huge Pages)
Transparent Huge Pages 默认启用。因其会干扰内存分配,进而导致性能下降,建议您禁用此功能。
# 临时变更。
echo madvise | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
echo madvise | sudo tee /sys/kernel/mm/transparent_hugepage/defrag
# 永久变更。
cat >> /etc/rc.d/rc.local << EOF
if test -f /sys/kernel/mm/transparent_hugepage/enabled; thenecho madvise > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; thenecho madvise > /sys/kernel/mm/transparent_hugepage/defrag
fi
EOF
chmod +x /etc/rc.d/rc.local
- 关闭 Swap Space
从 /etc/fstab 文件中注释掉或者直接删除 Swap Space 信息。
# /<path_to_swap_space> swap swap defaults 0 0
- 禁用 SELinux
# 临时变更。
setenforce 0
# 永久变更。
sed -i 's/SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
sed -i 's/SELINUXTYPE/#SELINUXTYPE/' /etc/selinux/config
- 关闭防火墙
如果启用了防火墙,请为 FE、BE 和 Broker 开启内部端口,内网环境可以直接关闭防火墙。
#停掉防火墙
systemctl stop firewalld
#永久关闭防火墙
systemctl disable firewalld
#查看防火墙状态,显示Active: inactive (dead)证明操作成功
systemctl status firewalld
- ulimit 设置
如果最大文件描述符和最大用户进程的值设置得过小,StarRocks 运行可能会出现问题。建议将系统资源上限调大。
cat >> /etc/security/limits.conf << EOF
* soft nproc 65535
* hard nproc 65535
* soft nofile 655350
* hard nofile 655350
* soft stack unlimited
* hard stack unlimited
* hard memlock unlimited
* soft memlock unlimited
EOFcat >> /etc/security/limits.d/20-nproc.conf << EOF
* soft nproc 65535
root soft nproc 65535
EOF
-
修改系统内核参数
#如果系统当前因后台进程无法处理的新连接而溢出,则允许系统重置新连接
net.ipv4.tcp_abort_on_overflow=1#设置监听 Socket 队列的最大连接请求数为 1024
net.core.somaxconn=1024#允许操作系统将额外的内存资源分配给进程,建议启用。
vm.overcommit_memory=1#Swappiness 会对性能造成影响,因此建议禁用 Swappiness。
vm.swappiness=0#进程可以拥有的 VMA(虚拟内存区域)的数量。将该值调整为 262144
vm.max_map_count = 262144#最大线程数
kernel.threads-max = 120000#进程标识符(PID)最大值
kernel.pid_max = 200000
3.4 准备部署文件
目前 镜舟官网提供的 StarRocks 软件包仅支持在 x86 架构的 CPU 上部署。如需在 ARM 架构 CPU 上部署 StarRocks,您需要通过StarRocks Docker 镜像获取部署文件。
四、手动部署
4.1 部署FE节点
1.修改 FE 配置文件
# vi fe/conf/fe.conf
# 将 <meta_dir> 替换为已创建的元数据目录。
meta_dir = <meta_dir>#为 FE 节点分配一个专有的 IP 地址(CIDR格式)
priority_networks = x.x.x.x/x
# 如须,可修改jdk版本;将 <path_to_JDK> 替换为所选 JDK 的安装路径。
JAVA_HOME = <path_to_JDK>
2.启动FE节点
./fe/bin/start_fe.sh --daemon
3.登录FE节点
通过 MySQL 客户端连接到 StarRocks。您需要使用初始用户 root
登录,密码默认为空。
# 将 <fe_address> 替换为 Leader FE 节点的 IP 地址(priority_networks),
# 并将 <query_port>(默认:9030)替换为您在 fe.conf 中指定的 query_port。
mysql -h <fe_address> -P<query_port> -uroot
执行以下 SQL 查看 Leader FE 节点状态:
SHOW PROC '/frontends'\G
4.2 部署BE节点
1.修改BE配置文件
vi be/conf/be.conf
# 将 <storage_root_path> 替换为已创建的数据存储路径。
storage_root_path = <storage_root_path>为 BE 节点分配一个专有的 IP 地址(CIDR格式)
priority_networks = x.x.x.x/x
# 如须,可修改jdk版本;将 <path_to_JDK> 替换为所选 JDK 的安装路径。
JAVA_HOME = <path_to_JDK>
2.启动BE节点
./be/bin/start_be.sh --daemon
3.将BE节点加入集群
登录FE节点后,通过以下命令将BE加入集群:
-- 将 <be_address> 替换为 BE 节点的 IP 地址(priority_networks)
-- 并将 <heartbeat_service_port>(默认:9050)替换为在 be.conf 中指定的 heartbeat_service_port。
ALTER SYSTEM ADD BACKEND "<be_address>:<heartbeat_service_port>";
执行以下 SQL 查看 BE 节点状态:
SHOW PROC '/backends'\G
4.在其他 BE 实例上重复以上步骤,即可启动新的 BE 节点
在一个 StarRocks 集群中部署并添加至少 3 个 BE 节点,形成一个 BE 高可用集群。 如果只想部署一个 BE 节点,必须在 FE 配置文件 fe/conf/fe.conf 中设置 default_replication_num
为 1
。
4.3 部署CN节点(可选)
Compute Node(CN)是一种无状态的计算服务,本身不存储数据。可以通过添加 CN 节点为查询提供额外的计算资源。自 v2.4 版本起支持使用 BE 部署文件部署 CN 节点。
1.修改CN配置文件
#为 CN 节点分配一个专有的 IP 地址(CIDR格式)
priority_networks = x.x.x.x/x
# 如须,可修改jdk版本;将 <path_to_JDK> 替换为所选 JDK 的安装路径。
JAVA_HOME = <path_to_JDK>
2.启动CN节点
./be/bin/start_cn.sh --daemon
3.将CN节点加入集群
登录FE节点后,通过以下命令将CN加入集群:
-- 将 <cn_address> 替换为 CN 节点的 IP 地址(priority_networks)或 FQDN,
-- 并将 <heartbeat_service_port>(默认:9050)替换为您在 cn.conf 中指定的 heartbeat_service_port。
ALTER SYSTEM ADD COMPUTE NODE "<cn_address>:<heartbeat_service_port>";
执行以下 SQL 查看 CN 节点状态
SHOW PROC '/compute_nodes'\G
4.在其他实例上重复以上步骤,即可启动新的 CN 节点
4.4 FE高可用
高可用的 FE 集群需要在 StarRocks 集群中部署至少三个 Follower FE 节点。如需部署高可用的 FE 集群,需要额外再启动两个新的 FE 节点。
1.参考4.1部署FE节点,部署两个新的FE节点
2.将新部署的FE节点加入集群
-- 将 <new_fe_address> 替换为需要添加的新 FE 节点的 IP 地址(priority_networks)
-- 并将 <edit_log_port>(默认:9010)替换为在新 FE 节点的 fe.conf 中指定的 edit_log_port。
ALTER SYSTEM ADD FOLLOWER "<new_fe_address>:<edit_log_port>","<new_fe_address>:<edit_log_port>";
4.5 故障排除
如果启动 FE、BE 或 CN 节点失败,尝试以下步骤来发现问题:
- 如果 FE 节点没有正常启动,您可以通过查看 fe/log/fe.warn.log 中的日志来确定问题所在。
cat fe/log/fe.warn.log
确定并解决问题后,首先需要终止当前 FE 进程,删除现有的 meta 路径下的所有文件,然后以正确的配置重启该 FE 节点。
- 如果 BE 节点没有正常启动,您可以通过查看 be/log/be.WARNING 中的日志来确定问题所在。
cat be/log/be.WARNING
确定并解决问题后,首先需要终止当前 BE 进程,删除现有的 storage 路径下的所有文件,然后以正确的配置重启该 BE 节点。
- 如果 CN 节点没有正常启动,您可以通过查看 be/log/cn.WARNING 中的日志来确定问题所在。
cat be/log/cn.WARNING
确定并解决问题后,首先需要终止当前 CN 进程,然后以正确的配置重启该 CN 节点。
五、集群管理
5.1 启动集群
- 启动FE节点
sh fe/bin/start_fe.sh --daemon
- 启动BE节点
sh be/bin/start_be.sh --daemon
- 启动CN节点
sh be/bin/start_cn.sh --daemon
5.2 停止集群
- 停止FE节点
./fe/bin/stop_fe.sh --daemon
- 停止BE节点
./be/bin/stop_be.sh --daemon
- 停止CN节点
./be/bin/stop_cn.sh --daemon