1、Doris 简介
OLAP和OLTP
-
联机事务处理OLTP(On-Line Transaction Processing)
-
公司业务系统使用数据库的场景,针对业务系统数据库有大量随机的增删改查
-
高并发
-
速度要快
-
支持事务
-
-
联机分析处理OLAP(On-Line Analytical Processing)
-
公司的数据分析使用数据库的场景,对已经生成好的数据进行统计分析
-
一次操作都是针对的整个数据集
-
只有查这个动作,不会去增删改
-
查询的响应速度相对慢点也能接受
-
并发量要求不是太高
-
2、安装
>>略过 后期添加
使用 MySQL Client 连接 FE
mysql -h doitedu01 -P 9030 -uroot
这个只是用了mysql的客户端去连接doris的fe,不是启动的mysql哦!!!并且第一次进去的话,是不需要密码的
解释:
-h 连接地址
-P 端口号
-u 账号
-p 密码
--这个可以设置可以不设置啦,正常生产过程中都会设置一个相对比较复杂的密码,学习的时候就无所谓了
--如果想设置,下面的命令就可以
SET PASSWORD FOR 'root' = PASSWORD('123456');
fe启动完成后可以查看fe的运行状态
fe启动完成后可以查看fe的运行状态
SHOW PROC '/frontends'\G;
添加Fe节点 FE 分为 Leader,Follower 和 Observer 三种角色
ALTER SYSTEM ADD FOLLOWER "doitedu02:9010";
ALTER SYSTEM ADD OBSERVER "doitedu03:9010";
删除
ALTER SYSTEM DROP FOLLOWER "doitedu02:9010";
ALTER SYSTEM DROP OBSERVER "doitedu03:9010"
在doitedu02和doitedu03上分别启动FE节点
/opt/app/doris/fe/bin/start_fe.sh --helper doitedu01:9010 --daemon
记住哦,如果是第一次添加的话,一定要加这两个参数 --helper doitedu01:9010
第一次没添加的 找到你配置的文件地址 把里面的文件删掉
添加 BE 节点
ALTER SYSTEM ADD BACKEND "doitedu01:9050";
查看 BE 状态
SHOW PROC '/backends';
Alive 为 false 表示该 BE 节点还是死的
-- 删除be 节点
ALTER SYSTEM DECOMMISSION BACKEND "doitedu01:9050";
添加broker
# 创建 broker
alter system add broker broker_name "192.168.31.128:8000"
#查看 Broker 状态
show proc "/brokers";
# 删除 broker
alter system DROP ALL BROKER broker_name ;
3、数据表
1、字段类型
>> 略过 后期添加
2、表的基本概念
1、Row & Column
一张表包括行(Row)和列(Column);
Row 即用户的一行数据。Column 用于描述一行数据中不同的字段。
>doris中的列分为两类:key列和value列key列在doris中有两种作用:聚合表模型中,key是聚合和排序的依据其他表模型中,key是排序依据 doris的所有数据都是按照key的字段顺序进行一个排序的(可以理解成索引)
2、分区与分桶
partition(分区):是在逻辑上将一张表按行(横向)划分 (等于说把数据按某个字段进行分割,但是并不是分开存储)
tablet(又叫bucket,分桶):在物理上对一个分区再按行(横向)划分(把分区的数据 经过一个hashcode值%桶数算出桶号,之后创建个文件夹进行存储,文件名就是桶号)
2.1、Partition分区
-
Partition 列可以指定一列或多列,在聚合模型中,分区列必须为 KEY 列。
-
不论分区列是什么类型,在写分区值时,都需要加双引号。
-
分区数量理论上没有上限。
-
当不使用 Partition 建表时,系统会自动生成一个和表名同名的,全值范围的 Partition。该 Partition 对用户不可见,并且不可删改。
-
创建分区时不可添加范围重叠的分区。
2.1.1、Range 分区
-
如果没有分区 ,数据插入不进去 :比如 插入一条2017-06-08的数据 现在的分区范围只有五个并没有满足这个数据的分区, 所以不会插入成功
-
如果删除分区会出现空洞范围,不会影响到其他的分区,但是这个分区范围内的数据会插入不进去
-
如果添加分区,比如2017-2-25,他会以上一个分区的下限为上限创建一个分区 如 2017-02-01~~~2017-02-25
PARTITION BY RANGE(
date
) -- 指定分区类型和分区列 ( -- 指定分区名称,分区的上界 前闭后开
PARTITIONp201701
VALUES LESS THAN ("2017-02-01"),
PARTITIONp201702
VALUES LESS THAN ("2017-03-01"),
PARTITIONp201703
VALUES LESS THAN ("2017-04-01") )
** Range分区除了上述我们看到的单列分区,也支持多列分区,示例如下**
PARTITION BY RANGE(`date`, `id`) 前闭后开
(
PARTITION `p201701_1000` VALUES LESS THAN ("2017-02-01", "1000"),
PARTITION `p201702_2000` VALUES LESS THAN ("2017-03-01", "2000"),
PARTITION `p201703_all` VALUES LESS THAN ("2017-04-01")-- 默认采用id类型的最小值
)
2.1.2、List 分区
分区列支持 BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, DATE, DATETIME, CHAR, VARCHAR 数据类型,分区值为枚举值。只有当数据为目标分区枚举值其中之一时,才可以命中分区。 Partition 支持通过 VALUES IN (...) 来指定每个分区包含的枚举值。
PARTITION BY LIST(`id`, `city`)
(
PARTITION `p1_city` VALUES IN (("1", "Beijing",), ("2", "Shanghai")),
PARTITION `p2_city` VALUES IN (("2", "Beijing"), ("1", "Shanghai")),
PARTITION `p3_city` VALUES IN (("3", "Beijing"), ("4", "Shanghai"))
)
* 数据 ---> 分区
* 1, Beijing ---> p1_city
* 1, Shanghai ---> p1_city
* 2, Shanghai ---> p2_city
* 3, Beijing ---> p3_city
* 1, Tianjin ---> 无法导入
* 4, Beijing ---> 无法导入
2.2、Bucket 分桶
-
如果使用了 Partition(分区),则 DISTRIBUTED ... 语句描述的是数据在各个分区内的划分规则。如果不使用 Partition(分区),则描述的是对整个表的数据的进行一个分桶。
-
分桶列可以是多列,但必须为Key 列。分桶列可以和 Partition 列相同或不同。
-
分桶列的选择,是在查询吞吐 和 查询并发 之间的一种权衡:
-
如果选择多个分桶列(多个key 进行hashcode ),则数据分布更均匀。如果一个查询条件不包含所有分桶列的等值条件,那么该查询会触发所有分桶同时扫描,这样查询的吞吐会增加,单个查询的延迟随之降低。这个方式适合大吞吐低并发的查询场景。(桶分的多了,如果触发所有分桶的扫描,磁盘IO的读写压力会增加,如果这时候多个用户一起触发效率会慢)
-
如果仅选择一个或少数分桶列,则对应的点查询可以仅触发一个分桶扫描。此时,当多个点查询并发时,这些查询有较大的概率分别触发不同的分桶扫描,各个查询之间的IO影响较小(尤其当不同桶分布在不同磁盘上时),所以这种方式适合高并发的点查询场景。(每个桶里数据较多,单次查询效率不如多列桶的效率)
-
-
分桶的数量理论上没有上限
DISTRIBUTED BY HASH(
user_id
) BUCKETS 1
2.3、关于 Partition 和 Bucket的数量和数据量的建议。
-
一个表的 Tablet 总数量 等于 (Partition 参数数量 * Bucket 参数数量)。
-
一个表的 Tablet 数量,在不考虑扩容的情况下,推荐略多于整个集群的磁盘数量。
-
单个tablet(桶)的数据量建议在 1G - 10G 的范围内 ,如果单个tablet数据量过小,那么聚合效果不佳(慢),并且元数据管理压力大(麻烦),如果数据量过大,那么副本的迁移、补齐,且会增加 Schema Change 或者 Rollup 操作失败重试的代价(这些操作失败重试的粒度是 Tablet)。分桶应该控制桶内数据量 ,不易过大或者过小
-
当 Tablet 的数据量原则和数量原则冲突时,建议优先考虑数据量原则。
-
在建表时,每个分区的 Bucket 数量统一指定。但是在动态增加分区时(ADD PARTITION),可以单独指定新分区的 Bucket 数量。可以利用这个功能方便的应对数据缩小或膨胀。
-** 案例:假如按日期进行分区,每个分区的桶为10,每个桶的数据量为1个G,但是11号这天数据量大有1T,那么我可以给11号单独创建个分区,这个分区的桶数为50,那么这个分区桶的数据量就只有2G**
-
一个 Partition 的 Bucket 数量一旦指定,不可更改。所以在确定 Bucket 数量时,需要预先考虑集群扩容的情况。比如当前只有 3 台 host,每台 host 有 1 块盘。如果 Bucket 的数量只设置为 3 或更小,那么后期即使再增加机器,也不能提高并发度。
2.4、进阶:复合分区与单分区的选择
-
单分区:就是在创建表的时候不指定分区,只指定了分桶,那么这时候doris会把整个表当个大的分区
-
复合分区:是创建表的时候既指定分区参数,又指定分桶参数
-
第一级称为 Partition,即分区。用户可以指定某一维度列作为分区列(当前只支持整型 和时间类型的列),并指定每个分区的取值范围。
-
第二级称为 Distribution,即分桶。用户可以指定一个或多个维度列以及桶数对数据进行 HASH 分布。
-
>以下场景推荐使用复合分区