从数据库设计到性能调优,全面掌握openGemini应用开发最佳实践
本文分享自华为云社区《DTSE Tech Talk × openGemini :从数据库设计到性能调优,全面掌握openGemini应用开发最佳实践》,作者:华为云开源。
在本期《从数据库设计到性能调优,全面掌握openGemini应用开发最佳实践》的主题直播中,华为云开源DTSE技术布道师&openGemini社区发起人Shawn,通过解析数据库应用开发的一般流程与开发者们分享了熟悉业务场景是做好数据库设计的关键这一重要观点,并分别向大家介绍了openGemini库和表设计、数据写入、数据查询的最佳实践,希望能让开发者们从优秀实践中获得新的启发和提升。
熟悉业务场景是做好数据库设计的关键
任何数据库都不是万能的,熟悉业务场景是做好数据库设计非常关键的一环,同时,当了解清楚业务场景再去做数据库选型时会给你带来很大的帮助。做数据库选型之前,大家可以按照以下8条去做细致的评估:
- 数据分类
- 应用分类
- 采集频率(s)
- 时间线评估
- 每分钟写入数据量
- 采集的指标
- 业务查询场景
- 数据保留周期
openGemini库和表设计最佳实践
当把业务场景都了解清楚过后,便可以做库和表的设计了。Shard是openGemini的数据分片概念,openGemini支持shard延时加载,也就有了有活动shard和历史shard的区别。每个shard有自己的索引和缓存,增加DB,或者增加RP,都会增加同等数量的shard,也就增大了数据处理的并发度。个人建议在使用openGemini时采用多个库,适度增加DB数量,有利于系统资源得到充分利用,并提升性能。
当机器规格一定时,支持的shard数量是有上限的
粗略的评估方法:shard数量 <= 总量内存 * 0.25 / 60M
Shard数量受本地磁盘性能限制,因为不同shard之间存在磁盘带宽和I/O的竞争。
shard或表过多,容易对系统性能造成影响:
- DB/RP越多,shard越多,占用内存资源会越大,磁盘I/O竞争越大
- 表越多,数据文件越多,占用操作系统句柄资源越多
- Shard和表越多,元数据越多,ts-sql和ts-store与ts-meta之间同步元数据时延大,会造成数据读写性能波动
表的设计原则:
- 建表要结合查询场景做综合考虑
- 建表要充分考虑指标列数量,大于1000列,建议开始分表
openGemini数据写入最佳实践
现在跟大家分享一下客户端写数据最佳实践的注意事项:
- 客户端批量写入,减少网络交互
- 客户端并发写入,确保多批次数据之间时间线不存在交叉,减少乱序数据的产生
- BatchSize指一次批量写入的数据大小,需多次实验,找到最为合适的值
- ts-sql并发分发数据能力是一定的,增加sql数量才能处理更多数据
- 写入并发比较大的情况下,可以适当减小BatchSize,否则ts-store容易造成数据堆积
写性能的内核参数调优:正常情况下,业务的写QPS是趋于稳定的,当出现比较大的波动时,引起原因可能是:数据量增大导致wal时延增加、磁盘IO瓶颈、数据缓存堆积、Compaction阻塞等。
openGemini数据查询最佳实践
时间线比较多时(百万以上),如下查询场景要慎用,可能引发进程OOM:
- 全量时间线扫描,无TAG过滤
- 海量分组:TAG+Time | 细粒度Time
- 海量数据在ts-sql聚合场景(除first/last/count/sum/mean/min/max外)
- 海量时间线查询, tag1=xxx 可能对应百万时间线
openGemini 查询语句使用Tips:
1、查询返回的数据量比较多时,推荐添加查询参数:chunked=true&chunk_size=1000 ,可分批流式返回
例如:
curl -XPOST 'http://localhost:8086/query?db=mydb& chunked=true & chunk_size=1000 ' --data-urlencode 'q=SELECT * FROM mst'
2、在openGemini集群中,一条时间线数据只属于一个数据节点,因此在做简单查询时,可以使用Hint查询,直接定位到具体数据节点查询数据。
语法: /*+ full_series */
约束:查询条件必须包含所有的TAG
例如:
SELECT /*+ full_series */ mean(C) FROM mst WHERE A=“a1” AND B=“b1” AND time > xxx AND time < xxx
3、嵌套查询要遵循的原则:处在最里层的子查询尽可能通过TAG或者时间过滤数据,减少结果数据总量
例如:
SELECT * FROM
(SELECT temperature FROM disk_temp_monitor WHERE time > xxx AND time < xxx AND nd=“xxx” AND disk_type = SATA_HDD )
WHERE disk_type = SATA_HDD GROUP BY * LIMIT 1000
本次分享到这里就结束了,openGemini社区旨在打造开放、合作、包容的全球性技术社区,欢迎大家试用openGemini时序数据库,加入开源社区。
openGemini开源地址:https://github.com/openGemini
openGemini官网地址:https://opengemini.org
openGemini是一款开源分布式时序数据库,主要聚焦于海量时序数据的存储和分析,通过技术创新,简化业务系统架构,降低存储成本,提升时序数据的存储和分析效率。
HDC 2024,6月21日-23日,东莞松山湖,期待与您相见!
更多详情请参见大会官网:
中文:https://developer.huawei.com/home/hdc
英文:https://developer.huawei.com/home/en/hdc
从数据库设计到性能调优,全面掌握openGemini应用开发最佳实践的更多相关文章
- 【性能调优】:记录一次数据库sql语句性能调优过程
一,依旧很简单的一个接口,查询列表接口,发现10并发单交易场景下,数据库表4w铺底数据,每次查询2000条数据进行orderby显示,平均响应时间2秒以上,数据库的cpu使用率高达95%: 二,抓到这 ...
- linux性能调优概述
- 什么是性能调优?(what) - 为什么需要性能调优?(why) - 什么时候需要性能调优?(when) - 什么地方需要性能调优?(where) - 什么人来进行性能调优?(who) - 怎么样 ...
- Redis基础、高级特性与性能调优
本文将从Redis的基本特性入手,通过讲述Redis的数据结构和主要命令对Redis的基本能力进行直观介绍.之后概览Redis提供的高级能力,并在部署.维护.性能调优等多个方面进行更深入的介绍和指导. ...
- Redis 基础、高级特性与性能调优
本文将从Redis的基本特性入手,通过讲述Redis的数据结构和主要命令对Redis的基本能力进行直观介绍.之后概览Redis提供的高级能力,并在部署.维护.性能调优等多个方面进行更深入的介绍和指导. ...
- 程序员必须掌握的性能调优 X Y Z
热评博文:<如何设计出优美的Web API?>,现阅读量超 2500,小伙伴们不要错过哦! 2003 ~ 2008 年,这五年老兵哥我在通信行业做实习生和开发岗,主要用 C / C++ / ...
- EBS的性能调优
metalink Tuning performance on eBusiness suite (Doc ID 744143.1) 这篇文档描述了如何调查电子商务套件的整体性能下降. ...
- Apache Pulsar 在 BIGO 的性能调优实战(上)
背景 在人工智能技术的支持下,BIGO 基于视频的产品和服务受到广泛欢迎,在 150 多个国家/地区拥有用户,其中包括 Bigo Live(直播)和 Likee(短视频).Bigo Live 在 15 ...
- MySQL性能调优与架构设计——第10章 MySQL数据库Schema设计的性能优化
第10章 MySQL Server性能优化 前言: 本章主要通过针对MySQL Server(mysqld)相关实现机制的分析,得到一些相应的优化建议.主要涉及MySQL的安装以及相关参数设置的优化, ...
- MySQL性能调优与架构设计——第9章 MySQL数据库Schema设计的性能优化
第9章 MySQL数据库Schema设计的性能优化 前言: 很多人都认为性能是在通过编写代码(程序代码或者是数据库代码)的过程中优化出来的,其实这是一个非常大的误区.真正影响性能最大的部分是在设计中就 ...
- MySQL性能调优与架构设计——第8章 MySQL数据库Query的优化
第8章 MySQL数据库Query的优化 前言: 在之前“影响 MySQL 应用系统性能的相关因素”一章中我们就已经分析过了Query语句对数据库性能的影响非常大,所以本章将专门针对 MySQL 的 ...
随机推荐
- ElasticSearch 7.7 + Kibana的部署
ElasticSearch目前最新版是7.7.0,其中部署的细节和之前的6.x有很多的不同,所以这里单独拉出来写一下,希望对用7.x的童鞋有一些帮助,然后部署完ES后配套的kibana也是7.7.0, ...
- 【Oracle】在PL/SQL中使用sql实现插入排序
[Oracle]在PL/SQL中使用sql实现插入排序 一般来说,SQL要排序的话直接使用order by即可 不一般来说,就是瞎搞,正好也可以巩固自己的数据结构基础,主要也发现没有人用SQL去实现这 ...
- 力扣283(java)-移动零(简单)
题目: 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序. 请注意 ,必须在不复制数组的情况下原地对数组进行操作. 示例 1: 输入: nums = [0, ...
- 极致体验!基于阿里云 Serverless 快速部署 Function
简介: 云计算的不断发展,涌现出很多改变传统 IT 架构和运维方式的新技术,而以虚拟机.容器.微服务为代表的技术更是在各个层面不断提升云服务的技术能力,它们将应用和环境中很多通用能力变成了一种服务.但 ...
- 阿里云EMAS移动测试,帮您快速掌握移动端兼容性测试技巧
简介: 兼容性测试用于验证应用在不同设备上进行安装/启动/登录/不同版本覆盖安装/卸载等操作时,是否存在兼容性问题:如界面适配问题.应用性能等,现阿里云EMAS套餐免费试用,帮您快速掌握移动端兼容性测 ...
- Hexo博客框架—轻量、一令部署
简介:Hexo 是一个快速.简洁且高效的博客框架.Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页.Hexo支持Github Flavored M ...
- 时序数据库永远的难关 — 时间线膨胀(高基数 Cardinality)问题的解决方案
简介: 本文主要讨论 influxdb 在遇到写入的数据出现高基数 Cardinality 问题时,一些可行的解决方案. 作者 | 徐建伟 (竹影) 前序 随着移动端发展走向饱和,现在整个 IT 行 ...
- WPF 不安装 WindowsAppSDK 使用 WinRT 功能的方法
安装 Microsoft.WindowsAppSDK 库会限制应用程序只能分发 windows 10 应用,如果自己的应用程序依然需要兼容 Win7 等旧系统,那直接采用安装 WindowsAppSD ...
- foreach更改element内容后this到data不生效导致页面数据无变化
list.forEach(element => { element = element.split('^') console.log(element) }) 数据已经被更改,但在外部t ...
- cesium教程8-官方示例翻译-图层亮度对比度调整
完整示例代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="u ...