StarRocks 标准集群安装

1.前提条件

  1. 安装前确保集群已经完成 基础环境配置
  2. 本次安装要求 JDK 11 版本,如果单独安装需要为 StarRocks 指定 JAVA_HOME
  3. 本次安装的 StarRocks 软件版本为:3.2.3,支持 x86 和 ARM 芯片上的主流 Linux 系统。
  4. 如果是 x86 平台,请确认是否支持 AVX2 指令集:cat /proc/cpuinfo | grep avx2
  5. 为了保证随机访问的性能,请务必选择 SSD 作为 StarRocks 的数据存储介质,其中主键持久化索引只支持 SSD。
  6. 为了保证集群间的数据可以高效传输,请至少使用万兆网卡(10 Gigabit Ethernet)。
  7. 当前部署方式为存算一体部署方式,角色主要分为 FE 和 BE 两种。其中 FE 节点负责元数据管理、客户端连接处理、查询计划和查询调度,对于生产环境建议至少部署 3 个 Follower 类型的 FE 节点以防止单点故障,Observer 类型的 FE 节点仅用于处理查询请求,不会参与 Leader 的选举。BE 节点负责数据的存储和 SQL 计算执行,建议生产环境至少部署 3 个节点,这些节点会自动形成高可用集群,从而避免单点故障导致数据和服务不可用。BE 节点支持横向扩展,节点越多支持的处理的数据量也越大。当前部署方式一共有 3 个节点,其中 FE 和 BE 一对一混合部署,这是生产环境所要求的最低部署方式。
  8. 每个节点建议至少配置 16 core CPU 和 64GB 内存,这是最低限制,实际的配置还要根据处理的数据量具体评估。

推荐优先选择当前标准集群部署方式,和容器化相比性能更加出色。同时建议尽量部署在 x86 芯片上,因为 x86 芯片可以依靠 AVX2 指令集充分发挥矢量化能力,但是 ARM 芯片不支持,因此性能会有很大的损失,所以生产环境不推荐使用。

2.环境和参数准备

  1. 当前集群共有 3 个节点,其列表配置如下:

    olap1 10.0.1.21
    olap2 10.0.1.22
    olap3 10.0.1.23
    
  2. StarRocks 的数据目录设置:/data/starrocks,其中元数据目录为:/data/starrocks/meta,数据存储目录为:/data/starrocks/storage

  3. 本次部署所使用的端口号如下,请确保没有被占用:

    # FE 端口
    # 8030 FE HTTP 服务端口
    netstat -tunlp | grep 8030
    # 9020 FE Thrift 服务端口
    netstat -tunlp | grep 9020
    # 9030 FE MySQL 服务端口
    netstat -tunlp | grep 9030
    # 9010 FE 内部通信端口
    netstat -tunlp | grep 9010
    # BE 端口
    # 9060 BE Thrift 服务端口
    netstat -tunlp | grep 9060
    # 8040 BE HTTP 服务端口
    netstat -tunlp | grep 8040
    # 9050 BE 心跳服务端口
    netstat -tunlp | grep 9050
    # 8060 BE bRPC 服务端口
    netstat -tunlp | grep 8060
    # 9070 BE 存算分离集群的 Agent 端口,虽然用不到,但是默认也需要配置下
    netstat -tunlp | grep 9070
    
  4. 启用内存超额分配(Memory Overcommit):

    sysctl -w vm.overcommit_memory=1 >> /etc/sysctl.conf
    
  5. 禁用系统透明大页面(Transparent Huge Pages),否则会干扰内存的分配:

    echo madvise >/sys/kernel/mm/transparent_hugepage/enabled
    echo madvise >/sys/kernel/mm/transparent_hugepage/defrag
    
  6. 在使用 SSD 或 NVMe 硬盘的情况下建议开启 kyber 或 noop 调度算法:

    # 查看支持的磁盘调度算法,${disk} 是具体的设备,例如:sdb
    cat /sys/block/${disk}/queue/scheduler
    # 如果选项中有 kyber 则推荐设置
    echo kyber | tee /sys/block/${disk}/queue/scheduler
    # 如果没有 kyber 则可以设置 none
    echo none | tee /sys/block/vdb/queue/scheduler
    
  7. 开启新连接重置,当系统因后台处理无法再接收新的连接时可以允许丢弃新的连接:

    sysctl -w net.ipv4.tcp_abort_on_overflow=1 >> /etc/sysctl.conf
    

3.集群部署及配置

3.1.安装包解压

当前的安装包为 StarRocks-3.2.3-amd64.tar.gz,接下来在 3 个节点上分别安装 StarRocks,执行安装命令:

