StarRocks作为新一代MPP数据库,集群部署才能充分发挥其彪悍的查询性能。生产环境下我们也推荐进行集群化部署,本章内容我们就模拟生产环境下StarRocks集群部署。
在“1.1章 源码编译”中我们已经介绍了版本选择时的注意事项,这里我们以从StarRocks官网下载的1.19.3社区版为例进行部署,下载地址:
StarRocks - 新一代极速全场景MPP数据库新一代极速全场景MPP数据库,速度提升100倍!https://www.starrocks.com/zh-CN/download/community
1 集群部署注意事项
在部署StarRocks生产环境前,我们需要根据业务需求设计严谨的集群架构,一般来说,我们需要注意以下几项:
1.1 FE的数量及是否需要FE的高可用
FE的Follower要求为奇数个,且并不建议部署太多,通常我们推荐部署1个或3个Follower。在三个Follower时,即可实现高可用(HA)。此时,若Leader节点进程挂掉或与集群脱离通信,其他2个Follower节点会通过bdbje协议快速重新选主出一个Leader,保证集群的正常工作(FE Leader节点异常仅影响集群写入,不会对集群对外的查询功能有影响)。这里注意,集群中需要有半数以上的Follower节点存活,才可进行FE的重新选主。
一般情况下,相对更推荐部署1 Follower+多Observer的FE架构,通过增加Observer来扩展集群的高并发读服务能力。
通常,一个FE节点可以应对10-20台BE节点,我们建议总的FE节点数量在10个以下,而一般3个即可满足绝大部分业务需求。
1.2 BE实例数量
BE实例数量直接决定了集群整体查询延迟,生产环境BE数量建议至少为3个。StarRocks建表时默认为3副本,生产环境下我们也推荐使用3副本数据。由于StarRocks的副本策略,副本数不能大于BE实例数(不同Host),所以为保障数据安全,建议至少部署三个BE实例(不同Host)。
1.3 Broker实例数量
通常与BE混布,与BE数量保持相同,并建议所有的Broker使用相同的名称,这样在执行Broker任务时可以并行使用多个Broker实例。
如果我们的业务中不需要和Hadoop类的产品对接,那么也可以不部署Broker。
1.4 FE与BE是否混布
前面已经提到,单台机器下,同集群FE不能混布,BE虽然能混布但是没有价值。FE和BE是可以混部的,但生产环境下需要注意CPU、内存等资源竞争问题,并保证元数据目录和数据目录分属不同磁盘。
2 集群架构设计
根据实际业务情况粗估集群规模后,我们就可以准备部署。StarRocks的扩容非常友好,若前期我们无法较为准确的判断出对应的集群规模,建议先部署一套最小架构的集群,后面逐步扩容。
例如,我们使用以下三台已进行完“第1.2章:部署环境准备”的服务器进行部署,服务器配置:
主机名 | 配置要求 |
192.168.110.101(node01) | 16核 32GB 万兆网卡 CPU支持AVX2指令集 |
192.168.110.102(node02) | 16核 32GB 万兆网卡 CPU支持AVX2指令集 |
192.168.110.103(node03) | 16核 32GB 万兆网卡 CPU支持AVX2指令集 |
生产环境集群架构设计示例(也可以用3Follower架构):
机器节点 | 192.168.116.101 (node01) | 192.168.110.102 (node02) | 192.168.116.103 (node03) |
部署服务 | FE(Leader) BE Broker mysql-client | FE(Observer) BE Broker | BE Broker |
生产环境各节点部署目录及数据目录设计如下(这里假定meta与storage分属不同的磁盘):
FE | 部署目录:/opt/module/starrocks/fe 日志目录:/opt/module/starrocks/fe/log 元数据目录:/opt/module/meta |
BE | 部署目录:/opt/module/starrocks/be 日志目录:/opt/module/starrocks/be/log 数据存储目录:/opt/module/storage |
Broker | 部署目录:/opt/module/starrocks/apache_hdfs_broker |
3 使用普通用户
实际生产中,运维管理员通常不会将root账号交给我们,或者个别场景下是使用用户名作为鉴权方式,为贴合实际业务,后续的部署操作我们分别新建starrocks用户进行(密码也暂设为starrocks):
[root@node01 ~]# useradd starrocks
[root@node01 ~]# passwd starrocks
Changing password for user starrocks.
New password: 这里输入starrocks
BAD PASSWORD: The password contains the user name in some form
Retype new password: 再次输入starrocks
passwd: all authentication tokens updated successfully.
再分别对node02及node03新建用户starrocks(操作同上,略)。
使用root用户分别在三个节点上新建/opt/module文件夹,并将文件夹所有者变更为starrocks用户:
[root@node01 ~]# mkdir /opt/module
[root@node01 ~]# chown starrocks /opt/module/
对node02及node03也分别进行该操作(操作同上,略)。
4 配置集群间SSH免密登录
为方便后续操作,我们为starrocks用户配置集群间SSH免密。SSH免密配置方法比较灵活,这里演示一种。我们切换至starrocks用户:
[root@node01 ~]# su starrocks
[starrocks@node01 root]$
生成公钥和私钥:
[starrocks@node01 root]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/starrocks/.ssh/id_rsa): 回车
Created directory '/home/starrocks/.ssh'.
Enter passphrase (empty for no passphrase): 回车
Enter same passphrase again: 回车
Your identification has been saved in /home/starrocks/.ssh/id_rsa.
Your public key has been saved in /home/starrocks/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:ZNAqiKrylI0FyuzSxhGHp6mzmaVaQHMt6dNzKmv5gHA starrocks@node01
The key's randomart image is:
+---[RSA 2048]----+
| .. |
| .o .. |
| ++=o. .o |
|=.=B+ .o |
|=oEo.+ .S |
|+*.*. + |
|=oXoo. |
|+@ o+ |
|O.o... |
+----[SHA256]-----+
将公钥拷贝至本机:
[starrocks@node01 ~]$ ssh-copy-id 192.168.110.101
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/starrocks/.ssh/id_rsa.pub"
The authenticity of host '192.168.110.101 (192.168.110.101)' can't be established.
ECDSA key fingerprint is SHA256:SbXiLQFCWyTY547XciYFRgP07UE711rygMbmUQeP+LE.
ECDSA key fingerprint is MD5:b5:24:12:6a:7a:4f:2a:bf:2d:1a:ee:b5:b8:21:3c:06.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
starrocks@192.168.110.101's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '192.168.110.101'"
and check to make sure that only the key(s) you wanted were added.
拷贝node01 starrocks用户家目录下.ssh文件夹至集群其他所有节点:
拷贝至node02节点:
[starrocks@node01 ~]$ scp -r /home/starrocks/.ssh/ 192.168.110.102:/home/starrocks/
The authenticity of host '192.168.110.102 (192.168.110.102)' can't be established.
ECDSA key fingerprint is SHA256:SbXiLQFCWyTY547XciYFRgP07UE711rygMbmUQeP+LE.
ECDSA key fingerprint is MD5:b5:24:12:6a:7a:4f:2a:bf:2d:1a:ee:b5:b8:21:3c:06.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.110.102' (ECDSA) to the list of known hosts.
starrocks@192.168.110.102's password: 输入node02 starrocks用户的密码:starrocks
id_rsa 100% 1679 1.2MB/s 00:00
id_rsa.pub 100% 398 522.6KB/s 00:00
known_hosts 100% 354 634.6KB/s 00:00
authorized_keys 100% 398 614.5KB/s 00:00
拷贝至node03节点:
[starrocks@node01 ~]$ scp -r /home/starrocks/.ssh/ 192.168.110.103:/home/starrocks/
…………
免密配置完成。这种配置方式可以快捷的实现集群间任意节点的免密访问。
5 上传产品包
上传安装包至node01的/opt/module/目录下:
[starrocks@node01 ~]$ cd /opt/module/
[starrocks@node01 module]$ ll
total 987308
-rw-r--r-- 1 root root 1010999795 Dec 4 14:56 StarRocks-1.19.3.tar.gz
解压:
[starrocks@node01 module]$ tar xf StarRocks-1.19.3.tar.gz
[starrocks@node01 module]$ ll
total 987308
drwxrwxr-x 6 1007 1007 100 Nov 29 21:32 StarRocks-1.19.3
-rw-r--r-- 1 root root 1010999795 Dec 4 14:56 StarRocks-1.19.3.tar.gz
6 创建部署所需文件夹
依据集群设计对集群各节点创建部署文件夹及数据文件夹:
node01:
[starrocks@node01 module]$ mkdir /opt/module/starrocks
[starrocks@node01 module]$ mkdir /opt/module/meta
[starrocks@node01 module]$ mkdir /opt/module/storage
node02:
[starrocks@node02 ~]$ mkdir /opt/module/starrocks
[starrocks@node02 ~]$ mkdir /opt/module/meta
[starrocks@node02 ~]$ mkdir /opt/module/storage
node03:
[starrocks@node03 ~]$ mkdir /opt/module/starrocks
[starrocks@node03 ~]$ mkdir /opt/module/storage
7 分发部署文件
在node01节点向集群各节点分发部署文件:
node01向node01分发文件:
[starrocks@node01 ~]$ cp -r /opt/module/StarRocks-1.19.3/fe/ /opt/module/starrocks/
[starrocks@node01 ~]$ cp -r /opt/module/StarRocks-1.19.3/be/ /opt/module/starrocks/
[starrocks@node01 ~]$ cp -r /opt/module/StarRocks-1.19.3/apache_hdfs_broker/ /opt/module/starrocks/
[starrocks@node01 ~]$ cd /opt/module/starrocks/
[starrocks@node01 starrocks]$ ll
total 0
drwxr-xr-x 5 starrocks starrocks 40 Dec 4 04:34 apache_hdfs_broker
drwxr-xr-x 6 starrocks starrocks 51 Dec 4 04:34 be
drwxr-xr-x 8 starrocks starrocks 83 Dec 4 04:34 fe
node01向node02分发文件:
[starrocks@node01 ~]$ scp -r /opt/module/StarRocks-1.19.3/fe/ 192.168.110.102:/opt/module/starrocks/
[starrocks@node01 ~]$ scp -r /opt/module/StarRocks-1.19.3/be/ 192.168.110.102:/opt/module/starrocks/
[starrocks@node01 ~]$ scp -r /opt/module/StarRocks-1.19.3/apache_hdfs_broker/ 192.168.110.102:/opt/module/starrocks/
[starrocks@node02 starrocks]$ ll
total 0
drwxr-xr-x 5 starrocks starrocks 40 Dec 4 04:37 apache_hdfs_broker
drwxr-xr-x 6 starrocks starrocks 51 Dec 4 04:37 be
drwxr-xr-x 8 starrocks starrocks 83 Dec 4 04:35 fe
node01向node03分发文件:
[starrocks@node01 ~]$ scp -r /opt/module/StarRocks-1.19.3/be/ 192.168.110.103:/opt/module/starrocks/
[starrocks@node01 ~]$ scp -r /opt/module/StarRocks-1.19.3/apache_hdfs_broker/ 192.168.110.103:/opt/module/starrocks/
[starrocks@node03 ~]$ cd /opt/module/starrocks/
[starrocks@node03 starrocks]$ ll
total 0
drwxr-xr-x 5 starrocks starrocks 40 Dec 4 04:40 apache_hdfs_broker
drwxr-xr-x 6 starrocks starrocks 51 Dec 4 04:39 be
8 部署FE实例
8.1 修改FE配置文件
8.1.1 node01节点修改
生产环境下FE配置文件通常需要关注以下四点,有经验的用户可以根据官网文档的系统配置章节,结合业务情况修改对应配置:
a、修改Java堆内存,避免GC建议16G以上;
b、设置元数据目录,默认目录为fe/meta,我们需要新建目录并修改配置文件,上文已创建;
c、注意默认端口,避免端口冲突,正常情况下不需要修改;
d、绑定IP(CIDR表示法),避免多网卡情况下FE无法自动找到正确的IP。再次注意,如果不清楚CIDR表示法,就直接填写完整ip,例如配置为priority_networks = 192.168.110.101,这样的写法等同于priority_networks = 192.168.110.101/32;
因为当前集群没有部署其他的服务,故端口可以保持默认,我们针对a、b和d修改配置文件(带#的为注释,红色字体为新增配置):
[starrocks@node01 ~]$ vi /opt/module/starrocks/fe/conf/fe.conf
DATE = "$(date +%Y%m%d-%H%M%S)"
JAVA_OPTS="-Xmx16384m -XX:+UseMembar -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xloggc:$STARROCKS_HOME/log/fe.gc.log.$DATE"
# store metadata, create it if it is not exist.
# Default value is ${STARROCKS_HOME}/meta
# meta_dir = ${STARROCKS_HOME}/meta
meta_dir = /opt/module/meta
…………
# Choose one if there are more than one ip except loopback address.
# Note that there should at most one ip match this list.
# If no ip match this rule, will choose one randomly.
# use CIDR format, e.g. 10.10.10.0/24
# Default value is empty.
# priority_networks = 10.10.10.0/24;192.168.0.0/16
priority_networks = 192.168.110.101
修改完成后保存配置。
8.1.2 node02节点修改
[starrocks@node02 starrocks]$ vi /opt/module/starrocks/fe/conf/fe.conf
同样也需要修改堆内存、元数据目录以及绑定IP:
DATE = "$(date +%Y%m%d-%H%M%S)"
JAVA_OPTS="-Xmx16384m -XX:+UseMembar -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xloggc:$STARROCKS_HOME/log/fe.gc.log.$DATE"
# store metadata, create it if it is not exist.
# Default value is ${STARROCKS_HOME}/meta
# meta_dir = ${STARROCKS_HOME}/meta
meta_dir = /opt/module/meta
node02的FE实例需要绑定IP为192.168.110.102:
priority_networks = 192.168.110.102
修改完成后保存退出。
8.2 启动FE
启动node01 FE(首个启动的FE自动成为Leader):
[starrocks@node01 ~]$ cd /opt/module/starrocks/fe/bin/
[starrocks@node01 bin]$ ll
total 16
-rwxrwxr-x 1 starrocks starrocks 1347 Dec 4 04:34 common.sh
-rwxrwxr-x 1 starrocks starrocks 1411 Dec 4 04:34 show_fe_version.sh
-rwxrwxr-x 1 starrocks starrocks 3122 Dec 4 04:34 start_fe.sh
-rwxrwxr-x 1 starrocks starrocks 1749 Dec 4 04:34 stop_fe.sh
[starrocks@node01 bin]$ ./start_fe.sh --daemon
8.3 查看FE状态
查看进程状态:
[starrocks@node01 bin]$ jps | grep StarRocksFe
10319 StarRocksFe
如果进程状态异常可在FE日志目录中查看日志追踪原因,FE的主要日志在fe.log中,所有查询的审计日志在fe.audit.log中。
使用mysql-client访问StarRocks(默认查询端口为9030,自带用户root,初始密码为空),能访问即证明FE Leader节点状态正常(部分情况启动后需要稍等片刻):
[starrocks@node01 bin]$ mysql -h192.168.110.101 -P9030 -uroot
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 0
Server version: 5.1.0
……………………
mysql>
8.4 添加其他FE实例进集群
在“第1.3章的4.5节”中已经提到,建议“先将实例添加进入集群”,然后逐个“启动实例”。将node02的FE作为Observer先添加入集群,端口为edit_log_port,默认是9010:
mysql> alter system add observer '192.168.110.102:9010';
Query OK, 0 rows affected (0.02 sec)
若需要将其作为Follower角色加入集群,这里的sql写法为:
mysql> alter system add follower "fe_host:edit_log_port";
如果添加时IP或端口信息输入有误,或者由于其他情况我们需要将实例从集群中删除,sql写法如下:
删除Follower:
mysql> alter system drop follower "fe_host:edit_log_port";
删除Observer:
mysql> alter system drop observer "fe_host:edit_log_port";
8.5 启动其他FE
启动其他FE实例时需要特别注意:除首个启动的FE外,其他FE节点首次启动时,必需指定一个已存在的FE节点作为helper(后面再启动时就不需要)。
首次启动node02节点,指定node01的FE实例作为helper:
[starrocks@node02 ~]$ cd /opt/module/starrocks/fe/bin/
[starrocks@node02 bin]$ ./start_fe.sh --helper 192.168.110.101:9010 --daemon
[starrocks@node02 bin]$ jps | grep StarRocksFe
10078 StarRocksFe
8.6 查看集群FE状态
在node01的mysql-client中查看FE状态:
mysql> show frontends\G
*************************** 1. row ***************************
Name: 192.168.110.101_9010_1631221944374
IP: 192.168.110.101
EditLogPort: 9010
HttpPort: 8030
QueryPort: 9030
RpcPort: 9020
Role: FOLLOWER
IsMaster: true
ClusterId: 538795507
Join: true
Alive: true
ReplayedJournalId: 129
LastHeartbeat: 2021-12-04 05:19:31
IsHelper: true
ErrMsg:
*************************** 2. row ***************************
Name: 192.168.110.102_9010_1631222131854
IP: 192.168.110.102
EditLogPort: 9010
HttpPort: 8030
QueryPort: 9030
RpcPort: 9020
Role: OBSERVER
IsMaster: false
ClusterId: 538795507
Join: true
Alive: true
ReplayedJournalId: 128
LastHeartbeat: 2021-12-04 05:19:31
IsHelper: false
ErrMsg:
2 rows in set (0.05 sec)
Alive均为true,说明FE状态正常。若状态为false,可以在日志中定位问题,如果异常排查比较耗时,由于是初次启动,我们可以清空FE的元数据目录,再从头开始操作。
大部分同学这里出问题都是因为首次启动没有指定helper,后面想起指定helper启动时又没有清空元数据而导致的。
暂时退出StarRocks:
mysql> exit
Bye
9 部署BE实例
9.1 修改BE配置文件
修改BE配置文件,生产环境首先注意的也是以下三点,其他配置可以在熟悉StarRocks后结合业务需求参考官方文档进行修改:
a、注意默认端口,避免端口冲突,正常情况下不需要修改;
b、绑定IP,避免多网卡情况下BE无法自动找到正确的IP;
c、设置数据存储目录,默认目录为be/storage,我们建议根据磁盘情况新建目录并修改配置文件(前面我们已创建)。
针对b和c修改配置文件(带#的为注释,红色字体为新增配置):
9.1.1 修改node01配置文件
[starrocks@node01 ~]$ vi /opt/module/starrocks/be/conf/be.conf
…………
# Choose one if there are more than one ip except loopback address.
# Note that there should at most one ip match this list.
# If no ip match this rule, will choose one randomly.
# use CIDR format, e.g. 10.10.10.0/24
# Default value is empty.
# priority_networks = 10.10.10.0/24;192.168.0.0/16
priority_networks = 192.168.110.101
…………
# you also can specify the properties by setting '<property>:<value>', seperate by ','
# property 'medium' has a higher priority than the extension of path
#
# Default value is ${STARROCKS_HOME}/storage, you should create it by hand.
# storage_root_path = ${STARROCKS_HOME}/storage
storage_root_path = /opt/module/storage
修改完成后保存配置。
9.1.2 修改node02配置文件
[starrocks@node02 ~]$ vi /opt/module/starrocks/be/conf/be.conf
将IP绑定为node02中集群需要使用的IP,并修改数据存储目录:
priority_networks = 192.168.110.102
storage_root_path = /opt/module/storage
保存退出。
9.1.3 修改node03配置文件
[starrocks@node03 ~]$ vi /opt/module/starrocks/be/conf/be.conf
同样,将IP绑定为node03中集群需要使用的IP,同时修改数据存储目录:
priority_networks = 192.168.110.103
storage_root_path = /opt/module/storage
保存退出。
9.2 添加BE实例进入集群
在node01中使用mysql-client先将这3个BE实例添加进入集群,这里需要使用的端口是portheartbeat_service_port,默认为9050:
[starrocks@node01 ~]$ mysql -h192.168.110.101 -P9030 -uroot
Welcome to the MySQL monitor. Commands end with ; or \g.
………………
mysql> alter system add backend '192.168.110.101:9050';
Query OK, 0 rows affected (0.00 sec)
mysql> alter system add backend '192.168.110.102:9050';
Query OK, 0 rows affected (0.00 sec)
mysql> alter system add backend '192.168.110.103:9050';
Query OK, 0 rows affected (0.01 sec)
同样的,如果BE实例添加时IP或端口信息输入有误,或者由于其他异常情况我们需要在集群中删除BE实例,sql写法:
mysql> alter system dropp backend "be_host:be_heartbeat_service_port";
前面章节已提到,删除BE实例为危险操作,故删除命令设计为“DROPP”。执行DROPP指令后,集群会立刻删除该BE节点,丢失的副本由FE调度补齐,但若为单副本数据,这部分数据将彻底丢失。由于当前是刚开始部署,BE中并没有存储业务数据,故我们此时可以直接采用DROPP的写法。
当StarRocks集群投入生产后,每个BE节点都存储了大量的业务数据,此时若使用DROPP指令从集群中删除某个BE实例,则存储在该实例上的数据副本会直接丢失。这时我们需要使用另一种安全删除的写法:DECOMMISSION。DECOMMISSION会先保证副本补齐,然后再下掉该BE节点。DECOMMISSION方式在生产中更为友好,在后续业务正常缩容是会建议采用这种方式进行缩容,示例:
mysql> alter system decommission backend "be_host:be_heartbeat_service_port";
暂时退出mysql-client:
mysql> exit
Bye
9.3 启动BE实例
9.3.1 启动node01 BE实例
[starrocks@node01 ~]$ cd /opt/module/starrocks/be/bin/
[starrocks@node01 bin]$ ll
total 16
-rwxrwxr-x 1 starrocks starrocks 1347 Dec 4 04:34 common.sh
-rwxrwxr-x 1 starrocks starrocks 644 Dec 4 04:34 show_be_version.sh
-rwxrwxr-x 1 starrocks starrocks 3377 Dec 4 04:34 start_be.sh
-rwxrwxr-x 1 starrocks starrocks 1601 Dec 4 04:34 stop_be.sh
[starrocks@node01 bin]$ ./start_be.sh --daemon
检查进程状态:
[starrocks@node01 bin]$ ps -ef | grep starrocks_be
starroc+ 10858 1 0 05:31 pts/0 00:00:00 /opt/module/starrocks/be/lib/starrocks_be
如果进程状态异常可在BE日志目录中查看日志追踪原因,BE的主要日志在be.INFO中,其他的日志在be.out中。
9.3.2 启动node02 BE实例
[starrocks@node02 ~]$ cd /opt/module/starrocks/be/bin/
[starrocks@node02 bin]$ ./start_be.sh --daemon
检查进程状态:
[starrocks@node02 bin]$ ps -ef | grep starrocks_be
starroc+ 10533 1 2 05:33 pts/0 00:00:00 /opt/module/starrocks/be/lib/starrocks_be
9.3.3 启动node03 BE实例
[starrocks@node03 ~]$ cd /opt/module/starrocks/be/bin/
[starrocks@node03 bin]$ ./start_be.sh --daemon
检查进程状态:
[starrocks@node03 bin]$ ps -ef | grep starrocks_be
starroc+ 10098 1 1 05:35 pts/0 00:00:00 /opt/module/starrocks/be/lib/starrocks_be
9.4 查看启动BE状态
回到node01,使用mysql-client访问StarRocks集群:
[starrocks@node01 ~]$ mysql -h192.168.110.101 -P9030 -uroot
查看BE实例状态是否正常:
mysql> show backends\G
*************************** 1. row ***************************
BackendId: 10003
Cluster: default_cluster
IP: 192.168.110.101
HeartbeatPort: 9050
BePort: 9060
HttpPort: 8040
BrpcPort: 8060
LastStartTime: 2021-12-04 05:31:53
LastHeartbeat: 2021-12-04 05:36:28
Alive: true
SystemDecommissioned: false
ClusterDecommissioned: false
TabletNum: 4
DataUsedCapacity: .000
AvailCapacity: 30.790 GB
TotalCapacity: 37.017 GB
UsedPct: 16.82 %
MaxDiskUsedPct: 16.82 %
ErrMsg:
Version: 1.19.3-e65759c
Status: {"lastSuccessReportTabletsTime":"2021-12-04 05:35:53"}
*************************** 2. row ***************************
BackendId: 10007
Cluster: default_cluster
IP: 192.168.110.102
HeartbeatPort: 9050
BePort: 9060
HttpPort: 8040
BrpcPort: 8060
LastStartTime: 2021-12-04 05:33:43
LastHeartbeat: 2021-12-04 05:36:28
Alive: true
SystemDecommissioned: false
ClusterDecommissioned: false
TabletNum: 3
DataUsedCapacity: .000
AvailCapacity: 33.628 GB
TotalCapacity: 37.017 GB
UsedPct: 9.15 %
MaxDiskUsedPct: 9.15 %
ErrMsg:
Version: 1.19.3-e65759c
Status: {"lastSuccessReportTabletsTime":"2021-12-04 05:35:43"}
*************************** 3. row ***************************
BackendId: 10008
Cluster: default_cluster
IP: 192.168.110.103
HeartbeatPort: 9050
BePort: 9060
HttpPort: 8040
BrpcPort: 8060
LastStartTime: 2021-12-04 05:35:03
LastHeartbeat: 2021-12-04 05:36:28
Alive: true
SystemDecommissioned: false
ClusterDecommissioned: false
TabletNum: 3
DataUsedCapacity: .000
AvailCapacity: 33.849 GB
TotalCapacity: 37.017 GB
UsedPct: 8.56 %
MaxDiskUsedPct: 8.56 %
ErrMsg:
Version: 1.19.3-e65759c
Status: {"lastSuccessReportTabletsTime":"2021-12-04 05:36:03"}
3 rows in set (0.00 sec)
Alive均为true,状态正常,若为false,可根据日志排查问题。同样的,因为当前BE为初次启动,如果出现无法快速定位的问题,可以清空storage数据目录和日志目录,重新启动服务。
10 部署Broker实例
10.1 添加Broker实例进入集群
在node01的mysql-client中,我们先将3个Broker实例添加进入集群,这里端口使用broker_ipc_port,默认端口为8000:
mysql> alter system add broker hdfs_broker '192.168.110.101:8000';
Query OK, 0 rows affected (0.01 sec)
mysql> alter system add broker hdfs_broker '192.168.110.102:8000';
Query OK, 0 rows affected (0.01 sec)
mysql> alter system add broker hdfs_broker '192.168.110.103:8000';
Query OK, 0 rows affected (0.00 sec)
若需要在集群中删除Broker,sql写法为:
mysql> ALTER SYSTEM DROP BROKER broker_name "broker_host:broker_ipc_port";
退出mysql-client:
mysql> exit
Bye
10.2 修改Broker配置文件
在“第1.3章”中我们已说明过Broker实例不需要绑定IP。生产环境下,我们通常也不需要修改Broker配置文件中的其他配置。
10.3 启动Broker服务
10.3.1 启动node01 Broker服务
[starrocks@node01 ~]$ cd /opt/module/starrocks/apache_hdfs_broker/bin/
[starrocks@node01 bin]$ ./start_broker.sh --daemon
检查Broker进程状态:
[starrocks@node01 bin]$ jps | grep BrokerBootstrap
11386 BrokerBootstrap
如果进程状态异常可查看日志追踪原因。
10.3.2 启动node02 Broker服务
[starrocks@node02 ~]$ cd /opt/module/starrocks/apache_hdfs_broker/bin/
[starrocks@node02 bin]$ ./start_broker.sh --daemon
检查Broker进程状态:
[starrocks@node02 bin]$ jps | grep BrokerBootstrap
11039 BrokerBootstrap
10.3.3 启动node03 Broker服务
[starrocks@node03 ~]$ cd /opt/module/starrocks/apache_hdfs_broker/bin/
[starrocks@node03 bin]$ ./start_broker.sh --daemon
检查Broker进程状态:
[starrocks@node03 bin]$ jps | grep BrokerBootstrap
10608 BrokerBootstrap
10.4 查看集群中Broker状态
再次从node01上登录StarRocks:
[starrocks@node01 bin]$ mysql -h192.168.110.101 -P9030 -uroot
查看Broker状态:
mysql> show broker\G
*************************** 1. row ***************************
Name: hdfs_broker
IP: 192.168.110.103
Port: 8000
Alive: true
LastStartTime: 2021-12-04 05:46:20
LastUpdateTime: 2021-12-04 05:47:45
ErrMsg:
*************************** 2. row ***************************
Name: hdfs_broker
IP: 192.168.110.102
Port: 8000
Alive: true
LastStartTime: 2021-12-04 05:45:40
LastUpdateTime: 2021-12-04 05:47:45
ErrMsg:
*************************** 3. row ***************************
Name: hdfs_broker
IP: 192.168.110.101
Port: 8000
Alive: true
LastStartTime: 2021-12-04 05:44:50
LastUpdateTime: 2021-12-04 05:47:45
ErrMsg:
3 rows in set (0.00 sec)
Alive均为true,状态正常。Broker日志在apache_hdfs_broker.log中,若状态为false,可依据日志定位问题。
至此,集群所有实例已根据集群设计部署完成。
11 集群实例的启停
集群部署完成后,若机器重启或有服务down掉,我们需要手动或编写脚本启停服务,群起脚本示例见附件一:集群群起脚本。
FE启动:
[starrocks@node0* ~]# cd /opt/module/starrocks/fe/bin/
[starrocks@node0* bin]# ./start_fe.sh --daemon
FE停止:
[starrocks@node0* bin]# ./stop_fe.sh
BE启动:
[starrocks@node0* ~]# cd /opt/module/starrocks/be/bin
[starrocks@node0* bin]# ./start_be.sh --daemon
BE停止:
[starrocks@node0* bin]# ./stop_be.sh
Broker启动:
[starrocks@node0* ~]# cd /opt/module/starrocks/apache_hdfs_broker/bin/
[starrocks@node0* bin]# ./start_broker.sh --daemon
Broker停止:
[starrocks@node0* bin]# ./stop_broker.sh
12 简单使用示例
集群部署完成后,我们可以测试建表和导入数据执行查询。
12.1 修改管理员账户密码
当前版本,StarRocks部署完成后自带一个高权限用户:root,其默认密码为空。在node01上使用mysql-client访问StarRocks集群:
[starrocks@node01 bin]$ mysql -h192.168.110.101 -P9030 -uroot
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 0
Server version: 5.1.0
……………………
mysql>
以root用户为例,将其密码也修改为root(生产环境建议设置复杂密码):
mysql> set password=password('root');
Query OK, 0 rows affected (0.01 sec)
12.2 创建数据库
创建数据库star:
mysql> create database star;
Query OK, 0 rows affected (0.02 sec)
12.3 创建集群普通用户
创建普通用户rocks,指定密码为123456:
mysql> CREATE USER rocks IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.02 sec)
12.4 为用户授权
使用root用户,将数据库star的所有权限授予用户rocks:
mysql> GRANT ALL ON star.* TO rocks;
Query OK, 0 rows affected (0.01 sec)
12.5 更换用户访问集群
退出root用户访问,使用rocks用户登录:
mysql> exit
Bye
[starrocks@node01 ~]# mysql -h192.168.110.101 -P9030 -urocks -p123456
12.6 创建数据表
创建表,以SSB测试集中的customer表为例:
mysql> use star;
Database changed
mysql> CREATE TABLE IF NOT EXISTS `customer` (
`c_custkey` int(11) NOT NULL COMMENT "",
`c_name` varchar(26) NOT NULL COMMENT "",
`c_address` varchar(41) NOT NULL COMMENT "",
`c_city` varchar(11) NOT NULL COMMENT "",
`c_nation` varchar(16) NOT NULL COMMENT "",
`c_region` varchar(13) NOT NULL COMMENT "",
`c_phone` varchar(16) NOT NULL COMMENT "",
`c_mktsegment` varchar(11) NOT NULL COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`c_custkey`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`c_custkey`) BUCKETS 12
PROPERTIES (
"replication_num" = "1",
"in_memory" = "false",
"storage_format" = "DEFAULT"
);
12.7 导入数据
在node02中,使用Stream Load导入本地文件数据,假设数据文件路径为/home/starrocks/customer.tbl(可使用StarRocks官网的SSB工具自行生成,地址:StarRocks - 新一代极速全场景MPP数据库https://www.starrocks.com/zh-CN/blog/1.8):
假设文件中的数据共有3w行,前三行数据格式示例:
1|Customer#000000001|j5JsirBM9P|MOROCCO 0|MOROCCO|AFRICA|25-989-741-2988|BUILDING
2|Customer#000000002|487LW1dovn6Q4dMVym|JORDAN 1|JORDAN|MIDDLE EAST|23-768-687-3665|AUTOMOBILE
3|Customer#000000003|fkRGN8n|ARGENTINA7|ARGENTINA|AMERICA|11-719-748-3364|AUTOMOBILE
…………
Stream Load导入语句:
[starrocks@node02 ~]$ curl --location-trusted -u rocks:123456 -H "label:star_customer_2021120401" -H "column_separator:|" -T /home/starrocks/customer.tbl http://192.168.110.101:8030/api/star/customer/_stream_load
{
"TxnId": 1002,
"Label": "star_customer_2021120401",
"Status": "Success",
"Message": "OK",
"NumberTotalRows": 30000,
"NumberLoadedRows": 30000,
"NumberFilteredRows": 0,
"NumberUnselectedRows": 0,
"LoadBytes": 2807046,
"LoadTimeMs": 197,
"BeginTxnTimeMs": 12,
"StreamLoadPutTimeMs": 35,
"ReadDataTimeMs": 9,
"WriteDataTimeMs": 105,
"CommitAndPublishTimeMs": 44
}
数据导入成功,在node01的mysql-client中进行查询:
mysql> select count(1) from customer;
+------------------+
| count(1) |
+------------------+
| 30000 |
+------------------+
1 row in set (0.12 sec)
附录一:集群群起脚本
在node01节点,使用starrocks用户在/home/starrocks目录下创建starrocks.sh文件:
[starrocks@node01 ~]$ cd /home/starrocks/
[starrocks@node01 ~]$ vi starrocks.sh
在该文件中编写如下代码:
#!/bin/bash
# use-method: starrocks.sh start|stop|restart
case $1 in
"start"){
for i in node01 node02 node03
do
echo "=================== start $i's service ================"
ssh $i "source /etc/profile.d/my_env.sh ;cd /opt/module/starrocks;./fe/bin/start_fe.sh --daemon"
ssh $i "/opt/module/starrocks/be/bin/start_be.sh --daemon"
ssh $i "source /etc/profile.d/my_env.sh ;cd /opt/module/starrocks;./apache_hdfs_broker/bin/start_broker.sh --daemon"
done
};;
"stop"){
for i in node01 node02 node03
do
echo "=================== stop $i's service ================"
ssh $i "/opt/module/starrocks/apache_hdfs_broker/bin/stop_broker.sh"
ssh $i "/opt/module/starrocks/be/bin/stop_be.sh"
ssh $i "/opt/module/starrocks/fe/bin/stop_fe.sh"
done
};;
"restart")
starrocks.sh stop
sleep 2
starrocks.sh start
;;
*)
echo "Parameter ERROR!!!"
;;
esac
赋予脚本starrocks.sh可执行权限:
[starrocks@node01 ~]$ chmod a+x starrocks.sh
切换至root用户,将脚本移动至/bin目录下以便全局调用:
[starrocks@node01 ~]$ su root
Password: 输入root用户的密码
[root@node01 starrocks]# mv starrocks.sh /bin/
切换至starrocks用户,测试使用脚本启动集群(先确定集群各实例都处于未启动状态):
[starrocks@node01 starrocks]# starrocks.sh start
=================== start node01's service ================
=================== start node02's service ================
=================== start node03's service ================
bash: ./fe/bin/start_fe.sh: No such file or directory[这里是因为node03上未部署FE]
检查集群各实例状态,确认状态正常后,还可以测试停止集群服务:
[starrocks@node01 starrocks]# starrocks.sh stop
或测试重启集群服务:
[starrocks@node01 starrocks]# starrocks.sh restart
脚本测试正常后,可以将脚本scp分发至node02和node03节点的/bin目录下,方便在集群任意节点快速启停集群服务。