目录
一、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; then
echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo 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
EOF
cat >> /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