StarRocks数据库运维

标签: 无 分类: 未分类 创建时间:2022-03-06 06:33:15 更新时间:2023-10-20 11:23:26

1.表设计

概念

  • 索引

  • 聚集

  • 分区
    分区的主要目的是裁剪数据,来最大限度地减少扫描数据量,从而提高查询性能。通常我们会使用日期进行分区。这里如果不进行分区,StarRocks会将整个表的数据视为在一个大分区内。

  • 分桶
    分桶是将分区后的数据打散为一个个tablet,使数据多副本分散在集群的多个节点上,充分发挥集群多机多核的查询优势。使用指定的 key 列进行哈希分桶。默认分桶数为10。分桶数过多,会影响备份和恢复的效率。

参考文章:
1.Doris 的建表和数据划分 假设在有10台BE,每台BE一块磁盘的情况下。如果一个表总大小为 500MB,则可以考虑4-8个分片。5GB:8-16个。50GB:32个。500GB:建议分区,每个分区大小在 50GB 左右,每个分区16-32个分片。5TB:建议分区,每个分区大小在 50GB 左右,每个分区16-32个分片。
2.Hive分桶一文读懂
3.Apache Doris数据分区Partition、数据分桶(distributed by)

数据模型

  • 明细模型
    明细模型是StarRocks中最常用的数据模型,顾名思义,它会保留所有的明细数据,也就是说,在明细模型下,即便导入两条完全相同的数据,StarRocks也会将数据原封不动的保存进表,不会进行聚合的操作,也没有update的语义。明细模型可以使用DUPLICATE KEY(列1,列2……)显式的说明使用明细模型,也可以整个省略;在省略DUPLICATE KEY(列1,列2……)时,StarRocks通常也会默认为表选择前三列作为排序键。

  • 聚合模型
    聚合模型会在数据导入时将维度列相同的数据根据指标列设定的聚合函数进行聚合,最终表格中只会保留聚合后的数据,在建表时只要给指标列的定义指明聚合函数,就会启用聚合模型。

  • 更新模型
    更新模型的特点是只保留相同主键下最新导入的数据。在更新模型中,排序键构成表的唯一性约束,成为我们常说的“主键”。

  • 主键模型
    主键模型与更新模型的特点比较接近,主键模型的表要求有唯一的主键,支持对表中的行按主键进行更新和删除操作。但对比更新模型,主键模型通过牺牲微小的写入性能和内存占用,极大提升了查询性能。同时,主键模型可以更好地支持实时/频繁更新的功能,特别适合MySQL或其他数据库同步到StarRocks的场景。

参考文章:
1.StarRocks(二)表设计 StarRocks支持聚合模型, 维度列取值相同数据行可合并一行, 合并后数据行的维度列取值不变, 指标列的取值为这些数据行的聚合结果, 用户需要给指标列指定聚合函数. 通过预先聚合, 可以加速聚合操作.
2.第2.2章:StarRocks表设计–数据模型 这里关于几种数据模型:明细模型、更新模型、主键模型
3.第2.1章:StarRocks表设计–概述 对于分区分桶和聚集函数,我觉得讲的挺好的。
4.第2.4章:StarRocks表设计–分区分桶与副本数 在建表完成后,我们也可以手动增加分区。此时,如果没有指定分桶方式,则自动使用建表时的分桶方式。如果指定分桶方式,则使用新的分桶方式创建(这里当前只能修改分桶数,不能修改分桶方式或分桶列)。还有修改副本数的方法,可以在新建的数据中,增加副本数量。
5.StarRocks 常见问题 Doris只支持utf8编码,对gbk不支持
6.StarRocks性能优化
7.StarRocks表设计
8.数据模型介绍 官方的数据模型介绍

优化

2.增加列

1
2
3
4
ALTER TABLE tablename ADD COLUMN column_name column_type [KEY | agg_type] [DEFAULT "default_value"] [AFTER column_name|FIRST] [PROPERTIES ("key"="value", ...)];

--- 示例 在表 gas 中添加一列
ALTER TABLE gas ADD COLUMN test int(4);

其中,方括号表示可选,竖杠表示或。这里注意:
1)聚合模型如果增加value列,需要指定聚合类型;
2)非聚合模型(如DUPLICATE KEY)如果增加key列,需要指定KEY关键字;
3)希望增加多列时,需要等待一列增加完成后再增加另一列。

3.删除列

1
ALTER TABLE tablename DROP COLUMN column_name;

4.外部表

