摘要:GaussDB(for Cassandra) 提供了大key和热key的实时检测,以帮助业务进行合理的schema设计,规避业务稳定性风险。

本文分享自华为云社区《GaussDB (for Cassandra) 数据库治理 -- 大key与热key问题的检测与解决》,作者:Cassandra官方 。

Cassandra数据库是一个高度可扩展的高性能分布式数据库,面向大数据场景,可用于管理大量的结构化数据。在业务使用的过程中,随着业务量和数据流量的持续增长,往往一些业务的设计弊端逐渐暴露出来,降低了集群的稳定性和可用性。比如主键设计不合理,单个分区的记录数或数据量过大,出现超大分区键,引起了节点负载不均,集群稳定性会下降,这一类问题称为大key问题。当某一热点key的请求在某一主机上的访问超过server极限时,会导致热点Key问题的产生。往往大key是造成热key问题的间接原因。

GaussDB(for Cassandra)是一款基于华为自研的计算存储分离架构的分布式数据库,兼容Cassandra生态的云原生NoSQL数据库,支持类SQL语法CQL。在华为云高性能、高可用、高可靠、高安全、可弹性伸缩的基础上,提供了一键部署、快速备份恢复、计算存储独立扩容、监控告警等服务能力。针对以上问题,GaussDB(for Cassandra) 提供了大key和热key的实时检测,以帮助业务进行合理的schema设计,规避业务稳定性风险。

大key的分析与解决

大key的产生,最主要的原因是主键设计不合理,使得单个分区的记录数或数据量过大。一旦某一个分区出现极大时,对该分区的访问,会造成分区所在server的负载变高,甚至造成节点OOM等。
针对大key问题,一般采取两种修复手段,一种是增加缓存,优化表结构。一种是基于现有分区键,增加分区键散列。对数据进行打散,避免单个分区的记录过大。GaussDB(for Cassandra) 有如下整改事例,业务整改后负载平稳运行。

案例1:

XX集群的数据量过大,导致集群存在大分区键(排查数量大概为2000+),最大的分区键达到38G。当业务频繁访问这部分大的分区键时,会导致节点持续高负载,影响业务请求成功率。

表结构如下

CREATE TABLE movie (
movieid text,
appid int,
uid bigint,
accessstring text,
moviename text,
access_time timestamp,
PRIMARY KEY (movieid, appid, uid, accessstring, moviename)
)

表设计分析

movie表保存了短视频的相关信息,分区键为movieid,并且保存了用户信息(uid),如果movieid是一个热门短视频,有几千万甚至上亿用户点赞此短视频,则该热门短视频所在的分区非常大(当前发现有38G)。

解决方法:

1. 优化表结构

创建新表保存热门短视频信息,只保留短视频公共信息,不包含用户信息,确保该表不会产生大的分区键。热门短视频信息写入该表中。

CREATE TABLE hotmovieaccess (
movieid text,
appid int,
accessstring text,
access_time timestamp,
PRIMARY KEY (movieid, appid)
)

2. 增加缓存

增加缓存,业务应用先从缓存中读取热门文件信息,没有查询到,则从数据库中查询,减少数据库查询次数。

整个优化逻辑如下:

  1. 先查缓存,当缓存存在,直接返回结果。
  2. 当缓存不存在,查询热门视频缓存(缓存不存在,则查询hot表),当视频为为热门视频时,查询hotmovieaccess表。
  3. 当hotmovieaccess表存在结果时,直接返回,当hotmovieaccess表不存在记录时,查询movie表。
  4. 并缓存查询结果。

案例2:

movie_meta以月度建表,每个表只存当月的数据,初始的这种设计是可以减轻或规避分区键过大问题的。由于业务频繁写入,热门视频存储的记录非常多,还是形成了大的数据分区。

CREATE TABLE movie_meta202110 (
path text,
moviename text,
movieid text,
create_time timestamp,
modify_mtime timestamp,
PRIMARY KEY (path, moviename)
)

解决办法:

新分区键增加一个随机数(0~999):将原来一个分区存储的信息随机离散存储到1000个分区中。

采用新的分区键之后,没有形成新超过100M的分区键,旧的超过100M的分区键数据,随着时间老化过期即可。

大key的定义与检测手段

通过长时间的业务观察,我们规定以下阈值,超过任何一个条件的阈值即为大key:

  1. 单个分区键的行数不能超过10万
  2. 单个分区的大小不超过100MB

GaussDB(for Cassandra) 支持了大key的检测与告警。在CES界面,可以配置实例的大key告警。当发生大key事件时,会第一时间通知。及时整改,可避免业务波动。

大key告警字段解释

