20.10.10
。3.2.3
,支持 x86 和 ARM 芯片。cat /proc/cpuinfo | grep avx2
推荐优先选择 标准集群部署 的方式,和容器化相比性能更加出色。当标准部署方式遇到不支持的操作系统时,再考虑使用当前容器化部署的方式,容器化部署相对更加通用但是性能会有 10% 左右的损失。同时建议尽量部署在 x86 芯片上,因为 x86 芯片可以依靠 AVX2 指令集充分发挥矢量化能力,但是 ARM 芯片不支持,因此性能会有很大的损失,所以生产环境不推荐使用。
当前集群共有 3 个节点,其列表配置如下:
olap1 10.0.1.21
olap2 10.0.1.22
olap3 10.0.1.23
StarRocks 的数据目录设置:/data/starrocks
,其中元数据目录为:/data/starrocks/meta
,数据存储目录为:/data/starrocks/storage
本次部署所使用的端口号如下,请确保没有被占用:
# 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
启用内存超额分配(Memory Overcommit):
sysctl -w vm.overcommit_memory=1 >> /etc/sysctl.conf
禁用系统透明大页面(Transparent Huge Pages),否则会干扰内存的分配:
echo madvise >/sys/kernel/mm/transparent_hugepage/enabled
echo madvise >/sys/kernel/mm/transparent_hugepage/defrag
在使用 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
开启新连接重置,当系统因后台处理无法再接收新的连接时可以允许丢弃新的连接:
sysctl -w net.ipv4.tcp_abort_on_overflow=1 >> /etc/sysctl.conf
当前的安装包为 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
在所有节点创建 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
其中端口号部分的设置我们都使用上面约定的默认值:
http_port
是 FE 对外提供的 HTTP 端口,默认是 8030rpc_port
是 FE 对外提供的 Thrift 端口,默认是 9020query_port
是 FE 对外提供的查询端口,可以使用 MySQL 客户端连接,默认是 9030edit_log_port
是多个 FE 之间组建高可用集群使用的通信端口,默认是 9010priority_networks
配置集群所在的网络,格式是 CIDR 描述,如果我们使用主机名(FQDN)访问,则不需要配置这个项,我们这里计划使用 IP 地址访问,所以需要设置一下这个配置。
其他配置都保持默认即可。
注意:我们不需要配置数据目录位置,因为数据目录是从外部目录映射到容器内部的,我们内部只使用默认的目录即可。
在所有节点都创建 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
端口号的配置我们同样和前面约定的一样保持默认:
be_port
是 BE 对外提供的 Thrift 端口,默认是 9060be_http_port
是 BE 对外提供的 HTTP 端口,默认是 8040heartbeat_service_port
是 BE 心跳服务的端口,默认是 9050brpc_port
是 BE 对外提供的 bRPC 端口,默认是 8060starlet_port
是存算分离集群用于心跳的端口,默认是 9070,不过我们当前集群用不到,只需要配置一下即可然后 priority_networks
仍然是和 FE 一样,由于使用 IP 访问所以需要配置一下,如果使用主机名则不需要配置。
基本配置就上面这些,配置完成后保存。
编辑当前(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
下面,默认这里不需要修改。
我们现在在第一个节点 olap1 上面分别修改了 FE、BE 以及 Docker Compose 的配置文件,接下来我们需要同步到其余的节点上:
scp -r conf/ docker-compose.yml olap2:`pwd`
scp -r conf/ docker-compose.yml olap3:`pwd`
这样即可完成配置文件的同步。
我们先在第一个节点(当前是 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,这里添加两次,添加后查看状态应该可以看到添加的节点但是 active
和 join
这两个状态应该都是 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 状态中 Join
和 Alive
都是 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 集群就算基本上启动完毕了。
默认情况下 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
了。
在组建 FE 高可用集群时如果出现下面的报错:
weren't! UNEXPECTED_STATE: Unexpected internal state, may have side effects.
那么这个原因是在加入 Follower FE 之前不小心启动了单独启动了 FE 导致的,因为第一次启动的时候 FE 会生成元数据,由于加入 FE 集群会重新生成新的元数据,所以数据出现了冲突,也就是说要求加入 FE 集群时当前节点必须是第一次启动,目录是空的才可以,所以当遇到这个报错时只需要清空当前节点的元数据目录,再次运行初始化脚本启动即可。