StarRocks 容器化集群安装

1.前提条件

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

推荐优先选择 标准集群部署 的方式,和容器化相比性能更加出色。当标准部署方式遇到不支持的操作系统时,再考虑使用当前容器化部署的方式,容器化部署相对更加通用但是性能会有 10% 左右的损失。同时建议尽量部署在 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-docker.tar.gz,接下来在 3 个节点上分别安装 StarRocks,安装前确保 Docker 服务正常运行,执行安装命令:

# 每个节点都需要执行,将 StarRocks 项目安装到 /opt/StarRocks-3.2.3-amd64-docker
tar -xvzf StarRocks-3.2.3-amd64-docker.tar.gz -C /opt
cd /opt/StarRocks-3.2.3-amd64-docker
# 安装导入镜像
./install.sh

3.2.FE 节点配置

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

mkdir -p /data/starrocks/meta

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

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

其中端口号部分的设置我们都使用上面约定的默认值:

  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 地址访问,所以需要设置一下这个配置。

其他配置都保持默认即可。

注意:我们不需要配置数据目录位置,因为数据目录是从外部目录映射到容器内部的,我们内部只使用默认的目录即可。

3.3.BE 节点配置

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

mkdir -p /data/starrocks/storage

然后修改第一个节点 olap1 的配置文件 conf/be.conf 主要相关的内容如下:

be_port = 9060
be_http_port = 8040
heartbeat_service_port = 9050
brpc_port = 8060
starlet_port = 9070
priority_networks = 10.0.1.0/24

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

  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 访问所以需要配置一下,如果使用主机名则不需要配置。

基本配置就上面这些,配置完成后保存。

3.4 配置 Docker Compose

编辑当前(olap1)节点的 docker-compose.yml 配置文件,默认内容如下:

version: '3'
services:
  starrocks:
    image: starrocks:3.2.3
    container_name: starrocks-container
    command: ./entrypoint.sh
    restart: always
    network_mode: "host"
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ./conf/fe.conf:/data/deploy/starrocks/fe/conf/fe.conf
      - ./conf/be.conf:/data/deploy/starrocks/be/conf/be.conf
      - /var/log/starrocks/fe:/data/deploy/starrocks/fe/log
      - /var/log/starrocks/be:/data/deploy/starrocks/be/log
      - /data/starrocks/meta:/data/deploy/starrocks/fe/meta
      - /data/starrocks/storage:/data/deploy/starrocks/be/storage

这里需要修改的只有数据目录的位置这里,而且只需要修改冒号 : 前面主机的部分,比如我们这里元数据目录是 /data/starrocks/meta,数据目录是 /data/starrocks/storage

默认的日志目录也和标准部署方式有所不同,都映射到了 /var/log/starrocks 下面,默认这里不需要修改。

3.5.同步配置文件

我们现在在第一个节点 olap1 上面分别修改了 FE、BE 以及 Docker Compose 的配置文件,接下来我们需要同步到其余的节点上:

scp -r conf/ docker-compose.yml olap2:`pwd`
scp -r conf/ docker-compose.yml olap3:`pwd`

这样即可完成配置文件的同步。

3.6.初始化集群 FE 和 BE

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

# 只在第一个节点执行
./starrocks-server.sh start

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

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

# 默认提示输入密码,直接回车即可
./starrocks-client.sh

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

SHOW PROC '/frontends'\G

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

SHOW PROC '/backends'\G

现在会发现 BE 为空,我们稍后添加,现在先完成 FE 高可用的配置。

我们先在当前节点 olap1 添加 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 还没有初始化并启动,我们需要依次启动他们。

在另外两个节点分别运行 init-fe.sh 初始化脚本:

# 分别在 olap2 和 olap3 节点运行
# 传入参数分别是:元数据目录 已经启动的 FE 地址和 edit_log_port 端口(当前是:10.0.1.21:9010)
./init-fe.sh /data/starrocks/meta 10.0.1.21:9010

运行后当前命令行正常会阻塞,我们不要动,继续在其他节点运行上面的命令,也就是在 olap2 和 olap3 都运行起来,然后没问题我们回到第一个节点查看 StarRocks FE 的状态:

SHOW PROC '/frontends'\G

当我们看到所有的 FE 状态中 JoinAlive 都是 true 的时候,说明 FE 高可用已经初始化完毕了。然后我们按 Ctrl + C 结束掉 olap2 和 olap3 这两个节点阻塞的脚本,结束后我们按照正常方式启动:

# 在剩余两个节点分别启动
./starrocks-server.sh start

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

然后继续手动添加所有的 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.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 了。

FAQ

1.启动 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 集群时当前节点必须是第一次启动,目录是空的才可以,所以当遇到这个报错时只需要清空当前节点的元数据目录,再次运行初始化脚本启动即可。