- 最新动态
- 功能总览
- 服务公告
- 产品介绍
-
GeminiDB Redis接口
- 产品介绍
- 计费说明
- 快速入门
-
用户指南
- 权限管理
- 购买GeminiDB Redis实例
- 实例连接及管理
-
数据迁移
- Redis数据迁移方案概览
- 使用DRS服务将GeminiDB Redis迁移到Redis(推荐)
- 阿里云数据库Redis/Tair到GeminiDB Redis的迁移
- 腾讯云Redis到GeminiDB Redis的迁移
- 使用DRS服务将自建Redis或者Redis集群迁移到GeminiDB Redis(推荐)
- 通过Redis-Shake迁移工具将自建Redis迁移到GeminiDB Redis
- 使用Redis-Shake工具将RDB文件/AOF文件 导入到GeminiDB Redis
- 使用数据导入功能将RDB文件恢复到GeminiDB Redis(推荐)
- Kvrocks到GeminiDB Redis的迁移
- Pika到GeminiDB Redis的迁移
- SSDB到GeminiDB Redis的迁移
- LevelDB到GeminiDB Redis的迁移
- RocksDB到GeminiDB Redis的迁移
- AWS ElasticCache for Redis数据库到GeminiDB Redis的迁移
- 迁移后Redis数据一致性校验
- 实例管理
- 变更实例
- 数据备份
- 数据恢复
- 诊断分析
- 账号与安全
- 参数管理
- 日志与审计
- 查看监控指标与配置告警
- GeminiDB Redis标签管理
- GeminiDB Redis用户资源配额
- 通过GeminiDB Redis实现MySQL内存加速
- 开发参考
- 最佳实践
- 性能白皮书
-
常见问题
- 高频常见问题
-
产品咨询
- GeminiDB Redis和开源Redis、其他开源Redis云服务有什么区别?
- 和开源Redis相比,GeminiDB Redis性能如何?
- GeminiDB Redis兼容Redis哪些版本,兼容哪些命令,客户端连接是否需要修改
- 自建Redis是否可以搬迁至GeminiDB Redis,需要注意什么
- 什么是GeminiDB Redis实例可用性
- GeminiDB Redis实例总容量是总内存吗,内存和容量之间是什么联系
- 购买GeminiDB Redis实例时,如何选择合适的节点规格和节点数量?
- 购买x GB的GeminiDB Redis的实例,优选主备还是集群?
- GeminiDB Redis持久化机制是怎样的,会丢数据吗
- GeminiDB Redis的内存淘汰策略是什么
- GeminiDB Redis是否支持布隆过滤器等modules
- 计费相关
-
数据库使用
- scan指定match参数,数据中确实存在匹配的key,为什么返回的是空
- 业务侧原本做了数据分片,切换到GeminiDB Redis后如何处理这部分逻辑
- GeminiDB Redis接口是否支持keys命令的模糊查询
- GeminiDB Redis是否支持多DB
- 对于scan类的操作,GeminiDB Redis接口与开源Redis 5.0的返回值顺序为什么有差异
- 针对某些不合法命令,GeminiDB Redis接口与开源Redis 5.0的报错信息为什么有差异
- 如何处理报错:CROSSSLOT Keys in request don't hash to the same slot
- GeminiDB Redis单次事务推荐包含的命令条数
- GeminiDB Redis集群版实例中,哪些命令需要使用hashtag
- 如何处理报错“ERR unknown command sentinel"
- 对于阻塞命令,GeminiDB Redis接口(主备实例)与开源Redis的返回值为什么可能有差异
- GeminiDB Redis存储扩容需要多久,对业务有影响吗?
- GeminiDB Redis多个节点同时扩容需要多长时间,对业务影响如何?
- GeminiDB Redis规格变更包含的在线变更和离线变更有什么区别,通常需要多长时间,对业务有哪些影响?
- GeminiDB Redis版本补丁升级包含的在线升级和离线升级有什么区别,通常需要多长时间,对业务有哪些影响?
- GeminiDB Redis备份文件是否可以下载到本地,是否支持线下恢复数据
- GeminiDB Redis数据备份工作机制是怎样的,对业务有哪些影响?
- 购买GeminiDB Redis 1U*2节点特惠型实例后,业务访问量比较少,但CPU占用率比较高,是什么原因?
- GeminiDB Redis监控面板上key数量下降又恢复至正常数量是什么原因?
- GeminiDB Redis节点CPU偶发冲高,可能是哪些原因
- GeminiDB Redis如何从5.0版本升级到6.2版本
- GeminiDB Redis什么时候进入只读
-
数据库连接
- 如何接入GeminiDB Redis
- 如何使用GeminiDB Redis提供的多个节点IP地址
- GeminiDB Redis提供的ELB的实现方式是怎样的
- 如何创建和连接弹性云服务器
- GeminiDB Redis实例购买成功后是否支持更换VPC
- 绑定了弹性公网IP但是连接不上数据库
- 内网如何访问GeminiDB Redis
- GeminiDB Redis自带的负载均衡地址是否能绑定公网IP?如何通过公网连接GeminiDB Redis实例?
- 设置了安全组,还需要设置负载均衡内网访问控制吗?
- 如何处理客户端连接池报错“Could not get a resource from the pool”
- 常见客户端报错及解决方法
- 备份与恢复
- 区域和可用区
-
数据迁移
- DRS上找不到GeminiDB Redis链路
- 报错ERR the worker queue is full, and the request cannot be excecuted
- 报错ERR the request queue of io thread is full, and the request cannot be excecuted
- 报错 read error, please check source redis log or network
- 报错 slaveping_thread.cc-ThreadMain-90: error: Ping master error
- 同步状态正向迁移速度太慢
- 同步状态正向迁移速度太快,报错:ERR server reply timeout, some responses may lose, but requests have been executed
- 4.0、5.0以及6.2版本的自建Redis能迁移至GeminiDB Redis吗?
- 自建Redis主备、集群实例如何迁移到GeminiDB Redis?
- 为什么阿里云Redis、腾讯云Redis等云服务不能使用DRS进行数据迁移?
- 自建主备Redis,迁移到GeminiDB Redis集群,需要考虑哪些因素?
- 迁移完成后数据量变少了,100GB的数据迁移到GeminiDB Redis只有20-30GB,数据是不是没迁移完?
- 内存加速
- 资源冻结/释放/删除/退订
- GeminiDB Influx接口
-
GeminiDB Cassandra接口
- 产品介绍
- 计费说明
- 快速入门
-
用户指南
- 权限管理
- 购买GeminiDB Cassandra实例
- 实例连接及管理
- 数据迁移
- 实例生命周期管理
- 变更实例
- 同城容灾
- 异地双活
- 数据备份
- 数据恢复
- 参数管理
- 日志与审计
- 查看监控指标与配置告警
- 企业项目
- GeminiDB Cassandra标签管理
- GeminiDB Cassandra用户资源配额
- 最佳实践
- 性能白皮书
- 常见问题
- GeminiDB (兼容DynamoDB API)实例
- HBase协议兼容版实例
- GeminiDB Mongo接口
- 技术白皮书
-
API参考
- 使用前必读
- API概览
- 如何调用API
- 快速入门
-
API v3(推荐)
- 查询API版本
- 接口版本和规格
-
实例管理
- 创建实例
- 删除实例
- 查询实例列表和详情
- 扩容实例存储容量
- 扩容实例的节点数量
- 缩容实例的节点数量
- 获取节点会话列表
- 查询实例节点会话统计信息
- 关闭实例节点会话
- 查询实例可变更规格
- 变更实例规格
- 修改实例的管理员密码
- 修改实例名称
- 变更实例安全组
- 数据库补丁升级
- 批量数据库补丁升级
- 创建冷数据存储
- 扩容冷数据存储
- 绑定/解绑弹性公网IP
- 切换实例SSL开关
- 重启实例
- 设置磁盘自动扩容策略
- 修改数据库端口
- 判断弱密码
- 修改副本集跨网段访问配置
- 删除扩容失败的节点
- 查询创建实例或扩容节点时需要的IP数量
- 查询磁盘自动扩容策略
- 变更实例存储容量
- 查询高危命令
- 修改高危命令
- 查询Redis实例的热key
- 设置Redis禁用命令
- 查询Redis禁用命令
- 删除Redis禁用命令
- 设置实例可维护时间段
- Redis主备切换
- 支持节点的开关机
- 查询GeminiDB Redis实例的大key
- 获取GeminiDB Redis的免密配置
- 支持修改GeminiDB Redis的免密配置
- 查询内存加速映射列表和详情
- 创建内存加速规则
- 解除内存加速映射
- 创建内存加速映射
- 修改内存加速规则
- 查询内存加速规则列表和详情
- 删除内存加速规则
- 开启/关闭实例数据导出
- 开启/关闭秒级监控
- 查询秒级监控配置
- 连接管理
- 备份与恢复
- 参数模板管理
- 管理数据库和账号
- 标签管理
- 日志管理
- 配额管理
- 容灾管理
- 任务管理
- 企业项目管理
- 实例负载均衡管理
- API v3(即将下线)
- 权限策略和授权项
- 附录
- SDK参考
- 场景代码示例
- 视频帮助
- 文档下载
- 通用参考
链接复制成功!
如何检测和解决大key与热key问题
Cassandra数据库是一个高度可扩展的高性能分布式数据库,面向大数据场景,可用于管理大量的结构化数据。在业务使用的过程中,随着业务量和数据流量的持续增长,往往一些业务的设计弊端逐渐暴露出来,降低了集群的稳定性和可用性。比如主键设计不合理,单个分区的记录数或数据量过大,出现超大分区键,引起了节点负载不均,集群稳定性会下降,这一类问题称为大key问题。当某一热点key的请求在某一主机上的访问超过服务器极限时,会导致热点Key问题的产生。往往大key是造成热key问题的间接原因。
GeminiDB Cassandra是一款基于华为自研的计算存储分离架构、兼容Cassandra生态的云原生分布式NoSQL数据库。针对以上问题,GeminiDB Cassandra 提供了大key和热key的实时检测,以帮助业务进行合理的Schema设计,规避业务稳定性风险。
大key问题
- 可能原因:
大key的产生,最主要的原因是主键设计不合理,使得单个分区的记录数或数据量过大。一旦某一个分区出现极大时,对该分区的访问,会造成分区所在服务器的负载变高,甚至造成节点内存溢出(OOM)等。
- 处理思路:
针对大key问题,一般采取如下两种处理思路。
- 增加缓存,优化表结构。
- 基于现有分区键,增加分区键散列。对数据进行打散,避免单个分区的记录过大。
- 检测方法:
通过长时间的业务观察,我们规定以下阈值,超过任何一个条件的阈值即为大key。
- 单个分区键的行数不能超过10万。
- 单个分区的大小不超过100MB。
GeminiDB Cassandra支持了大key的检测与告警。在CES界面,可以配置实例的大key告警,具体方法请参见设置告警规则。
当发生大key事件时,系统会第一时间发送预警通知,您可以前往CES界面查看监控事件数据,及时处理,避免业务波动。
图1 大key告警查看事件告警字段说明如下:
[ { "partition_size": "1008293497", //超大分区键的总大小 "timestamp": "2021-09-08 07:08:18,240", //大key产生时间 "partition_num": "676826", //超大分区键的总行数 "keyspace_name": "ssss", //keyspace名称 "node_id": "ae342330ded14605b6304e80e6a6efeeno06", //节点id "table_name": "zzzz", //表名称 "table_id": "024a1070-0064-11eb-bdf3-d3fe5956183b", //表id "partition_key": "{vin=TESTW3YWZD2021003}" //分区键 } ]
- 常见案例及解决方案:
案例1:某集群的数据量过大,导致集群存在大分区键(排查数量大概为2000+),最大的分区键达到38GB。当业务频繁访问这部分大的分区键时,会导致节点持续高负载,影响业务请求成功率。
该案例中表结构设计如下:
表设计分析:
上述movie表保存了短视频的相关信息,分区键为movieid,并且保存了用户信息(uid)。如果movieid是一个热门短视频,有几千万甚至上亿用户点赞此短视频,则该热门短视频所在的分区非常大(当前发现有38GB)。
解决方法:
针对上述案例中问题,可以通过如下方法解决。
- 优化表结构。
创建新表保存热门短视频信息,只保留短视频公共信息,不包含用户信息,确保该表不会产生大的分区键。热门短视频信息写入该表中。
- 增加缓存
业务应用先从缓存中读取热门文件信息,没有查询到,则从数据库中查询,减少数据库查询次数。
整体优化逻辑如下:
- 先查缓存,当缓存存在,直接返回结果。
- 当缓存不存在,查询热门视频缓存(缓存不存在,则查询hot表),当视频为为热门视频时,查询hotmovieaccess表。
- 当hotmovieaccess表存在结果时,直接返回。当hotmovieaccess表不存在记录时,查询movie表。
- 并缓存查询结果。
案例2:movie_meta以月度建表,每个表只存当月的数据,初始的这种设计是可以减轻或规避分区键过大问题的。由于业务频繁写入,热门视频存储的记录非常多,还是形成了大的数据分区。
解决方法:
新分区键增加一个随机数(0~999):将原来一个分区存储的信息随机离散存储到1000个分区中。采用新的分区键之后,没有形成新超过100MB的分区键,旧的超过100MB的分区键数据,随着时间过期即可。
- 优化表结构。
热key问题
- 热key的危害:
在日常生活中,经常会发生各种热门事件,应用中对该热点新闻进行上万次的点击浏览和评论时,会形成一个较大的请求量。这种情况下会造成短时间内对同一个key频繁操作,会导致key所在节点的CPU和负载突然升高,从而影响落在该节点的其他请求,导致业务成功率下降。诸如此类的还有热门商品促销,网红直播等场景,这些典型的读多写少的场景也会产生热点问题。
热key问题会产生如下危害:
- 流量集中,达到物理网卡上限。
- 请求过多,缓存分片服务被打垮。
- 数据库击穿,引起业务雪崩。
- 处理思路:
针对热key问题,一般采取如下处理思路。
- 设计上需要考虑热key的问题,避免在数据库上产生热key。
- 业务侧通过增加缓存来减少热key出现的情况。考虑多级缓存解决热key问题(如Redis + 本地二级缓存)
- 屏蔽热点key。 比如:在业务侧进行定制,支持热key黑白名单能力,可以将热key临时屏蔽。
- 检测方法:
我们定义访问频率大于100000 次/min的key为热key。
热key事件分为两种类型。一种是Writes事件,代表写热点,一种是Reads事件,表示读热点。
GeminiDB Cassandra提供了热key的监测与告警。在CES界面,可以配置实例的热key告警,具体方法请参见设置告警规则。
当发生热key事件时,系统会第一时间发送预警通知,您可以前往CES界面查看监控事件数据,及时处理,避免业务波动。
图2 热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" //产生热点分区键的值 }
总结
在线业务在使用Cassandra时,必须执行相关的开发规则和使用规范,在开发设计阶段就降低使用风险,合理的设计会降低大部分风险发生的概率。
- 任何表的设计都要考虑是否会造成热key或者大key的产生,是否会造成负载倾斜的问题。
- 建立数据过期机制,表中的数据不能无限制增长而不删除或者过期。
- 针对读多写少的场景,要增加缓存机制,来应对读热点问题,并提升查询性能。
- 对于每个PK以及每行Row的大小,要控制大小,否则将影响性能和稳定性。超出后要及时优化。