# 每个节点都需要执行,将 StarRocks 安装到 /opt/StarRocks-3.2.3-amd64
tar -xvzf StarRocks-3.2.3-amd64.tar.gz -C /opt
cd /opt/StarRocks-3.2.3-amd64

3.2.FE 节点配置

在所有节点创建 FE 元数据目录:

mkdir -p /data/starrocks/meta

然后我们选择第一个节点 olap1 修改 FE 的配置文件 fe/conf/fe.conf 主要修改下面的一些配置:

meta_dir = /data/starrocks/meta

http_port = 8030
rpc_port = 9020
query_port = 9030
edit_log_port = 9010
mysql_service_nio_enabled = true

priority_networks = 10.0.1.0/24

其中 meta_dir 配置 FE 的元数据目录。

然后是端口号部分的设置,我们这里都使用上面约定的默认值:

  1. http_port 是 FE 对外提供的 HTTP 端口,默认是 8030
  2. rpc_port 是 FE 对外提供的 Thrift 端口,默认是 9020
  3. query_port 是 FE 对外提供的查询端口,可以使用 MySQL 客户端连接,默认是 9030
  4. edit_log_port 是多个 FE 之间组建高可用集群使用的通信端口,默认是 9010

priority_networks 配置集群所在的网络,格式是 CIDR 描述,如果我们使用主机名(FQDN)访问,则不需要配置这个项,我们这里计划使用 IP 地址访问,所以需要设置一下这个配置。

其他的配置保持默认即可。另外如果我们系统上有多个 JDK 或者 JDK 非包管理安装,那么必须单独指定我们要使用的 JAVA_HOME,例如:

JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64

基本的配置就是上面这些,我们修改完成后保存配置,然后注意将配置文件同步到其他节点:

cd fe/conf
scp fe.conf olap2:`pwd`
scp fe.conf olap3:`pwd`
cd -

3.3.BE 节点配置

在所有节点都创建 BE 数据目录:

mkdir -p /data/starrocks/storage

然后修改配置文件 be/conf/be.conf 主要内容如下:

JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64

be_port = 9060
be_http_port = 8040
heartbeat_service_port = 9050
brpc_port = 8060
starlet_port = 9070
priority_networks = 10.0.1.0/24
storage_root_path = /data/starrocks/storage

由于我们后续会使用 Systemd 管理 StarRocks 的进程,对于 BE 来说必须配置 JAVA_HOME 否则会报错找不到 JDK 具体的位置,但是如果是用包管理方式安装的 JDK,那么 FE 会自动检测 JAVA_HOME,因此默认可以不配置。

端口号的配置我们同样和前面约定的一样保持默认:

  1. be_port 是 BE 对外提供的 Thrift 端口,默认是 9060
  2. be_http_port 是 BE 对外提供的 HTTP 端口,默认是 8040
  3. heartbeat_service_port 是 BE 心跳服务的端口,默认是 9050
  4. brpc_port 是 BE 对外提供的 bRPC 端口,默认是 8060
  5. starlet_port 是存算分离集群用于心跳的端口,默认是 9070,不过我们当前集群用不到,只需要配置一下即可

然后 priority_networks 仍然是和 FE 一样,由于使用 IP 访问所以需要配置一下,如果使用主机名则不需要配置。

最后 storage_root_path 配置 BE 的数据目录。

基本配置就上面这些,配置完成后保存,然后同步到其他的节点:

cd be/conf
scp be.conf olap2:`pwd`
scp be.conf olap3:`pwd`
cd -

3.4.初始化启动

我们先在第一个节点(当前是 olap1)启动 FE 服务:

# 只启动第一个节点
./fe/bin/start_fe.sh --daemon

注意我们只需要在集群中的一个节点启动,其他节点一定不要先启动,因为元数据目录一旦初始化,后续配置高可用集群就会出现报错!

然后我们在所有节点启动 BE 服务:

# 所有节点都执行
./be/bin/start_be.sh --daemon

启动后可以查看对应目录下的日志确认没有严重的错误,然后我们在刚才启动 FE 的节点上连接 FE MySQL 端口:

mysql -h127.0.0.1 -P9030 -uroot --prompt='StarRocks > '

连接后我们查看 FE 的状态:

SHOW PROC '/frontends'\G

正常现在就只有一个 FE 节点,就是当前这个节点。然后再查看 BE 的状态:

SHOW PROC '/backends'\G

现在会发现 BE 为空,然后我们手动添加所有的 BE 节点:

-- 注意端口使用 heartbeat_service_port 配置的端口
ALTER SYSTEM ADD BACKEND "10.0.1.21:9050", "10.0.1.22:9050", "10.0.1.23:9050";
SHOW PROC '/backends'\G

