JAVA_HOME
3.2.3
,支持 x86 和 ARM 芯片上的主流 Linux 系统。cat /proc/cpuinfo | grep avx2
推荐优先选择当前标准集群部署方式,和容器化相比性能更加出色。同时建议尽量部署在 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.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
在所有节点创建 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 的元数据目录。
然后是端口号部分的设置,我们这里都使用上面约定的默认值:
http_port
是 FE 对外提供的 HTTP 端口,默认是 8030rpc_port
是 FE 对外提供的 Thrift 端口,默认是 9020query_port
是 FE 对外提供的查询端口,可以使用 MySQL 客户端连接,默认是 9030edit_log_port
是多个 FE 之间组建高可用集群使用的通信端口,默认是 9010priority_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 -
在所有节点都创建 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
,因此默认可以不配置。
端口号的配置我们同样和前面约定的一样保持默认:
be_port
是 BE 对外提供的 Thrift 端口,默认是 9060be_http_port
是 BE 对外提供的 HTTP 端口,默认是 8040heartbeat_service_port
是 BE 心跳服务的端口,默认是 9050brpc_port
是 BE 对外提供的 bRPC 端口,默认是 8060starlet_port
是存算分离集群用于心跳的端口,默认是 9070,不过我们当前集群用不到,只需要配置一下即可然后 priority_networks
仍然是和 FE 一样,由于使用 IP 访问所以需要配置一下,如果使用主机名则不需要配置。
最后 storage_root_path
配置 BE 的数据目录。
基本配置就上面这些,配置完成后保存,然后同步到其他的节点:
cd be/conf
scp be.conf olap2:`pwd`
scp be.conf olap3:`pwd`
cd -
我们先在第一个节点(当前是 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 集群就算基本上启动完毕了。
然后我们要将剩余的两个 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,这里添加两次,添加后查看状态应该可以看到添加的节点但是 active
和 join
这两个状态应该都是 false
,因为另外两个 FE 还没有启动,我们需要依次启动他们:
# 添加 --helper 参数指定 Leader FE
# 在另外两个节点上面依次执行
fe/bin/start_fe.sh --helper 10.0.1.21:9010 --daemon
启动之后我们在任何一个 FE 节点上查看状态应该都是正常的了,此时集群 FE 就拥有了高可用的能力。
注意上面的 --helper
参数只在第一次启动的时候指定即可,后续再启动无需指定,因为每个机器中的元数据都保存了集群的信息,启动时就会自动组建高可用的集群。
我们首先在所有节点依次停止 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 进行管理。
默认情况下 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
命令进入客户端了。
第一次启动 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 管理时会自动调整参数,不再依赖于当前的设置。
在组建 FE 高可用集群时如果出现下面的报错:
weren't! UNEXPECTED_STATE: Unexpected internal state, may have side effects.
那么这个原因是在加入 Follower FE 之前不小心启动了单独启动了 FE 导致的,因为第一次启动的时候 FE 会生成元数据,由于加入 FE 集群会重新生成新的元数据,所以数据出现了冲突,也就是说要求加入 FE 集群时当前节点必须是第一次启动,目录是空的才可以,所以当遇到这个报错时只需要清空当前节点的元数据目录,再次添加 --helper
参数启动即可。