- 最新动态
- 功能总览
- 服务公告
- 产品介绍
-
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参考
- 场景代码示例
- 视频帮助
- 文档下载
- 通用参考
链接复制成功!
基本设计规范
设计规范
规则1:禁止在数据库中存储图片、文件等大数据。图片或文件等大数据建议存储到对象存储服务中。
规则2:单行key和value数据大小最大不能超过64KB,平均大小不超过10KB。
规则3:任何表的设计都要考虑到数据的删除策略,表中的数据不能无限地增长而不删除。
规则4:设计分区键以均匀分发工作负载,避免出现数据倾斜问题。
表的主键的分区键部分确定存储表数据的逻辑分区,如果分区键分布不均衡,会导致节点与节点之间数据和负载不均衡,从而出现数据倾斜的问题。
如表1为一些常见分区键分布均匀性的效果对比。
分区键值 |
分区键分布均匀性 |
---|---|
用户 ID,应用程序中有许多用户。 |
好 |
状态代码,只有几个可用的状态代码。 |
差 |
项目创建日期,四舍五入至最近的时间段 (例如,天、小时或分钟)。 |
差 |
设备 ID,每个设备以相对类似的间隔访问数据。 |
好 |
设备 ID,被跟踪的设备有很多,但到现在为止,其中某个设备比其他所有设备更加常用。 |
差 |
如下为常见均匀分布分区键的设计方案
- 使用随机后缀分区
跨分区键空间更均匀分发负载的一种策略是将随机数字添加到分区键值的末尾。
例如:对于表示当天日期的分区键,可能会选择介于1和200之间的随机数并将它作为后缀连接到该日期。这将生成分区键值 (如2014-07-09.1、2014-07-09.2,以此类推,直到 2014-07-09.200)。由于随机化分区键,因此将跨多个分区均匀分布每天对表的写入,这将提高并行度和总体吞吐量。
但是要读取指定日期的所有项目,必须针对所有后缀查询项目,然后合并结果。例如:将先针对分区键值Query发布2014-07-09.1请求,然后再针对Query发布另一个2014-07-09.2,以此类推,直到2014-07-09.200。最后应用程序必须合并所有Query请求的结果。
- 使用计算得出的后缀分区
随机化策略可以显著提高写入吞吐量,但难以读取特定项目,因为不知道在写入项目时使用的是什么后缀值。要使各个项目的读取变得简单,可使用其他策略。不是使用随机数在分区间分发项目,而是使用可根据查询内容计算出的数字。
请考虑上述示例,其中表在分区键中使用当天日期。现在假设每个项目都有可访问的OrderId属性,并且除了日期,还最常需要按订单ID查找项目。在应用程序将项目写入表之前,它可根据订单ID计算得出一个哈希后缀并将此后缀追加到分区键日期。此计算可能生成一个介于1和200之间、分发甚是均匀的数字 (类似于随机策略所生成的数字)。
简单的计算可能已足够,如订单ID中字符的UTF-8码位值的积,取模200,+1。则分区键值是与计算结果连接的日期。
通过此策略,写入将在分区键值之间均匀分布,从而在物理分区之间均匀分布。可以轻松针对特殊项目和日期执行GetItem操作,因为可通过特定OrderId值计算出分区键值。
要读取指定日期的所有项目,仍必须Query每个2014-07-09.N键(其中,N为1~200),应用程序之后必须合并所有结果。好处是避免了一个“热点”分区键值占用所有工作负载。
规则5:合理设计分区key,均匀访问数据,避免出现大key或者热key问题。
- 大key问题:大key的产生,最主要的原因是主键设计不合理,使得单个分区的记录数或数据量过大。一旦某一个分区出现极大时,对该分区的访问,会造成分区所在服务器的负载变高,甚至造成节点内存溢出(即OOM)等。
- 热key问题:在日常生活中,经常会发生各种热门事件,应用中对该热点新闻进行上万次的点击浏览和评论时,会形成一个较大的请求量,这种情况下会造成短时间内对同一个key频繁操作,会导致key所在节点的CPU和负载升高,从而影响落在该节点的其他请求,导致业务成功率下降。诸如此类的还有热门商品促销,网红直播等场景,这些典型的读多写少的场景也会产生热点问题。
如何处理大key和热key问题请参见如何检测和解决大key与热key问题。
另外,对GeminiDB Cassandra数据库的读能力有更高要求的,读多写少的场景,可以考虑把热点数据缓存到GeminiDB Redis接口。
规则6:单个分区键的行数不能超过10万,单个分区磁盘空间不超过100MB。
- 单个分区键的行数不能超过10万。
- 单个分区键下记录大小不能超过100MB。
规则7:所有写入GeminiDB Cassandra的数据,提供数据副本强一致性,但是不支持事务。
一致性类型 |
是否支持一致性 |
说明 |
---|---|---|
并发写一致性 |
支持 |
GeminiDB Cassandra不支持事务,数据写入强一致。 |
表之间一致性 |
支持 |
GeminiDB Cassandra不支持事务,数据写入强一致。 |
数据迁移一致性 |
最终一致性 |
采用DRS迁移提供数据抽样对比验证能力。业务自己完成迁移时,需要业务自行完成迁移前后数据校验。 |
规则8:大规模存储要重点考虑数据库拆分。
GeminiDB Cassandra整个集群的节点数控制在100以内,超过100节点要考虑拆分,一般有垂直拆分和水平拆分两种方法。
- 垂直拆分:是指按功能模块拆分,比如分为订单库、商品库、用户库等,这种方式多个数据库之间的表结构不同。
- 水平拆分:将同一个表的数据进行分块保存到不同的数据库中,这些数据库中的表结构完全相同。
规则9:设计上避免大面积删除导致的墓碑问题。
- 尽量使用TTL代替Delete操作。
- 不要出现大面积删除数据,尽量通过主键前缀删除。
- 单个分区键内一次范围删除所包含行数不超过1000。
- 范围查询避免查询已删除数据。
- 不推荐在单个分区内频繁做范围删除。
设计建议
建议1:合理控制数据库规模和数量。
- 建议单表数据量不超过1000亿。
- 建议单库不超过100个表。
- 建议单表字段数上限控制在20~50个。
建议2:提前进行资源估算,估算出对GeminiDB Cassandra服务器要求。
- 根据业务估算需要使用N节点集群,建议在评估的基础上冗余N/2个节点,保证容忍故障节点个数N/2,以支撑故障场景下性能保持一致。
- 正常业务压力下每个节点CPU使用率限制使用在50%,防止业务出现高峰波动。
建议3:大规模GeminiDB Cassandra存储要考虑基于业务场景做数据库性能测试。
对于请求量、数据量比较大的业务场景,需要提前做性能摸底,原因是业务读写比例和随机访问模式以及不同的规格实例,性能差异较大。
建议4:数据库集群拆分粒度要合适。
- 分布式场景,考虑节约资源费用和维护成本,一个服务内部各个微服务可以共用一个GeminiDB Cassandra集群。
- 服务内部,根据数据重要程度、表数量和单表记录数,可进一步拆分成不同集群。
建议5:避免单条数据部分字段频繁更新。
建议6:List、Map、Set等嵌套类型,当元素超过一定数量,会影响读取性能,建议当元素过多时,采用转换成JSON字符串的形式进行存储。