[
{
"partition_size": "1008293497", //超大分区键的总大小
"timestamp": "2021-09-08 07:08:18,240", //大key产生时间
"partition_num": "676826", //超大分区键的总行数
"keyspace_name": "ssss", //keyspace名称
"table_name": "zzzz", //表名称
"table_id": "024a1070-0064-11eb-bdf3-d3fe5956183b", //表id
"partition_key": "{vin=TESTW3YWZD2021003}" //分区键
}
]

热key的危害与解决

在日常生活中,经常会发生各种热门事件,应用中对该热点新闻进行上万次的点击浏览和评论时,会形成一个较大的请求量,这种情况下会造成短时间内对同一个key频繁操作,会导致key所在节点的CPU和load飙高,从而影响落在该节点的其他请求。导致业务成功率下降。诸如此类的还有热门商品促销,网红直播等场景,这些典型的读多写少的场景也会产生热点问题。

热key会造成以下危害:

  1. 流量集中,达到物理网卡上限。
  2. 请求过多,缓存分片服务被打垮。
  3. DB击穿,引起业务雪崩。

GaussDB(for Cassandra) 针对热key问题,常见的修复手段如下:

  1. 设计上需要考虑热key的问题,避免在数据库上产生热key
  2. 业务侧通过增加缓存来减少热key出现的情况下对数据库造成的冲击。考虑多级缓存解决热key问题(如Redis + 本地二级缓存)
  3. 屏蔽热点key, 比如在业务侧进行定制, 支持热key黑白名单能力,可以将热key临时屏蔽。

热key的检测

我们定义访问频率 大于 100000 次/min 的key为热key。热key事件分为两种类型,一种时WRITES事件,代表写热点,一种是READS事件,表示读热点。

GaussDB(for Cassandra) 也提供了热key的监测与告警。在CES界面,可以配置实例的热key告警。如下

热key告警字段解释:

{
"sampler_type": "WRITES", // 采样类型。取值有WRITES, READS; WRITES代表写,READS代表读。
"partition_num": "2969", // 分区键的热点次数
"keyspace_name": "performance", // keyspace名称
"table_id": "a10f3bb0-3626-11ec-bbdf-63e05bbb4391", // 表id
"table_name": "stresstable", // 表名
"partition_key": "85897376" // 产生热点分区键的值
}

GaussDB(for Cassandra) 提供了大key和热key的实时监控。确保第一时间感知业务风险。提供的大key和热key解决方案,在面对大数据量洪峰场景,增强了集群的稳定性与可用性。为客户业务持续稳定运行保驾护航。

综上,在线业务在使用Cassandra时,必须执行相关的开发规则和使用规范,在开发设计阶段就降低使用风险。一般按照 制定规范 --> 接入评审 --> 定期巡检 --> 优化规则 的治理流程进行。合理的设计一般会降低大部份风险发生的概率,对于应用来说,任何表的设计都要考虑是否会造成热key,大key的产生,是否会造成负载倾斜的问题;另外建立数据老化机制,表中的数据不能无限制的增长而不删除或者老化;针对读多写少的场景,要增加缓存机制,来应对读热点问题,并提升查询性能;对于每个PK以及每行Row的大小,要控制大小,否则将影响性能和稳定性。超出后要及时优化。

点击关注,第一时间了解华为云新鲜技术~

