赞
踩
目录
StarRocks是北京鼎石纵横科技有限公司基于Apache Doris(incubating) 0.13打造出的企业级国产数据库产品,目前已在Github开源:https://github.com/StarRocks/starrocks
StarRocks官网:StarRocks官网
StarRocks是新一代极速全场景MPP数据库
StarRocks充分吸收关系型OLAP数据库和分布式存储系统在大数据时代的优秀研究成果,在业界实践的基础上,进一步改进优化,升级架构,并增添了众多全新功能,形成了全新的企业级产品。
StarRocks致力于构建极速统一分析体验,满足企业用户的多种数据分析场景,支持多种数据模型(明细模型、聚合模型、更新模型),多种导入方式(批量和实时),可整合和接入多种现有系统(Spark,Flink,Hive,ElasticSearch)。
StarRocks兼容MySQL协议,可使用MySQL客户端和常用BI工具对接StarRocks来进行数据分析。
StarRocks采用分布式架构,对数据表进行水平划分并以多副本存储。集群规模可以灵活伸缩,能够支持10PB级别的数据分析,支持MPP框架,并行加速计算,支持多副本,具有弹性容错能力。
StarRocks采用关系模型,使用严格的数据类型和列式存储引擎,通过编码和压缩技术,降低读写放大,使用向量化执行方式,充分挖掘多核CPU的并行计算能力,从而显著提升查询能力。
StarRocks可以满足企业级用户的多种分析需求,包括OLAP多维分析、定制报表、实时数据分析和Ad-hoc数据分析等。具体的业务场景包括:
1、OLAP多维分析:用户行为分析、用户画像、财务报表、系统监控分析
2、实时数据分析:电商数据分析,直播质量分析、物流运单分析、广告投放分析
3、高并发查询:广告主表分析、Dashbroad多页面分析
4、统一分析:通过使用一套系统解决上述场景,降低系统复杂度和多技术栈开发成本
1、FE:FrontEnd简称FE,是StarRocks的前端节点,负责管理元数据,管理客户端连接,进行查询规划,查询调度等工作。
2、BE:BackEnd简称BE,是StarRocks的后端节点,负责数据库存储,计算执行,以及compaction,副本管理等工作。
3、Broker:StarRocks中和外部HDFS/对象存储等外部数据对接的中转服务,辅助提供导入导出功能。
4、StarRocksManager:StarRocks的管理工具,提供StarRocks集群管理、在线查询、故障查询、监控报警的可视化工具。
5、Tablet:StarRocks中表的逻辑分片,也是StarRocks中副本管理的基本单位,每个表根据分区和分桶机制被划分成多个Tablet存储在不同BE节点上。
StarRocks 架构简洁,整个系统的核心只有 FE(Frontend)、BE(Backend)两类进程,不依赖任何外部组件,方便部署与维护。FE 和 BE 模块都可以在线水平扩展,元数据和业务数据都有副本机制,确保整个系统无单点。StarRocks 提供 MySQL 协议接口,支持标准 SQL 语法。用户可通过 MySQL 客户端方便地查询和分析 StarRocks 中的数据。
系统架构图
FE
FE 是 StarRocks 的前端节点,负责管理元数据,管理客户端连接,进行查询规划,查询调度等工作。每个 FE 节点都会在内存保留一份完整的元数据,这样每个 FE 节点都能够提供无差别的服务。
FE 根据配置会有两种角色:Follower 和 Observer。Follower 会通过类 Paxos 的 BDBJE 协议选主出一个 Leader。三者区别如下:
Leader
Follower
Observer
BE
BE 是 StarRocks 的后端节点,负责数据存储、SQL执行等工作。
数据存储方面,StarRocks 的 BE 节点都是完全对等的,FE 按照一定策略将数据分配到对应的 BE 节点。BE 负责将导入数据写成对应的格式存储下来,并生成相关索引。
在执行 SQL 计算时,一条SQL语句首先会按照具体的语义规划成逻辑执行单元,然后再按照数据的分布情况拆分成具体的物理执行单元。物理执行单元会在对应的数据存储节点上执行,这样可以实现本地计算,避免数据的传输与拷贝,从而能够得到极致的查询性能。
StarRocks 使用列式存储,采用分区分桶机制进行数据管理。一张表可以被划分成多个分区,如将一张表按照时间来进行分区,粒度可以是一天,或者一周等。一个分区内的数据可以根据一列或者多列进行分桶,将数据切分成多个 Tablet。Tablet 是 StarRocks 中最小的数据管理单元。每个 Tablet 都会以多副本(replica) 的形式存储在不同的 BE 节点中。您可以自行指定 Tablet 的个数和大小。StarRocks会管理好每个 Tablet 副本的分布信息。
下图展示了 StarRocks 的数据划分以及 Tablet 多副本机制。图中,表按照日期划分为 4 个分区,第一个分区进一步切分成 4 个 Tablet。每个 Tablet 使用 3 副本进行备份,分布在 3 个不同的 BE 节点上。
由于一张表被切分成了多个 Tablet,StarRocks 在执行 SQL 语句时,可以对所有 Tablet实现并发处理,从而充分的利用多机、多核提供的计算能力。用户也可以利用 StarRocks 数据的切分方式,将高并发请求压力分摊到多个物理节点,从而可以通过增加物理节点的方式来扩展系统支持高并发的能力。
Tablet 的分布方式与具体的物理节点没有相关性。在 BE 节点规模发生变化时,比如在扩容、缩容时,StarRocks 可以做到无需停止服务,直接完成节点的增减。节点的变化会触发 Tablet 的自动迁移。当节点增加时,一部分 Tablet 会在后台自动被均衡到新增的节点,从而使得数据能够在集群内分布的更加均衡。在节点减少时,下线机器上的 Tablet 会被自动均衡到其他节点,从而自动保证数据的副本数不变。管理员能够非常容易地实现 StarRocks 的弹性伸缩,无需手工进行任何数据的重分布。
StarRocks 支持 Tablet 多副本存储,默认副本数为三个。多副本能够保证数据存储的高可靠以及服务的高可用。在使用三副本的情况下,一个节点的异常不会影响服务的可用性,集群的读、写服务仍然能够正常进行。另外,增加副本数还有助于提高系统的高并发查询能力。
StarRocks下载:StarRocks下载
StarRocks社区版(免费)/StarRocks企业版(收费)
下载StarRocks社区版(免费)来使用
StarRocks安装部署环境准备:
1、需要安装mysql客户端,进行连接
2、JDK环境
- 1、安装之前检查cpu是否支持,有信息代表支持,没有信息代表不支持
- cat /proc/cpuinfo |grep avx2
-
- 2、下载tar包:下载地址去官网获取
- wget https://download.starrocks.com/zh-CN/download/request-download/53/StarRocks-2.2.7.tar.gz
-
- 3、解压tar包
- tar -zxvf StarRocks-2.2.7.tar.gz -C /opt/module/
-
- --由于我本地虚拟机环境不允许,我本地没进行安装但是有环境我建议查看官网文档--手动部署 StarRocks
- 地址:https://docs.starrocks.io/zh-cn/latest/quick_start/Deploy
- --在 StarRocks 中,字段名不区分大小写,表名区分大小写。
- --建表时,DISTRIBUTED BY 为必填字段。
- 1、创建表
- CREATE TABLE IF NOT EXISTS detailDemo (
- recruit_date DATE NOT NULL COMMENT "YYYY-MM-DD",
- region_num TINYINT COMMENT "range [-128, 127]",
- num_plate SMALLINT COMMENT "range [-32768, 32767] ",
- tel INT COMMENT "range [-2147483648, 2147483647]",
- id BIGINT COMMENT "range [-2^63 + 1 ~ 2^63 - 1]",
- password LARGEINT COMMENT "range [-2^127 + 1 ~ 2^127 - 1]",
- name CHAR(20) NOT NULL COMMENT "range char(m),m in (1-255) ",
- profile VARCHAR(500) NOT NULL COMMENT "upper limit value 65533 bytes",
- hobby STRING NOT NULL COMMENT "upper limit value 65533 bytes",
- leave_time DATETIME COMMENT "YYYY-MM-DD HH:MM:SS",
- channel FLOAT COMMENT "4 bytes",
- income DOUBLE COMMENT "8 bytes",
- account DECIMAL(12,4) COMMENT "",
- ispass BOOLEAN COMMENT "true/false"
- ) ENGINE=OLAP
- DUPLICATE KEY(recruit_date, region_num)
- DISTRIBUTED BY HASH(recruit_date, region_num) BUCKETS 8;
-
- 1.1、排序键
- StarRocks 表内部组织存储数据时会按照指定列排序,这些列为排序列(Sort Key)。明细模型中由 DUPLICATE KEY 指定排序列。以上示例中的 recruit_date 以及 region_num 两列为排序列。
-
- 1.2、StarRocks 支持多种数据模型,分别为 明细模型,聚合模型,更新模型,主键模型。
-
- 1.3、字段类型
- StarRocks 表中支持多种字段类型,除以上示例中已经列举的字段类型,还支持 BITMAP 类型,HLL 类型,ARRAY 类型。
-
- 2、查看当前数据库中所有的表
- SHOW TABLES;
-
- 3、查看表的结构
- DESC table_name;
-
- 4、查看建表语句
- SHOW CREATE TABLE table_name;
-
- 5、修改表结构
- 5.1、增加列
- ALTER TABLE detailDemo ADD COLUMN uv BIGINT DEFAULT '0' after ispass;
- --在以上创建的表中,与 ispass 列后新增一列 uv,类型为 BIGINT,默认值为 0。
- 5.2、删除列
- ALTER TABLE detailDemo DROP COLUMN uv;
-
- 6、创建用户并授权
- CREATE USER 'test' IDENTIFIED by '123456';
- GRANT ALL on example_db to test;--通过登录被授权的test账户,就可以操作example_db数据库。
为适配不同的数据导入需求,StarRocks 系统提供了五种不同的导入方式,以支持不同的数据源(如 HDFS、Kafka、本地文件等)或者方式(异步或同步)导入数据。
StarRocks 数据导入整体生态图如下。
Broker Load
Broker Load 模式是一种异步数据导入模式,通过 Broker 进程访问并读取外部数据源,然后采用 MySQL 协议向 StarRocks 创建导入作业。
Broker Load 模式适用于源数据在 Broker 进程可访问的存储系统(如 HDFS,S3)中的情景,可以支撑数据量达数百 GB 的导入作业。该导入方式支持的数据源有 Apache Hive™ 等。
Spark Load
Spark Load 是一种异步数据导入模式,通过外部的 Apache Spark™ 资源实现对导入数据的预处理,提高 StarRocks 大数据量的导入性能并且节省 StarRocks 集群的计算资源。
Spark Load 模式适用于初次向 StarRocks 迁移大数据量(TB 级别)的场景。该导入方式支持的数据源应位于 Apache Spark™ 可访问的存储系统(如 HDFS)中。
通过 Spark Load 可以基于 Apache Hive™ 表实现 全局字典 的数据结构,对输入数据进行类型转换,保存原始值到编码值的映射,例如将字符串类型映射成整型。
Stream Load
Stream Load 是一种同步数据导入模式。用户通过 HTTP 协议发送请求将本地文件或数据流导入到 StarRocks 中,并等待系统返回导入的结果状态,从而判断导入是否成功。
Stream Load 模式适用于导入本地文件,或通过程序导入数据流中的数据。该导入方式支持的数据源有 Apache Flink®、CSV 文件等。
Routine Load
Routine Load(例行导入)提供从指定数据源进行自动数据导入的功能。您可以通过 MySQL 协议提交例行导入作业,生成一个常驻线程,不间断地从数据源(如 Apache Kafka®)中读取数据并导入到 StarRocks 中。
Insert Into
Insert Into 导入模式是一种同步数据导入模式,类似 MySQL 中的 Insert 语句,StarRocks 支持通过 INSERT INTO tbl SELECT ...; 的方式从 StarRocks 的表中读取数据并导入到另一张表。您也可以通过 INSERT INTO tbl VALUES(...); 插入单条数据。该导入方式支持的数据源有 DataX/DTS、Kettle/Informatic、以及 StarRocks 本身。
StarRocks 中的表由行和列构成。每行数据对应用户一条记录,每列数据具有相同的数据类型。所有数据行的列数相同,可以动态增删列。在 StarRocks 中,一张表的列可以分为维度列(也称为 Key 列)和指标列(也称为 Value 列)。维度列用于分组和排序,指标列的值可以通过聚合函数 sum、count、min、max、hll_union_agg 和 bitmap_union 等累加起来。因此,StarRocks 中的表也可以认为是多维的 Key 到多维指标的映射。
在 StarRocks 中,表数据按列存储。物理上,一列数据会经过分块编码、压缩等操作,然后持久化存储到非易失设备上。但在逻辑上,一列数据可以看成是由相同类型的元素构成的一个数组。 一行数据的所有列值在各自的数组中按照列顺序排列,即拥有相同的数组下标。数组下标是隐式的,不需要存储。表中所有的行按照维度列,做多重排序,排序后的位置就是该行的行号。
查询时,如果指定了维度列上的等值条件或者范围条件、并且这些条件中的维度列可以构成表的维度列前缀,则可以利用数据的有序性,使用二分查找法快速锁定目标行。例如,表 table1 包含 event_day、siteid、citycode 和 username 四列,其中 event_day 和 siteid 是维度列。如果查询条件为 event_day = 2020-09-18 和 siteid = 2,因为 event_day 和 siteid 可以构成维度列前缀,因此可以使用二分查找法,只需要处理指定范围内的数据;如果查询条件为 citycode = 4 和 username = Andy,因为 citycode 和 username 不能构成维度列前缀,因此无法使用二分查找法,必须处理整表的数据。
StarRocks 通过前缀索引 (Prefix Index) 和列级索引,能够快速找到目标行所在数据块的起始行号。
StarRocks 表设计原理如下图所示。
一张表中的数据组织主要由三部分构成:
前缀索引
表中每 1024 行数据构成一个逻辑数据块 (Data Block)。每个逻辑数据块在前缀索引表中存储一个索引项,索引项的内容为数据块中第一行数据的维度列所构成的前缀,长度不超过 36 字节。前缀索引是一种稀疏索引。使用表中某行数据的维度列所构成的前缀查找前缀索引表,可以确定该行数据所在逻辑数据块的起始行号。
列级数据块
表中每列数据都按 64 KB 分块存储。数据块作为一个单位单独编码、压缩,也作为 I/O 单位,整体写回设备或者读出。
列级索引
表中每列数据都有一个独立的行号索引。行号索引表中,该列的数据块和行号一一对应。每个行号索引项由对应数据块的起始行号、位置和长度信息构成。用某行数据的行号查找行号索引表,可以获取包含该行号对应的数据块所在的位置,读取目标数据块后,可以进一步查找数据。
Bitmap 索引是一种特殊的数据库索引技术,其使用 bitmap 进行储存和计算操作,能够提高指定列的查询效率。
- 1、注意事项:
- Bitmap 索引适用于满足以下条件的列:
- 基数较低,值大量重复,例如 ENUM 类型的列。如列基数较高,推荐使用 Bloomfilter 索引。
- 可使用等值条件查询或者可转化为等值条件查询。
- 主键模型和明细模型中所有列都可以创建 bitmap 索引;聚合模型和更新模型中,只有维度列(即 Key 列)支持创建 bitmap 索引。
- 不支持为 FLOAT、DOUBLE、BOOLEAN 和 DECIMAL 类型的列创建 bitmap 索引。
- 2、创建索引
- 2.1、建表时创建 bitmap 索引。
- CREATE TABLE d0.table_hash
- (
- k1 TINYINT,
- k2 DECIMAL(10, 2) DEFAULT "10.5",
- v1 CHAR(10) REPLACE,
- v2 INT SUM,
- INDEX index_name (column_name) USING BITMAP COMMENT ''
- )
- ENGINE = olap
- AGGREGATE KEY(k1, k2)
- COMMENT "my first starrocks table"
- DISTRIBUTED BY HASH(k1) BUCKETS 32
- PROPERTIES ("storage_type" = "column");
-
- 参数 必选 说明
- index_name 是 bitmap 索引名称。
- column_name 是 创建 bitmap 索引的列名,您可以指定多个列名,即在建表时可同时为多个列创建 bitmap 索引。
- COMMENT '' 否 索引备注。
- 2.2、建表后使用 CREATE INDEX 语句创建 bitmap 索引
- CREATE INDEX index_name ON table_name (column_name) [USING BITMAP] [COMMENT ''];
- 3、查看索引
- 查看指定表的所有 bitmap 索引。
- SHOW INDEX[ES] FROM [db_name.]table_name [FROM db_name];
- 或SHOW KEY[S] FROM [db_name.]table_name [FROM db_name];
- --创建 bitmap 索引为异步过程,使用如上语句只能查看到已经创建完成的索引。
- 4、删除索引
- 删除指定表的某个 bitmap 索引。
- DROP INDEX index_name ON [db_name.]table_name;
Bloom Filter(布隆过滤器)是用于判断某个元素是否在一个集合中的数据结构,优点是空间效率和时间效率都比较高,缺点是有一定的误判率。
Bloom Filter 索引:
StarRocks的建表时,可通过PROPERTIES{"bloom_filter_columns"="c1,c2,c3"}指定需要建BloomFilter索引的列,查询时,BloomFilter可快速判断某个列中是否存在某个值。如果Bloom Filter判定该列中不存在指定的值,就不需要读取数据文件;如果是全1情形,此时需要读取数据块确认目标值是否存在。另外,Bloom Filter索引无法确定具体是哪一行数据具有该指定的值。
- 1、创建索引
- 建表时使用指定bloom_filter_columns即可:
- PROPERTIES ( "bloom_filter_columns"="k1,k2,k3" )
- 2、查看索引
- 展示指定table_name下的Bloom Filter索引:
- SHOW CREATE TABLE table_name;
- 3、删除索引
- 删除索引即为将索引列从bloom_filter_columns属性中移除:
- ALTER TABLE example_db.my_table SET ("bloom_filter_columns" = "");
- 4、修改索引
- 修改索引即为修改表的bloom_filter_columns属性:
- ALTER TABLE example_db.my_table SET ("bloom_filter_columns" = "k1,k2,k3");
注意:
1、不支持对Tinyint、Float、Double、Decimal 类型的列创建Bloom Filter索引。
2、Bloom Filter索引只对in和=过滤查询有加速效果。
3、如果要查看某个查询是否命中了Bloom Filter索引,可以通过查询Profile的信息来查看是否命中。
后续实践继续补充.
天下事有难易乎?为之,则难者亦易矣;不为,则易者亦难矣。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。