目录

一、概述

1、StarRocks简介

1.1、StarRocks适合什么场景

1.2、StarRocks基本概念

1.3、StarRocks系统架构

1.4、数据管理

2、StarRocks安装部署

3、SQL语句

3.1、导入数据

4、StarRocks 表设计

4.1、列式存储

4.2、索引

4.3、Bitmap 索引

4.4、Bloomfilter 索引


一、概述

        StarRocks是北京鼎石纵横科技有限公司基于Apache Doris(incubating) 0.13打造出的企业级国产数据库产品,目前已在Github开源:https://github.com/StarRocks/starrocks

1、StarRocks简介

StarRocks官网:StarRocks官网

国产化缓存技术有哪些能替代redis 国产缓存数据库_国产化缓存技术有哪些能替代redis

         StarRocks是新一代极速全场景MPP数据库

        StarRocks充分吸收关系型OLAP数据库和分布式存储系统在大数据时代的优秀研究成果,在业界实践的基础上,进一步改进优化,升级架构,并增添了众多全新功能,形成了全新的企业级产品。

        StarRocks致力于构建极速统一分析体验,满足企业用户的多种数据分析场景,支持多种数据模型(明细模型、聚合模型、更新模型),多种导入方式(批量和实时),可整合和接入多种现有系统(Spark,Flink,Hive,ElasticSearch)。

        StarRocks兼容MySQL协议,可使用MySQL客户端和常用BI工具对接StarRocks来进行数据分析。

        StarRocks采用分布式架构,对数据表进行水平划分并以多副本存储。集群规模可以灵活伸缩,能够支持10PB级别的数据分析,支持MPP框架,并行加速计算,支持多副本,具有弹性容错能力。

        StarRocks采用关系模型,使用严格的数据类型和列式存储引擎,通过编码和压缩技术,降低读写放大,使用向量化执行方式,充分挖掘多核CPU的并行计算能力,从而显著提升查询能力。

1.1、StarRocks适合什么场景

        StarRocks可以满足企业级用户的多种分析需求,包括OLAP多维分析、定制报表、实时数据分析和Ad-hoc数据分析等。具体的业务场景包括:

        1、OLAP多维分析:用户行为分析、用户画像、财务报表、系统监控分析

        2、实时数据分析:电商数据分析,直播质量分析、物流运单分析、广告投放分析

        3、高并发查询:广告主表分析、Dashbroad多页面分析

        4、统一分析:通过使用一套系统解决上述场景,降低系统复杂度和多技术栈开发成本

1.2、StarRocks基本概念

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节点上。

1.3、StarRocks系统架构

        StarRocks 架构简洁,整个系统的核心只有 FE(Frontend)、BE(Backend)两类进程,不依赖任何外部组件,方便部署与维护。FE 和 BE 模块都可以在线水平扩展,元数据和业务数据都有副本机制,确保整个系统无单点。StarRocks 提供 MySQL 协议接口,支持标准 SQL 语法。用户可通过 MySQL 客户端方便地查询和分析 StarRocks 中的数据。

系统架构图

国产化缓存技术有哪些能替代redis 国产缓存数据库_数据_02

FE

FE 是 StarRocks 的前端节点,负责管理元数据,管理客户端连接,进行查询规划,查询调度等工作。每个 FE 节点都会在内存保留一份完整的元数据,这样每个 FE 节点都能够提供无差别的服务。

FE 根据配置会有两种角色:Follower 和 Observer。Follower 会通过类 Paxos 的 BDBJE 协议选主出一个 Leader。三者区别如下:

  • Leader
  • 提供元数据读写服务。只有 Leader 节点会对元数据进行写操作,Follower 和 Observer 只有读取权限。Follower 和 Observer 将元数据写入请求路由到 Leader 节点,Leader 更新完数据后,会通过 BDB JE 同步给 Follower 和 Observer。必须有半数以上的 Follower 节点同步成功才算作元数据写入成功。
  • Leader 从 Follower 中选举,实现选主需要集群中有半数以上的 Follower 节点存活。如果 Leader 节点失败,Follower 会发起新一轮选主。
  • Follower
  • 只有元数据读取权限,无写入权限。通过回放 Leader 的元数据日志来异步同步数据。
  • 参与 Leader 选主,必须有半数以上的 Follower 节点存活才能进行选主。
  • Observer
  • 主要用于扩展集群的查询并发能力,可选部署。
  • 不参与选主,不会增加集群选主压力。
  • 通过回放 Leader 的元数据日志来异步同步数据。

BE