添加后我们就可以看到 3 个 BE 节点了。现在 StarRocks 集群就算基本上启动完毕了。

3.5.添加 FE 节点实现高可用

然后我们要将剩余的两个 FE 节点添加进去,组成高可用的 FE 集群,在第一个运行的 FE 节点上执行:

-- 添加 FE 要使用 edit_log_port 通信端口
ALTER SYSTEM ADD FOLLOWER "10.0.1.22:9010";
ALTER SYSTEM ADD FOLLOWER "10.0.1.23:9010";

每行只能添加一个 FE,这里添加两次,添加后查看状态应该可以看到添加的节点但是 activejoin 这两个状态应该都是 false,因为另外两个 FE 还没有启动,我们需要依次启动他们:

# 添加 --helper 参数指定 Leader FE
# 在另外两个节点上面依次执行
fe/bin/start_fe.sh --helper 10.0.1.21:9010 --daemon

启动之后我们在任何一个 FE 节点上查看状态应该都是正常的了,此时集群 FE 就拥有了高可用的能力。

注意上面的 --helper 参数只在第一次启动的时候指定即可,后续再启动无需指定,因为每个机器中的元数据都保存了集群的信息,启动时就会自动组建高可用的集群。

3.6.使用 Systemd 服务管理 StarRocks 进程

我们首先在所有节点依次停止 FE 和 BE 服务:

# 在所有节点都执行
./fe/bin/stop_fe.sh
./be/bin/stop_be.sh

停止之后我们在所有节点依次运行安装服务脚本安装 StarRocks 服务文件:

# 在所有节点都需要安装
./install-service.sh

安装之后我们在所有节点再次启动 FE 和 BE 服务:

# 在所有节点都执行
systemctl start starrocks@fe.service
systemctl start starrocks@be.service

启动后我们查看服务状态或日志确认是否正常:

systemctl status starrocks@fe.service
systemctl status starrocks@be.service

如果需要设置开机启动可以执行:

systemctl enable starrocks@fe.service
systemctl enable starrocks@be.service

启动之后我们查看集群的状态是否正常,如果没有问题则后续即可使用 Systemd 进行管理。

3.7.设置管理密码和其他处理

默认情况下 StarRocks 集群是没有密码的,我们需要先设置 root 用户的密码,进入 MySQL 客户端后设置如下:

SET PASSWORD = PASSWORD('<password>');

然后再次登录就需要输入密码了。

在生产环境中 root 密码只提供给管理员运维使用,如果开发者需要访问那么推荐设置专门的用户,保证权限分配的最小化,例如:

-- 创建开发的数据库
create database example_db;
-- 创建用户并将数据库授权给用户
create user 'test' IDENTIFIED by '123456';
GRANT ALL on example_db.* to test;

然后就可以使用我们创建的用户 test 连接数据库 example_db 了。

最后为了我们方便进入客户端,不用再每次输入这么长的命令,我们可以给命令做一个别名,可以在 ~/.bashrc 中添加下面的环境变量:

alias starrocks-client='mysql -h127.0.0.1 -P9030 -uroot --prompt="StarRocks > " -p'

这样下次就可以直接输入 starrocks-client 命令进入客户端了。

FAQ

1.启动 BE 报错 file descriptors limit is too small

第一次启动 BE 时启动后进程自动停止,此时查看日志报错:

File descriptor number is less than 60000. Please use (ulimit -n) to set a value equal or greater than 60000
check fd number failed, error: Internal error: file descriptors limit is too small
open engine failed, error: Internal error: file descriptors limit is too small
file descriptors limit is too small

这个原因是因为当前环境的最大文件数没有调整,至少需要 60000 以上 BE 才会启动,遇到这个问题是因为基础配置没有做好,请按照前提条件的准备部分调整之后再启动即可,后续使用 Systemd 管理时会自动调整参数,不再依赖于当前的设置。

2.启动 FE 报错 Unexpected internal state, may have side effects.

在组建 FE 高可用集群时如果出现下面的报错:

weren't! UNEXPECTED_STATE: Unexpected internal state, may have side effects.

那么这个原因是在加入 Follower FE 之前不小心启动了单独启动了 FE 导致的,因为第一次启动的时候 FE 会生成元数据,由于加入 FE 集群会重新生成新的元数据,所以数据出现了冲突,也就是说要求加入 FE 集群时当前节点必须是第一次启动,目录是空的才可以,所以当遇到这个报错时只需要清空当前节点的元数据目录,再次添加 --helper 参数启动即可。