GaussDB (for Cassandra) 数据库治理:大key与热key问题的检测与解决的更多相关文章

  1. 浅谈Redis大Key与热Key

    如何定义大 Key 和 热 Key 如何定义大 Key 如何定义热 Key 大 Key 和 热 Key 产生的原因 大 Key 和 热 Key 有哪些危害 大 Key 的危害 热 Key 的危害 如何 ...

  2. 【原创】谈谈redis的热key问题如何解决

    引言 讲了几天的数据库系列的文章,大家一定看烦了,其实还没讲完...(以下省略一万字). 今天我们换换口味,来写redis方面的内容,谈谈热key问题如何解决. 其实热key问题说来也很简单,就是瞬间 ...

  3. 谈谈redis的热key问题如何解决

    引言 讲了几天的数据库系列的文章,大家一定看烦了,其实还没讲完...(以下省略一万字).今天我们换换口味,来写redis方面的内容,谈谈热key问题如何解决.其实热key问题说来也很简单,就是瞬间有几 ...

  4. 如何快速定位 Redis 热 key?

    背景 在 Redis 中,热 key 指的是那些在一段时间内访问频次比较高的键值,具体到业务上,商品的限时抢购.瞬时的新闻热点或某个全局性的资源,都极有可能产生热点 key. 热点 key 的出现可能 ...

  5. BAT经典面试题之redis的热KEY问题怎么解决

    引言 讲了几天的数据库系列的文章,大家一定看烦了,其实还没讲完...(以下省略一万字).今天我们换换口味,来写redis方面的内容,谈谈热key问题如何解决.其实热key问题说来也很简单,就是瞬间有几 ...

  6. 华为云数据库GaussDB(for Cassandra)揭秘第二期:内存异常增长的排查经历

    摘要:华为云数据库GaussDB(for Cassandra) 是一款基于计算存储分离架构,兼容Cassandra生态的云原生NoSQL数据库:它依靠共享存储池实现了强一致,保证数据的安全可靠. 本文 ...

  7. 【详细解析】MySQL索引详解( 索引概念、6大索引类型、key 和 index 的区别、其他索引方式)

    [详细解析]MySQL索引详解( 索引概念.6大索引类型.key 和 index 的区别.其他索引方式) MySQL索引的概念: 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分 ...

  8. LINUX下为ORACLE数据库设置大页--hugepage

    在Linux中配置hugepage可以提高oracle的性能,减少oracle sga的页交换,类似于aix中的lagepage. 为什么 使用大页? LINUX内存的默认块大小是4K如果SGA为:1 ...

  9. 阿里云资深DBA专家罗龙九:云数据库十大经典案例分析【转载】

    阿里云资深DBA专家罗龙九:云数据库十大经典案例分析 2016-07-21 06:33 本文已获阿里云授权发布,转载具体要求见文末 摘要:本文根据阿里云资深DBA专家罗龙九在首届阿里巴巴在线峰会的&l ...

  10. c#几种数据库的大数据批量插入(SqlServer、Oracle、SQLite和MySql)

    这篇文章主要介绍了c#几种数据库的大数据批量插入(SqlServer.Oracle.SQLite和MySql),需要的朋友可以了解一下. 在之前只知道SqlServer支持数据批量插入,殊不知道Ora ...

随机推荐

  1. Util应用框架核心(一) - 服务配置

    本文介绍在项目中如何配置 Util 依赖服务. 文章分为多个小节,如果对设计原理不感兴趣,只需要阅读基础用法部分即可. 基础用法 Asp.Net Core 项目服务配置 调用 WebApplicati ...

  2. 练习回—编译安装nginx

    练习回 练习,编译安装nginx. 1.yum安装依赖环境 yum -y install pcre-devel zlib-devel gcc gcc-c++ make 2."下载" ...

  3. JUC并发编程学习(十三)ForkJoin

    ForkJoin 什么是ForkJoin ForkJoin在JDK1.7,并发执行任务!大数据量时提高效率. 大数据:Map Reduce(把大任务拆分成小任务) ForkJoin特点:工作窃取 为什 ...

  4. 当代免疫学小史-第一章(根据讲谈社Blue Backs系列2009年第一版第三次印刷版本翻译)

    作者 -岸本忠三:前大阪大学校长.IL-6发现人 -中嶋彰:科普作家 第1章 石坂往事 巴尔的摩的大雪 1970年匆匆而过,这一年举行了大阪世博会,三岛由纪夫也是在这一年切腹自杀的.1971年新年第一 ...

  5. 从零开始学习Python

    从零开始学习Python是一个令人兴奋和有趣的过程.无论你是完全没有编程经验,还是已经熟悉其他编程语言,Python都可以成为你迈向程序员之路的理想起点. 首先,在开始学习之前,请确保在计算机上安装了 ...

  6. C/S结构用户界面设计

    C/S结构用户界面设计 [实验编号] 10003809547j  图形用户界面设计 [实验学时] 8学时 [实验环境] l 所需硬件环境为微机: l 所需软件环境为Microsoft Visual S ...

  7. 31. 干货系列从零用Rust编写正反向代理,HTTP限流的实现(limit_req)

    wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透,后续将实现websocket代 ...

  8. Markdown语法入门与进阶指南

    一.Markdown简介 Markdown是一种轻量级标记语言,创始人为约翰·格鲁伯(john Gruber).它允许人们使用易读易写的纯文本格式编写文档,然后转换成有效的XHTML(或者HTML)文 ...

  9. MybatisPlus高级特性之ActiveRecord模式

    1.是什么? ActiveRecord是一种领域模型模式,特点是一个模型类对应关系型数据库中的一个表:而模型类的一个实例对应表中的一行记录.ActiveRecord 一直广受解释型动态语言 ( PHP ...

  10. flask上下文、g变量、current_app

    在flask中的上下文分为两种 : 请求上下文 (request context) 也就是和请求相关的上下文,记录一些请求相关的数据. 包含: 1.request请求对象 2.session会话 应用 ...