所谓外部表,可以简单的理解为是在StarRocks中建立的与外部数据的映射,所有的数据还在各自的数据源中,但我们可以通过外部表向所在的数据源发起查询。目前StarRocks已支持的第三方数据源包括MySQL、ElasticSearch、Hive以及StarRocks。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE EXTERNAL TABLE mysql_external_table
(
id INT,
name VARCHAR(3),
height INT
)
ENGINE=mysql
PROPERTIES
(
"host" = "192.168.110.98",
"port" = "3306",
"user" = "root",
"password" = "root",
"database" = "test",
"table" = "mysql_table"
);
参考文章:
1.第2.11章:StarRocks表设计–外部表 这里讲了多个外部表:MySQL外部表、ElasticSearch外部表、Hive外部表、StarRocks外部表

问题

(1) Plugin caching_sha2_password could not be loaded: /var/local/thirdparty/installed/lib/mariadb/plugin/caching_sha2_password.so

1
2
3
4
## 修改mysql的认证方式
ALTER USER user@'%' IDENTIFIED WITH mysql_native_password BY 'password';
## 刷新权限
FLUSH PRIVILEGES;

5.数据导出

6.数据备份

备份(Backup)操作或还原(Restore)可操作的最小单位是分区,最大单位是表,还不直接支持整库的备份或还原。当前也只支持全量备份,还未支持增量。所以如果需要对数据进行定期备份,我们需要在建表时合理规划表的分区,例如按时间分区,然后在后续业务中,按照分区粒度进行备份或还原。支持的远程文件系统:

  • Apache HDFS
  • Amazon S3
  • 阿里云 OSS
  • 腾讯 COS
参考文章:
1.备份与恢复 官方的文档
2.第4.4章:StarRocks备份还原–Backup&Restore 这个有关于使用阿里云oss的例子,关于其他的参数,其实也挺明白的。
3.Broker 这是Doris的文档,这个文档要比starrocks更加的详细。

1.部署Broker

1
2
3
4
5
6
7
8
9
## 启动
./apache_hdfs_broker/bin/start_broker.sh --daemon
## 添加,注意ip地址,broker1 为名称
MySQL> ALTER SYSTEM ADD BROKER hdfs_broker "192.168.1.94:8000";
## 查看状态
MySQL> SHOW PROC "/brokers"\G

## 删除, hdfs_broker 为名字
MySQL> ALTER SYSTEM DROP ALL BROKER hdfs_broker;

2.部署hadoop

这个我就不在这里赘述了,{post_link Hadoop环境搭建 Hadoop环境搭建} 说了很多了,网上也有大把的教程。我这里要说明的几点:

(1) 我发现在使用远程仓库的时候,需要输入用户名密码,这个用户名密码,其实是hadoop服务器上的用户名密码,在创建用户的时候指定,和创建linux用户名密码一样
(2) 不同broke最好配置不同的用户名密码,这样一个登录的时候,不会踢掉另外的一个
(3) 新建的用户,在 hadoop 上要给与相应的读写权限
(4) 如果使用的是空的用户名密码,那么备份的时候,执行备份,显示成功,但是恢复的时候,总是卡在了 DOWNLOADING 过程中,可能出现 failed to get md5sum of file 问题。

下面是hadoop的命令,增加用户,修改用户对于文件夹的权限:

1
2
3
4
5
6
7
8
9
10
11
12
## 创建用户组 groupadd 选项 用户组
groupadd hadoop

## # 创建新用户hadoop,并添加入hadoop用户组
useradd -g hadoop hadoop
## 给hadoop设置密码
passwd hadoop

## 查看文件
hdfs dfs -ls /starrocks
## 递归修改权限
hadoop fs -chmod -R 777 /starrocks

3.创建远端仓库

我这里的hdfs文件地址:hdfs://192.168.1.94:9000/data,没有设置用户名密码,创建远端仓库oss_repo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
--- 创建仓库
CREATE REPOSITORY `hdfs_repo`
WITH BROKER `hdfs_broker`
ON LOCATION "hdfs://192.168.1.94:9000/starrocks"
PROPERTIES
(
"username" = "",
"password" = ""
);

--- 查看仓库
SHOW REPOSITORIES;
--- 删除仓库,删除仓库,不会删除远端仓库的数据
DROP REPOSITORY `repo_name`;

4.创建备份

目前不直接支持整库的备份,如果需要整库备份,需要将库内所有的表都写在这里。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
BACKUP SNAPSHOT [db_name].{snapshot_name}
TO `repository_name`
ON (
`table_name` [PARTITION (`p1`, ...)],
...

)
PROPERTIES ("key"="value", ...);
---- 取消备份,需要使用 use databases; 命令进入到某一个数据库中
CANCEL BACKUP;
---- 查看备份状态
SHOW BACKUP FROM database\G;

