StarRocks数据库运维
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.数据模型介绍 官方的数据模型介绍
优化
1.mysql中如何创建int
2.增加列
1 | ALTER TABLE tablename ADD COLUMN column_name column_type [KEY | agg_type] [DEFAULT "default_value"] [AFTER column_name|FIRST] [PROPERTIES ("key"="value", ...)]; |
其中,方括号表示可选,竖杠表示或。这里注意:
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 | CREATE EXTERNAL TABLE mysql_external_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 | ## 修改mysql的认证方式 |
1.远程连接MYSQL错误“PLUGIN CACHING_SHA2_PASSWORD COULD NOT BE LOADED”的解决办法 修改默认的认证方式
2.MySQL8.0新特性——默认使用caching_sha2_password作为身份验证插件
3.MySQL8.0的caching_sha2_password问题
5.数据导出
1.第4.1章:StarRocks数据导出–导出总览
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.部署hadoop
这个我就不在这里赘述了,{post_link Hadoop环境搭建 Hadoop环境搭建} 说了很多了,网上也有大把的教程。我这里要说明的几点:
(1) 我发现在使用远程仓库的时候,需要输入用户名密码,这个用户名密码,其实是hadoop服务器上的用户名密码,在创建用户的时候指定,和创建linux用户名密码一样
(2) 不同broke最好配置不同的用户名密码,这样一个登录的时候,不会踢掉另外的一个
(3) 新建的用户,在 hadoop 上要给与相应的读写权限
(4) 如果使用的是空的用户名密码,那么备份的时候,执行备份,显示成功,但是恢复的时候,总是卡在了 DOWNLOADING 过程中,可能出现 failed to get md5sum of file 问题。
下面是hadoop的命令,增加用户,修改用户对于文件夹的权限:
1 | ## 创建用户组 groupadd 选项 用户组 |
3.创建远端仓库
我这里的hdfs文件地址:hdfs://192.168.1.94:9000/data,没有设置用户名密码,创建远端仓库oss_repo:
1 | --- 创建仓库 |
4.创建备份
目前不直接支持整库的备份,如果需要整库备份,需要将库内所有的表都写在这里。
1 | BACKUP SNAPSHOT [db_name].{snapshot_name} |
(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 | --- 创建备份 |
1.Doris数据备份与恢复
问题
(1) Cannot truncate a file by broker
当我执行备份的时候,总是出现错误,Cannot truncate a file by broker,这个我也不知道是谁的问题,是hadoop的问题,还是starrocks的问题。
有人已经提了issue,似乎没有人回应,有人把他标记为了一个bug。
7.数据恢复
1 | --- 数据导入 |
backup_timestamp” = “2022-02-22-16-45-08”:指定了恢复对应备份的哪个时间版本,必填。该信息可以通过SHOW SNAPSHOT ON repo;语句获得,如下示例:
1 | RESTORE SNAPSHOT hdxs.siteinfo_220312_1715 |
注意事项
1.目前主键模型(Primary Key)的表目前不支持备份与恢复。
2.目前备份的快照数据无法在StarRocks上使用命令删除,DROP REPOSITORY命令只是删除StarRocks与远端存储的连接,已经存在于远端存储中的文件需要我们登录OSS等进行手动删除。
3.一个 Database 内,只允许有一个正在执行的备份或恢复作业。
4.备份(Backup)操作或还原(Restore)可操作的最小单位是分区,最大单位是表,还不直接支持整库的备份或还原。当前也只支持全量备份,还未支持增量。所以如果需要对数据进行定期备份,我们需要在建表时合理规划表的分区,例如按时间分区,然后在后续业务中,按照分区粒度进行备份或还原。
5.最后也是最重要,不要一次备份或还原大量的表和数据,当表的数据量很大时,可以按照分区拆分任务进行,个人建议单次任务不要超过10G,以避免失败重试的时间成本。同时,在前期也要注意合理建表,规范分区分桶,尤其是分桶数,不要过多,当一个表涉及的tablet过多时,即使总数据量很小,依然可能需要备份或恢复较长时间。
问题
(1) failed to get md5sum of file
恢复过程中出现的问题,暂时没解决。