BE 是 StarRocks 的后端节点,负责数据存储、SQL执行等工作。

  • 数据存储方面,StarRocks 的 BE 节点都是完全对等的,FE 按照一定策略将数据分配到对应的 BE 节点。BE 负责将导入数据写成对应的格式存储下来,并生成相关索引。
  • 在执行 SQL 计算时,一条SQL语句首先会按照具体的语义规划成逻辑执行单元,然后再按照数据的分布情况拆分成具体的物理执行单元。物理执行单元会在对应的数据存储节点上执行,这样可以实现本地计算,避免数据的传输与拷贝,从而能够得到极致的查询性能。

1.4、数据管理

StarRocks 使用列式存储,采用分区分桶机制进行数据管理。一张表可以被划分成多个分区,如将一张表按照时间来进行分区,粒度可以是一天,或者一周等。一个分区内的数据可以根据一列或者多列进行分桶,将数据切分成多个 Tablet。Tablet 是 StarRocks 中最小的数据管理单元。每个 Tablet 都会以多副本(replica) 的形式存储在不同的 BE 节点中。您可以自行指定 Tablet 的个数和大小。StarRocks会管理好每个 Tablet 副本的分布信息。

下图展示了 StarRocks 的数据划分以及 Tablet 多副本机制。图中,表按照日期划分为 4 个分区,第一个分区进一步切分成 4 个 Tablet。每个 Tablet 使用 3 副本进行备份,分布在 3 个不同的 BE 节点上。

国产化缓存技术有哪些能替代redis 国产缓存数据库_数据块_03

由于一张表被切分成了多个 Tablet,StarRocks 在执行 SQL 语句时,可以对所有 Tablet实现并发处理,从而充分的利用多机、多核提供的计算能力。用户也可以利用 StarRocks 数据的切分方式,将高并发请求压力分摊到多个物理节点,从而可以通过增加物理节点的方式来扩展系统支持高并发的能力。

Tablet 的分布方式与具体的物理节点没有相关性。在 BE 节点规模发生变化时,比如在扩容、缩容时,StarRocks 可以做到无需停止服务,直接完成节点的增减。节点的变化会触发 Tablet 的自动迁移。当节点增加时,一部分 Tablet 会在后台自动被均衡到新增的节点,从而使得数据能够在集群内分布的更加均衡。在节点减少时,下线机器上的 Tablet 会被自动均衡到其他节点,从而自动保证数据的副本数不变。管理员能够非常容易地实现 StarRocks 的弹性伸缩,无需手工进行任何数据的重分布。

StarRocks 支持 Tablet 多副本存储,默认副本数为三个。多副本能够保证数据存储的高可靠以及服务的高可用。在使用三副本的情况下,一个节点的异常不会影响服务的可用性,集群的读、写服务仍然能够正常进行。另外,增加副本数还有助于提高系统的高并发查询能力。

 StarRocks文档

2、StarRocks安装部署

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

3、SQL语句

--在 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数据库。

3.1、导入数据

为适配不同的数据导入需求,StarRocks 系统提供了五种不同的导入方式,以支持不同的数据源(如 HDFS、Kafka、本地文件等)或者方式(异步或同步)导入数据。

StarRocks 数据导入整体生态图如下。

国产化缓存技术有哪些能替代redis 国产缓存数据库_数据块_04

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 本身。

4、StarRocks 表设计

4.1、列式存储

国产化缓存技术有哪些能替代redis 国产缓存数据库_数据库_05

动态增删列。在 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 不能构成维度列前缀,因此无法使用二分查找法,必须处理整表的数据。

4.2、索引

StarRocks 通过前缀索引 (Prefix Index) 和列级索引,能够快速找到目标行所在数据块的起始行号。

StarRocks 表设计原理如下图所示。

国产化缓存技术有哪些能替代redis 国产缓存数据库_数据_06

一张表中的数据组织主要由三部分构成:

  • 前缀索引
    表中每 1024 行数据构成一个逻辑数据块 (Data Block)。每个逻辑数据块在前缀索引表中存储一个索引项,索引项的内容为数据块中第一行数据的维度列所构成的前缀,长度不超过 36 字节。前缀索引是一种稀疏索引。使用表中某行数据的维度列所构成的前缀查找前缀索引表,可以确定该行数据所在逻辑数据块的起始行号。
  • 列级数据块
    表中每列数据都按 64 KB 分块存储。数据块作为一个单位单独编码、压缩,也作为 I/O 单位,整体写回设备或者读出。
  • 列级索引
    表中每列数据都有一个独立的行号索引。行号索引表中,该列的数据块和行号一一对应。每个行号索引项由对应数据块的起始行号、位置和长度信息构成。用某行数据的行号查找行号索引表,可以获取包含该行号对应的数据块所在的位置,读取目标数据块后,可以进一步查找数据。

4.3、Bitmap 索引

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;

4.4、Bloomfilter 索引

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的信息来查看是否命中。

后续实践继续补充.

天下事有难易乎?为之,则难者亦易矣;不为,则易者亦难矣。