--- or 使用use切换到备份的数据之后
SHOW BACKUP \G;
--- 查看整个的备份情况
SHOW SNAPSHOT ON `hdfs_repo` WHERE SNAPSHOT = "snapshot_label22030101" AND TIMESTAMP = "2022-03-01-21-07-26-597"\G;

---- 查看快照信息
SHOW SNAPSHOT ON hdfs_repo;

(1) ON子句中标识需要备份的表和分区。如果不指定分区,则默认备份该表的所有分区。目前不直接支持整库的备份,如果需要整库备份,需要将库内所有的表都写在这里。

(2) Backup的PROPERTIES目前只支持以下两个属性:

"type" = "full":表示这是一次全量更新(默认),目前也只支持全量,可以省略;
"timeout" = "3600":任务超时时间,默认为一天,单位秒,默认时可省略。

(3) 执行备份命令后,集群首先会对涉及到的tablet进行一次快照,快照耗时很少,快照名称为我们Backup语句中指定的snapshot_name。之后的备份操作实际都是对这个快照进行操作。也即在快照之后,对表进行的导入、修改等操作都不再影响备份的结果。

(4) 当通过 SHOW BACKUP 或者 SHOW RESTORE 命令查看作业状态时,有可能会在 TaskErrMsg 一列中看到错误信息,但只要 State 列不为 CANCELLED,则说明作业依然在继续,这些 Task 有可能会重试成功。当然,有些 Task 错误,也会直接导致作业失败。

(5) 删除快照的时候,只需要在远端执行 hdfs dfs -rm -r 命令,删除文件就可以了。

我这里写一个简单的示例,全量备份hlgy的realtime数据表,其他的都是默认

1
2
3
4
5
6
--- 创建备份
BACKUP SNAPSHOT hdxs.siteinfo_220312_1715
TO `hdfs_repo`
ON (
`siteinfo`
);

问题

(1) Cannot truncate a file by broker
当我执行备份的时候,总是出现错误,Cannot truncate a file by broker,这个我也不知道是谁的问题,是hadoop的问题,还是starrocks的问题。

有人已经提了issue,似乎没有人回应,有人把他标记为了一个bug。

7.数据恢复

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
--- 数据导入
RESTORE SNAPSHOT [db_name].{snapshot_name}
FROM `repository_name`
ON (
`table_name` [PARTITION (`p1`, ...)] [AS `tbl_alias`],
...
)
PROPERTIES ("key"="value", ...);

---- 查看还原状态
SHOW RESTORE [FROM db_name]
---- 或者使用 use 命令切换到某一个数据库之后
SHOW RESTORE\G;
---- 取消还原
CANCEL RESTORE FROM db_name;
CANCEL RESTORE;

backup_timestamp” = “2022-02-22-16-45-08”:指定了恢复对应备份的哪个时间版本,必填。该信息可以通过SHOW SNAPSHOT ON repo;语句获得,如下示例:

1
2
3
4
5
6
7
8
9
RESTORE SNAPSHOT hdxs.siteinfo_220312_1715
FROM `hdfs_repo`
ON (
`siteinfo`
)
PROPERTIES (
"backup_timestamp"="2022-03-12-17-16-44-124",
"replication_num" = "1"
);

注意事项
1.目前主键模型(Primary Key)的表目前不支持备份与恢复。
2.目前备份的快照数据无法在StarRocks上使用命令删除,DROP REPOSITORY命令只是删除StarRocks与远端存储的连接,已经存在于远端存储中的文件需要我们登录OSS等进行手动删除。
3.一个 Database 内,只允许有一个正在执行的备份或恢复作业。
4.备份(Backup)操作或还原(Restore)可操作的最小单位是分区,最大单位是表,还不直接支持整库的备份或还原。当前也只支持全量备份,还未支持增量。所以如果需要对数据进行定期备份,我们需要在建表时合理规划表的分区,例如按时间分区,然后在后续业务中,按照分区粒度进行备份或还原。
5.最后也是最重要,不要一次备份或还原大量的表和数据,当表的数据量很大时,可以按照分区拆分任务进行,个人建议单次任务不要超过10G,以避免失败重试的时间成本。同时,在前期也要注意合理建表,规范分区分桶,尤其是分桶数,不要过多,当一个表涉及的tablet过多时,即使总数据量很小,依然可能需要备份或恢复较长时间。

问题

(1) failed to get md5sum of file
恢复过程中出现的问题,暂时没解决。

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。