华为云用户手册

  • Redis的Arm和x86实例有什么差异? 当前华为云D CS Redis实例的CPU架构支持Arm计算和x86计算。Arm Redis和x86的Redis两者功能是一样的。对客户端使用来说完全一样,没有额外的适配工作量。 可能在部分复杂的命令,大key且命令复杂度超过O(N)场景下,x86 Redis单CPU能力会强于Arm Redis。 综合来看,Arm Redis和x86 Redis能力和性能相当,都能满足业务需求,Arm Redis价格略低,请根据需要进行选择。 部分Region已停售“Arm计算”类型,推荐使用“x86计算”类型。 父主题: 实例类型/版本
  • 在线迁移能否做到完全不中断业务? 可以使用应用双写的方式,即在迁移过程中业务数据继续从源Redis中正常读取,同时将数据的增删改操作在华为云DCS的Redis实例中执行一遍。 保持以上状态运行一段时间后(等待较多的旧数据过期删除),把系统的缓存数据库正式切到华为云DCS。如涉及业务系统迁移云服务,需要在缓存数据库切换前完成业务系统的部署。 不推荐使用这种方式。原因如下: 网络无法保证稳定快速,如果源Redis实例不在DCS,则需要使用公网访问DCS,效率不高。 同时写2份数据,需要用户自行修改代码实现。 源Redis实例的数据逐出策略各有差异,迁移耗时可能较长,数据完整性保障难度大。 父主题: 数据备份/导出/迁移
  • 过期key删除机制 惰性删除:Redis的删除策略由主循环中的判断逻辑进行控制,所有Key读写命令执行之前都会调用函数对其进行检查,如果过期,则删除该键,然后返回Key不存在的结果;未过期则不做操作,继续执行原有的命令。 定期删除:由Redis的定时任务函数实现,该函数以一定的频率运行,每次运行时,都从键空间中取出一定数量的随机Key进行检查,并删除其中的过期键。 不是每次定时任务都会检查所有的Key,而是随机检查一定数量的Key,该机制旨在防止阻塞Redis主进程太久而造成业务阻塞,所以会造成已过期的Key释放内存速度较慢。
  • Sentinel原理 Redis Sentinel是一个分布式系统,Sentinel的设计基础在于多个Sentinel进程协同工作,这样做的好处有: 只有当多个哨兵一致同意某主节点不可用,才执行故障检测,这能够降低误报的可能性。 即使有些Sentinel进程故障,Sentinel系统也能正常工作,从而抵御故障。 从更大范围来看,Sentinel加上Redis主从节点以及连接到Sentinel和Redis的客户端,整体也构成一个更大的分布式系统。
  • Redis执行大Key分析后内存使用率降低的原因 Redis执行大Key分析,只会查询占用空间过大的Key,并不会删除Key。如果Redis执行大Key分析后内存使用率降低,可能是因为原Redis中存在较多过期Key,因为过期Key的惰性删除机制,Key过期后如果未被访问和识别到,不会立即被删除从而积压,在实例进行大Key分析过程中,会遍历Redis实例中的所有Key,使实例中的过期Key被识别到过期,因而被删除。 过期Key的删除机制,以及如何手动执行过期Key或设置自动过期Key扫描的操作,请参考过期Key扫描。 父主题: 大Key/热Key分析/过期Key扫描
  • 排查步骤 单击已创建的迁移任务名称,进入迁移任务页面。 查看迁移日志。参照迁移故障处理,根据对应的错误日志信息,做对应排查。 图1 查看迁移日志 检查迁移方案是否选择正确。 根据自建Redis迁移至DCS、DCS实例间迁移、其他云厂商Redis服务迁移至DCS的不同场景,选择合适的迁移方案,例如,DCS实例间迁移,高版本不支持迁移到低版本。 迁移方案选择不正确,会导致迁移失败,具体迁移方案,请查看迁移方案介绍。 检查源Redis是否放通SYNC和PSYNC命令,迁移任务底层资源与源Redis、目标Redis网络是否连通。 如果是在线迁移,才涉及该操作。 在线迁移,必须满足源Redis和目标Redis的网络相通、源Redis已放通SYNC和PSYNC命令这两个前提,否则,会迁移失败。 网络 检查源Redis、目标Redis、迁移任务所需虚拟机是否在同一个VPC,如果是同一个VPC,则检查安全组(Redis 3.0/Redis 6.0企业版实例)或白名单(Redis 4.0及以上基础版实例)是否放通端口和IP,确保网络是连通的;如果不在同一个VPC,则需要建立VPC对等连接,打通网络。 源Redis和目标Redis必须允许迁移任务底层虚拟机访问。实例安全组或白名单配置,请参考配置安全组、配置白名单。 迁移任务的安全组“出方向规则”需放通端口和IP,确保迁移任务底层虚拟机可以访问源Redis和目标Redis,请参考配置安全组。 源Redis和目标Redis属于不同的云厂商,请参考云专线打通网络。 Redis 4.0及以上版本的基础版实例需要放通白名单的目的,是允许迁移任务底层虚拟机可以访问源Redis和目标Redis(迁移任务底层虚拟机会占用一个IP)。同样,如果是Redis 3.0/Redis 6.0企业版实例,需要配置实例安全组的入方向规则对迁移任务底层虚拟机放通。 命令 默认情况下,一般云厂商都是禁用了SYNC和PSYNC命令,如果要放通,需要联系云厂商运维人员放通命令。 华为云内部进行迁移: 自建Redis迁移至DCS,默认没有禁用SYNC和PSYNC命令; 华为云DCS服务之间进行迁移,如果是同一账号相同Region进行在线迁移,在执行迁移时,会自动放通SYNC和PSYNC命令; 如果是不同Region或相同Region不同账号进行在线迁移,不会自动放通SYNC和PSYNC命令,无法使用在线迁移。推荐使用备份文件导入方式迁移。 其他云厂商迁移到华为云: 一般云厂商都是禁用了SYNC和PSYNC命令,如果使用在线迁移功能,需要联系源端的云厂商运维人员放通此命令,离线迁移,推荐使用备份文件导入方式。 检查源Redis是否存在大Key。操作请参见分析源Redis是否存在大Key。 如果源Redis存在大key,建议将大key打散成多个小key后再迁移。 检查目标Redis的规格是否大于迁移数据大小、是否有其他任务在执行。 如果目标Redis的实例规格小于迁移数据大小,迁移过程中,内存被占满,会导致迁移失败。 如果目标Redis存在正在执行的主备倒换,建议联系客服关闭主备倒换后,重新执行数据迁移。待迁移完成后,重新开启主备倒换。 如果是单机/主备实例迁移到集群实例,请检查: 如果是单机/主备实例迁移到Proxy集群实例,Proxy集群默认不开启多DB,仅有一个DB0,请先确保单机/主备实例DB0以外的DB是否有数据,如果有,请先参考开启多DB操作开启Proxy集群多DB设置。 如果是单机/主备实例迁移到Cluster集群实例,Cluster集群不支持多DB,仅有一个DB0,请先确保单机/主备实例DB0以外的DB是否有数据,如果有,请将数据转存到DB0,否则会出现迁移失败,将数据转存到DB0的操作请参考使用Rump在线迁移。 检查迁移操作是否正确。 检查填写的IP地址、实例密码是否正确。 排查白名单。 如果无法解决,请联系客服。
  • Sentinel功能 监控:Sentinel不间断地检查主从节点是否都在正常工作。 通知:如果Redis中某节点故障,Sentinel可以通过API通知系统管理员或其他计算机程序。 自动故障切换:如果主节点异常,Sentinel启动故障切换,将一个从节点升主,其他从节点从新的主节点进行复制,并通知使用该Redis的应用程序使用新地址进行连接。 客户端配置来源:Sentinel充当客户端服务发现的权威来源。客户端连接到Sentinel,请求当前负责特定业务的Redis主节点地址。如果发生故障切换,Sentinels将下发新地址。
  • 如何确认实例是单DB还是多DB 单机、主备、读写分离实例类型都为多DB(256个,DB编号为0-255)。 Proxy集群实例默认只有一个DB,支持手动开启多DB,如需开启多DB的操作请参考Proxy集群使用多DB限制。 Redis Cluster集群实例不支持多DB,只有一个DB。 Redis 4.0及以上版本的实例,通过控制台连接redis实例后,即可以查看是否为多DB,如下图所示。 图1 连接Redis 图2 查看Database 父主题: Redis使用
  • 存在大Key/热Key,有什么影响? 类别 影响 大Key 造成规格变更失败。 Redis集群变更规格过程中会进行数据rebalance(节点间迁移数据),单个Key过大的时候会触发Redis内核对于单Key的迁移限制,造成数据迁移超时失败,Key越大失败的概率越高,大于512MB的Key可能会触发该问题。 造成数据迁移失败。 数据迁移过程中,如果一个大Key的元素过多,则会阻塞后续Key的迁移,后续Key的数据会放到迁移机的内存Buffer中,如果阻塞时间太久,则会导致迁移失败。 容易造成集群分片不均的情况。 各分片内存使用不均。例如某个分片占用内存较高甚至首先使用满,导致该分片Key被逐出,同时也会造成其他分片的资源浪费。 各分片的带宽使用不均。例如某个分片被频繁流控,其他分片则没有这种情况。 客户端执行命令的时延变大。 对大Key进行的慢操作会导致后续的命令被阻塞,从而导致一系列慢查询。 导致实例流控。 对大Key高频率的读会使得实例出方向带宽被打满,导致流控,产生大量命令超时或者慢查询,业务受损。 导致主备倒换。 对大Key执行危险的DEL操作可能会导致主节点长时间阻塞,从而导致主备倒换。 热Key 容易造成集群分片不均的情况。 造成热Key所在的分片有大量业务访问而同时其他的分片压力较低。这样不仅会容易产生单分片性能瓶颈,还会浪费其他分片的计算资源。 使得CPU冲高。 对热Key的大量操作可能会使得CPU冲高,如果表现在集群单分片中就可以明显地看到热Key所在的分片CPU使用率较高。这样会导致其他请求受到影响,产生慢查询,同时影响整体性能。业务量突增场景下甚至会导致主备切换。 易造成缓存击穿。 热Key的请求压力过大,超出Redis的承受能力易造成缓存击穿,即大量请求将被直接指向后端的数据库,导致数据库访问量激增甚至宕机,从而影响其他业务。 父主题: 大Key/热Key分析/过期Key扫描
  • DCS的Memcached与自建Memcached的区别是什么? DCS的Memcached与本地自建Memcached的区别如下表1所示。 表1 DCS Memcached与自建Memcached的区别 比较项 DCS Memcached 自建Memcached 部署 DCS的Memcached简单易用,创建后缓存服务即时可用,实现快速部署,无需关心硬件及软件。 自己搭建Memcached的操作和设置较复杂。 可用性 DCS的Memcached主备实例支持双机热备,能够持续提供稳定的服务,在主节点故障时,备节点秒级自动升级为主节点,避免单点故障。 自建的Memcached服务需要自行实现高可用。 安全 DCS的Memcached采用公有云的VPC和安全组进行网络访问安全控制。 自建的Memcached服务需要用户自行设计并实现安全机制。 扩容 DCS的Memcached支持在线扩容,在控制台简单操作,即可完成扩容。 自建的Memcached服务的扩容稍复杂,需要自己添加硬件配置,重启服务。 父主题: Memcached使用
  • Jedis连接池参数配置建议 表1 Jedis连接池参数配置建议 参数 配置介绍 配置建议 maxTotal 最大连接,单位:个 根据Web容器的Http线程数来进行配置,估算单个Http请求中可能会并行进行的Redis调用次数,例如:Tomcat中的Connector内的maxConnections配置为150,每个Http请求可能会并行执行2个Redis请求,在此之上进行部分预留,则建议配置至少为:150 x 2 + 100= 400 限制条件:单个Redis实例的最大连接数。maxTotal和客户端节点数(CCE容器或业务VM数量)数值的乘积要小于单个Redis实例的最大连接数。 例如:Redis主备实例配置maxClients为10000,单个客户端maxTotal配置为500,则最大客户端节点数量为20个。 maxIdle 最大空闲连接,单位:个 配置与maxTotal一致。 minIdle 最小空闲连接,单位:个 一般来说建议配置为maxTotal的X分之一,例如此处常规配置建议为:100。 对于性能敏感的场景,为了防止经常连接数量抖动造成影响,可以配置与maxIdle一致,例如:400。 maxWaitMillis 最大获取连接等待时间,单位:毫秒 获取连接时最大的连接池等待时间,根据单次业务最长容忍的失败时间减去执行命令的超时时间得到建议值。例如:Http最长容忍的失败时间为15s,Redis请求的timeout设置为10s,则此处可以配置为5s。 timeout 命令执行超时时间,单位:毫秒 单次执行Redis命令最大可容忍的超时时间,根据业务程序的逻辑进行选择,出于对网络容错等考虑建议配置为不小于210ms。特殊的探测逻辑或者环境异常检测等,可以适当调整达到秒级。 minEvictableIdleTimeMillis 空闲连接逐出时间,大于该值的空闲连接一直未被使用则会被释放,单位:毫秒 如果希望系统不会经常对连接进行断链重建,此处可以配置一个较大值(xx分钟),或者此处配置为-1并且搭配空闲连接检测进行定期检测。 timeBetweenEvictionRunsMillis 空闲连接探测时间间隔,单位:毫秒 根据系统的空闲连接数量进行估算,例如系统的空闲连接探测时间配置为30s,则代表每隔30s会对连接进行探测,如果30s内发生异常的连接,经过探测后会进行连接排除。根据连接数的多少进行配置,如果连接数太大,配置时间太短,会造成请求资源浪费。对于几百级别的连接,常规来说建议配置为30s,可以根据系统需要进行动态调整。 testOnBorrow 向资源池借用连接时是否做连接有效性检测(ping),检测到的无效连接将会被移除。 对于业务连接极端敏感的,并且性能可以接受的情况下,可以配置为True,一般来说建议配置为False,不启用连接空闲检测。 testWhileIdle 是否在空闲资源监测时通过ping命令监测连接有效性,无效连接将被销毁。 True testOnReturn 向资源池归还连接时是否做连接有效性检测(ping),检测到无效连接将会被移除。 False maxAttempts 在JedisCluster模式下,您可以配置maxAttempts参数来定义失败时的重试次数。 建议配置3-5之间,默认配置为5。 根据业务接口最大超时时间和单次请求的timeout综合配置,最大配置不建议超过10,否则会造成单次请求处理时间过长,接口请求阻塞。
  • Jedis连接池优势 Lettuce客户端及Jedis客户端比较如下: Lettuce: Lettuce客户端没有连接保活探测,错误连接存在连接池中会造成请求超时报错。 Lettuce客户端未实现testOnBorrow等连接池检测方法,无法在使用连接之前进行连接校验。 Jedis: Jedis客户端实现了testOnBorrow、testWhileIdle、testOnReturn等连接池校验配置。 开启testOnBorrow在每次借用连接前都会进行连接校验,可靠性最高,但是会影响性能(每次Redis请求前会进行探测)。 testWhileIdle可以在连接空闲时进行连接检测,合理配置阈值可以及时剔除连接池中的异常连接,防止使用异常连接造成业务报错。 在空闲连接检测之前,连接出现问题,可能会造成使用该连接的业务报错,此处可以通过参数控制检测间隔(timeBetweenEvictionRunsMillis)。
  • 监控数据出现实例已使用内存略大于实例可使用内存是什么原因? DCS单机和主备实例已使用内存为redis-server进程统计的已使用内存。集群是基于分片机制实现的,集群的已使用内存为各个分片redis-server的已使用内存的总和。 由于开源redis-server内部机制的原因,有时会出现DCS缓存实例已使用内存略大于可使用内存的情况,此为正常现象。 Redis通过zmalloc来分配内存,不会在每一次分配内存时都检查是否会超过max_memory,而是在周期任务以及命令处理的开头处等地方,判断一次当前的used_memory是否超过max_memory,如果超过就触发逐出操作。所以,对于max_memory策略的限制实施并不是实时、刚性的,会出现某个时间used_memory大于max_memory的情形。 父主题: 监控告警
  • 为了减少大Key和热Key过大,有什么使用建议? string类型控制在10KB以内,hash、list、set、zset元素尽量不超过5000个。 Key的命名前缀为业务缩写,禁止包含特殊字符(比如空格、换行、单双引号以及其他转义字符)。 Redis事务功能较弱,不建议过多使用。 短连接性能差,推荐使用带有连接池的客户端。 如果只是用于数据缓存,容忍数据丢失,建议关闭持久化。 大Key/热Key的优化方法,请参考下表。 类别 方法 大Key 进行大Key拆分。 分为以下几种场景: 该对象为String类型的大Key:可以尝试将对象分拆成几个Key-Value, 使用MGET或者多个GET组成的pipeline获取值,分拆单次操作的压力。如果是集群实例,由于集群实例包含多个分片,拆分后的Key会自动平摊到集群实例的多个分片上,从而降低对单个分片的影响。 该对象为集合类型的大Key,并且需要整存整取:在设计上严格禁止这种场景的出现,因为无法拆分。有效的方法是将该大Key从Redis去除,单独放到其余存储介质上。 该对象为集合类型的大Key,每次只需操作部分元素:将集合类型中的元素分拆。以Hash类型为例,可以在客户端定义一个分拆Key的数量N,每次对HGET和HSET操作的field计算哈希值并取模N,确定该field落在哪个Key上,实现上类似于Redis Cluster的计算slot的算法。 将大Key单独转移到其余存储介质。 无法拆分的大Key建议使用此方法,将不适用Redis能力的数据存至其它存储介质,如SFS或者其余NoSQL数据库,并在Redis中删除该大Key。 注意: 禁止使用DEL直接删除大Key,可能会造成Redis阻塞,甚至主备倒换。Redis 4.0及以上版本建议采用UNLINK命令删除大Key。 合理设置过期时间并对过期数据定期清理。 合理设置过期时间,避免历史数据在Redis中大量堆积。由于Redis的惰性删除策略,过期数据可能并不能及时清理,如果发现Redis过期Key清理较慢,建议配置过期Key扫描。 热Key 使用读写分离。 如果热Key主要是读流量较大,则可以在客户端配置读写分离,降低对主节点的影响。还可以增加多个副本以满足读需求,但是备机较多也有相应的影响,DCS主备节点之间使用的是星型复制,即所有的备节点都直接和主节点保持同步,这样能保证备节点之间相互独立,且复制延迟较小。缺点是在备节点数量较多的情况下,主节点的CPU和网络负载会较高。 使用客户端缓存/本地缓存。 该方案需要提前了解业务的热点Key有哪些,设计客户端/本地和远端Redis的两级缓存架构,热点数据优先从本地缓存获取,写入时同时更新,这样能够分担热点数据的大部分读压力。缺点是需要修改客户端架构和代码,改造成本较高。 设计熔断/降级机制。 热Key极易造成缓存击穿,高峰期请求都直接透传到后端数据库上,从而导致业务雪崩。因此热Key的优化一定需要设计系统的熔断/降级机制,在发生击穿的场景下进行限流和服务降级,保护系统的可用性。 父主题: 大Key/热Key分析/过期Key扫描
  • Lazy free机制 解决的痛点/问题 Redis是单线程程序,当运行一个耗时较大的请求时,会导致所有请求排队等待,在请求处理完成前,Redis不能响应其他请求,因此容易引发性能问题。而Redis删除大的集合键时,就属于一种比较耗时的请求。 原理 Redis 4.0提供的一种惰性删除或者说延迟释放机制,主要用于解决删除大key对Redis进程的阻塞,从而避免带来性能与可用性问题。 删除key时,Redis异步延时释放key的内存,把key释放操作放在bio(Background I/O)单独的子线程处理中。 使用方法 主动删除 unlink unlink与del命令目的一样,删除某个key。unlink在删除集合类键时,如果集合键的元素个数大于64个,会把内存释放操作,给单独的bio(Background I/O)线程来执行。因此unlink删除操作能在非常短的时间内完成包含上百万个元素的大key删除。 flushall/flushdb 通过对flushall/flushdb添加ASYNC异步清理选项,Redis在清理整个实例或单个DB时,操作都是异步的。 过期key删除、大key驱逐删除 被动删除有四种场景,每种场景对应一个配置参数,默认都是关闭: lazyfree-lazy-eviction no //针对redis内存使用达到maxmemory,并设置有淘汰策略时,是否采用lazy free机制lazyfree-lazy-expire no //针对设置有TTL的键,过期后,被redis清理删除时是否采用lazy free机制lazyfree-lazy-server-del no //针对有些指令在处理已存在的键时,会带有一个隐式的DEL键的操作slave-lazy-flush no //针对slave进行全量数据同步,slave在加载master的RDB文件前,会运行flushall来清理自己的数据场景
  • 连接实例必须使用密码吗?如何获取密码? Redis实例支持密码模式和免密模式。Redis本身支持不设置密码,客户端可以直接连接Redis缓存服务并使用,但出于安全考虑,建议尽量选用密码模式,通过密码来鉴权验证,提升安全性。若选用密码模式,您需要在创建实例时自定义密码。 Memcached实例支持密码模式和免密模式,用户可以根据自身应用特点选用支持文本和二进制协议的任何Memcached客户端。若选用密码模式,您需要在创建实例时自定义密码。 如需修改Redis访问方式、修改或重置密码,请参考密码管理。 父主题: 安全性
  • Redis实例支持的单个Key和Value数据大小是否有限制? Key的大小上限为512M。 建议key的大小不超过1KB,这样既节约存储空间,也利于Redis进行检索。 String类型的value值上限为512M。 集合、链表、哈希等key类型,单个元素的value上限为512M。 事实上,集合、链表、哈希都可以看成由String类型的key按照一定的映射关系组合而成。 同时,请注意避免对大Value进行长时间高并发写入,这样会影响网络传输效率,也会增加redis-server的内部处理耗时,从而导致请求时延较大。 父主题: 实例特性
  • DCS实例是否支持跨VPC访问? 跨VPC访问,即客户端和实例不在同一个VPC。 对于未开启公网访问的实例,一般情况下,不同VPC间网络不互通,不在同一VPC下的弹性云服务器无法访问DCS缓存实例。 可以通过创建VPC对等连接,将两个VPC的网络打通,实现跨VPC访问DCS缓存实例。 用户通过VPC对等访问DCS缓存实例时,除了满足VPC对等网跨VPC访问的约束之外,还存在如下约束: 当创建实例时使用了172.16.0.0/12~24网段时,客户端不能在192.168.1.0/24、192.168.2.0/24、192.168.3.0/24网段。 当创建实例时使用了192.168.0.0/16~24网段时,客户端不能在172.31.1.0/24、172.31.2.0/24、172.31.3.0/24网段。 当创建实例时使用了10.0.0.0/8~24网段时,客户端不能在172.31.1.0/24、172.31.2.0/24、172.31.3.0/24网段。 关于创建和使用VPC对等连接,请参考VPC对等连接说明。 父主题: 客户端和网络连接
  • 应该选择 域名 还是IP地址连接Redis实例? 对于Redis单机、Proxy集群、读写分离实例: 每个实例只有1个IP地址和1个域名连接地址。实例发生主备交换前后,实例的IP地址和域名连接地址都不会改变。选择域名连接或IP连接不影响功能的使用。 对于Redis基础版主备实例: 每个实例有1个IP地址和2个域名连接地址,包含1个只读域名。实例发生主备交换前后,实例的IP地址和域名连接地址都不会改变。选择域名连接或IP连接不影响功能的使用。 使用域名连接时,需要考虑业务的读写请求区别,选择“连接地址”或“IP地址”连接不影响功能的使用,使用“只读地址”连接时只处理读请求(有读写分离需求的用户推荐直接使用读写分离实例)。 对于Redis 6.0企业版: 请使用域名连接实例,IP地址可能有多个或发生变化。 对于Cluster集群实例: Cluster集群是多主多从架构,有多组主从节点IP地址和1个域名连接地址。选择域名连接或IP连接不影响功能的使用。 使用IP地址连接实例时,可以使用任意一个IP地址连接实例,连接的节点会将请求发送到正确的节点上,使Cluster的全部节点都可以接收请求。建议配置多个或全部IP地址连接,避免所配置的IP地址所在节点故障时导致连接失败。 域名解析返回的IP数量最多为50个,如需限制解析返回的IP数量,请联系后台管理人员。 如果客户端服务器和Redis实例不在同一Region,需要跨Region访问Redis实例时,实例域名无法跨Region解析,无法通过域名访问。可以通过在hosts中手动配置域名与IP绑定关系或使用IP进行访问。参考Redis连接约束。 连接实例请参考连接Redis缓存实例。 父主题: 客户端和网络连接
  • 如何使用Redis-desktop-manager访问Redis实例? 如下分别介绍通过内网和公网使用Redis-desktop-manager访问Redis 3.0实例的操作。 使用VPC子网访问 填写DCS实例子网地址,端口6379,以及相应密码。 单击左下角“测试连接”。 提示成功后,说明连接正常。 图1 通过内网使用Redis-desktop-manager访问Redis实例 使用Redis-desktop-manager访问DCS集群实例时,执行redis命令是正常的,但是左侧显示异常,这个是因为DCS集群是基于codis架构,info命令的输出和原生的redis不一样。 使用公网访问 使用公网访问,需要注意SSL是否开启。 如果SSL关闭,则只需要把地址填写实例的公网访问地址即可。 注意需要放开实例安全组的入方向6379端口。 如果SSL开启,需要在本地安装Stunnel客户端,才能通过redis-desktop-manager访问Redis。需要注意的是: 必须安装Stunnel客户端,安装配置可参考Stunnel客户端安装配置。 Redis-desktop-manaer访问地址必须填写127.0.0.1,不能填写公网IP,否则出现“connection reset”。 因为SSL开启时,本地访问公网Redis,实际是通过Stunnel搭建的加密隧道。即Redis-desktop-manager访问Stunnel在127.0.0.1监听的socket后,Stunnel通过加密传输到公网Redis的36379端口。 注意需要放开实例安全组的入方向36379端口。 如果SSL已经关闭,需要将其打开,只需要把公网访问关闭,重新打开的时候,启用SSL即可。相反,SSL已经打开,要将其关闭,操作是类似的。 父主题: 客户端和网络连接
  • Redis实例是否支持多DB方式? Redis实例支持多DB方式的情况如下: Redis单机、读写分离和主备缓存实例支持多数据库(多DB),默认256个,DB编号为0-255。默认使用的是DB0。多数据库主要用于数据隔离,每个数据库的大小不是平均分配,可能会出现一个数据库将实例的内存完全占用的情况。 Redis Proxy集群默认只有一个DB。 如需创建多DB的Proxy集群实例请参考如何创建多DB的Proxy集群实例。 创建单DB的Proxy集群实例后,如需开启多DB的操作请参考Proxy集群使用多DB限制。 Redis 3.0 proxy不支持开启多DB。 Redis Cluster集群实例不支持多DB,只有一个DB,即DB0。 DB的个数不支持修改,每个DB的大小也不支持自定义。 父主题: 实例特性
  • Redis集群可以读取每个节点的IP地址吗? Redis 3.0版本的集群实例(Proxy版本)的使用方式与单机、主备实例相同,无需知晓后端地址。 Redis 4.0及以上版本的集群实例(Cluster版本)可以使用cluster nodes命令获取。 redis-cli -h {redis_address} -p {redis_port} -a {redis_password} cluster nodes 在命令返回的结果中,获取所有master节点的IP端口,如下图所示。 父主题: 实例特性
  • 使用Redis实例的发布订阅(pubsub)有哪些注意事项? Redis实例的发布订阅功能详细信息参见Pub/Sub,使用Redis发布订阅功能时有如下事项请注意: 客户端需要及时消费和处理消息。 客户端订阅了channel之后,如果接收消息不及时,可能导致DCS实例消息堆积,当达到消息堆积阈值(默认值为32MB),或者达到某种程度(默认8MB)一段时间(默认为1分钟)后,服务器端会自动断开该客户端连接,避免导致内部内存耗尽。 客户端需要支持重连。 当连接断开之后,客户端需要使用subscribe或者psubscribe重新进行订阅,否则无法继续接收消息。 不建议用于消息可靠性要求高的场景中。 Redis的pubsub不是一种可靠的消息系统。当出现客户端连接退出,或者极端情况下服务端发生主备切换时,未消费的消息会被丢弃。 父主题: 客户端和网络连接
  • 客户端出现概率性超时错误 针对低概率超时错误,是Redis使用的正常现象。Redis使用受到网络传输、客户端设置超时时间等因素影响,可能出现单个请求超时问题。 建议客户业务编码时,具备重试操作,提升业务的可靠性,避免低概率的单次请求失败时业务失败。 当出现了连接超时问题时,可以优先检查Redis是否开启了AOF持久化功能,并根据业务需求,决定是否开启AOF持久化(开启/关闭AOF持久化的影响)。关闭AOF持久化可以提升客户端连接的稳定性,减少出现阻塞,连接不上的情况。 如果出现超时错误概率频繁,请联系技术服务人员。 父主题: 客户端和网络连接
  • 问题分析 Cluster集群规格变更原理: 客户端根据RESP2协议的内容,启动后从Cluster集群获取节点拓扑信息(Cluster Nodes),并将其拓扑关系维护在客户端的内存数据结构中。 对于数据访问,客户端会根据Key值按照CRC16算法进行Hash计算Slot信息,根据内存中保存的节点拓扑关系和Slot的对应信息进行请求自动路由。 在扩容/缩容过程中,当实例分片数发生变化时,存在节点拓扑关系和Slot对应信息的变化,需要客户端进行拓扑关系的自动更新,否则可能造成请求路由失败或者路由位置错误等,造成客户端访问报错。 例如,3分片Cluster集群实例扩容为6分片Cluster集群实例时,节点拓扑关系和Slot对应信息变化如下图所示: 图2 Cluster集群实例扩容前 图3 Cluster集群实例扩容后
  • 解决方案 方案一(推荐方案): 开启Cluster集群自动刷新拓扑配置。 ClusterTopologyRefreshOptions topologyRefreshOptions = ClusterTopologyRefreshOptions.builder() // 每隔time毫秒周期性刷新 .enablePeriodicRefresh(Duration.ofMillis(time)) // MOVED重定向, ASK重定向, 重连, 未知节点(since 5.1), 槽位不在当前所有分片中(since 5.2),当出现这五种情况时会触发自适应刷新 .enableAllAdaptiveRefreshTriggers() .build(); 具体实现请参考Lettuce客户端连接Cluster集群实例。 Lettuce客户端连接Cluster集群实例,如果未开启拓扑刷新,规格变更后,需要重启客户端。 方案二: 关闭“验证集群节点成员资格开关”,关闭方式如下: ClusterClientOptions clusterClientOptions = ClusterClientOptions.builder() .validateClusterNodeMembership(false) .build(); 原理:若validateClusterNodeMembership为true时,连接前检查当前连接地址是否在集群拓扑关系中(通过CLUSTER NODES获得),若不在则会出现上述异常问题。 关闭“验证集群节点成员资格开关”的影响: 缺少防止安全漏洞的检验; 若未开启集群自动刷新拓扑,当Cluster集群执行变更规格后,若分片数增加时,可能会产生MOVED重定向请求,这个重定向过程会增加集群的网络负担和单次请求耗时;若分片数因删除减少时,会出现无法连接已删除分片的异常情况。
  • Redis实例支持的逐出策略 在达到内存上限(maxmemory)时,Redis支持选择以下8种数据逐出策略: noeviction:在这种策略下,如果缓存达到了配置的上限,实例将不再处理客户端任何增加缓存数据的请求,比如写命令,实例直接返回错误给客户端。缓存达到上限后,实例只处理删除和少数几个例外请求。 allkeys-lru:根据LRU(Least recently used,最近最少使用)算法尝试回收最少使用的键,使得新添加的数据有空间存放。 volatile-lru:根据LRU(Least recently used,最近最少使用)算法尝试回收最少使用的键,但仅限于具有“expire”字段集的键,使得新添加的数据有空间存放。 allkeys-random:回收随机的键使得新添加的数据有空间存放。 volatile-random:回收随机的键使得新添加的数据有空间存放,但仅限于具有“expire”字段集的键。 volatile-ttl:回收具有“expire”字段集中的键,且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。 allkeys-lfu:从所有键中驱逐最不常用的键。 volatile-lfu:从具有“expire”字段集的所有键中驱逐最不常用的键。 当没有键满足回收前提条件时,数据逐出策略volatile-lru、volatile-random、volatile-ttl与noeviction策略相同,具体见上文noeviction介绍。 2020年7月之前创建的Redis实例,逐出策略默认为noeviction。2020年7月及之后创建的实例,逐出策略默认为volatile-lru。
  • Redis命令执行失败的可能原因 Redis命令执行失败,一般有以下可能原因: 命令拼写不正确 如下图所示,命令拼写有误,Redis实例返回“ERR unknown command”,删除key的正确命令为del。 在低版本Redis实例运行高版本命令 如下图所示,在Redis 3.0版本运行Redis 5.0新增的Stream相关命令,Redis实例返回命令出错信息。 DCS Redis不支持的部分命令。 出于安全原因,DCS禁用了部分命令,具体参考Redis命令的兼容性,查看禁用命令与受限使用命令。 在控制台提供的Web CLI界面执行命令失败。 Web CLI工具除了同样不支持上述列出的禁用命令与受限命令,对keys命令也有一定的使用限制。 执行lua脚本失败。 例如报错:ERR unknown command 'EVAL' ,说明您的Redis实例属早期创建的低版本Redis实例,不支持lua脚本,这种情况请提工单联系技术支持,升级您的Redis实例。 执行setname和getname失败。 说明您的Redis实例属早期创建的低版本Redis实例,不支持这两个命令,这种情况请提工单联系技术支持,升级您的Redis实例。 2018年7月10日前创建的Redis集群实例,以下命令被禁用,客户端执行时也会收到命令出错信息。如果需要支持,请提工单联系技术支持,升级集群实例。 SINTER、SDIFF、SUNION、PFCOUNT、PFMERGE、SINTERSTORE、SUNIONSTORE、SDIFFSTORE、SMOVE、BLPOP、BRPOP、BRPOPLPUSH、ZUNIONSTORE,、ZINTERSTORE、EVAL、EVALSHA、BITOP、RENAME、RENAMENX、RPOPLPUSH、MSETNX、SCRIPT LOAD、SCRIPT KILL、SCRIPT EXISTS、SCRIPT FLUSH。 父主题: Redis命令
  • 使用Jedis连接池报错如何处理? 在使用Jedis连接池JedisPool模式下,比较常见的报错如下: redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool 首先确认DCS缓存实例是正常运行中状态,然后按以下步骤进行排查。 检查网络。 核对IP地址配置。 检查jedis客户端配置的IP地址是否与DCS缓存实例的连接地址或IP地址一致,如果是通过公网访问,则检查是否与DCS缓存实例绑定的弹性IP地址一致,不一致则修改一致后重试。 测试网络。 在客户端使用ping和Telnet小工具测试网络。 如果ping不通: VPC内访问时,要求客户端与DCS缓存实例的VPC相同,并且正确配置安全组或白名单。 公网SSL方式访问Redis 3.0时,要求DCS缓存实例安全组放开了36379端口访问。 公网直接访问Redis 3.0(非SSL方式)时,要求DCS缓存实例安全组放开了6379端口访问。 如果IP地址可以ping通,telnet对应的端口不通,则尝试重启实例,如重启后仍未恢复,请联系技术支持。 检查连接数是否超限。 查看已建立的网络连接数是否超过JedisPool配置的上限。如果连接数接近配置的上限值,则建议重启服务观察。如果明显没有接近,排除连接数超限可能。 Unix/Linux系统使用: netstat -an | grep 6379 | grep ESTABLISHED | wc -l Windows系统使用: netstat -an | find "6379" | find "ESTABLISHED" /C 检查JedisPool连接池代码。 如果连接数接近配置的上限,请分析是业务并发原因,或是没有正确使用JedisPool所致。 对于JedisPool连接池的操作,每次调用jedisPool.getResource()方法之后,需要调用jedisPool.returnResource()或者jedis.close()进行释放,优先使用close()方法。 检查客户端TIME_WAIT是否过多。 通过ss -s查看time wait链接是否过多。 如果TIME_WAIT过多,可以调整内核参数(/etc/sysctl.conf): ##当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击net.ipv4.tcp_syncookies = 1##允许将TIME-WAIT sockets重新用于新的TCP连接net.ipv4.tcp_tw_reuse = 1##开启TCP连接中TIME-WAIT sockets的快速回收net.ipv4.tcp_tw_recycle = 1##修改系统默认的TIMEOUT时间net.ipv4.tcp_fin_timeout = 30 调整后重启生效:/sbin/sysctl -p 如果按照以上原因排查之后问题仍没有解决,可以通过抓包并将异常时间点、异常信息以及抓包文件发送给技术支持协助分析。 抓包可使用tcpdump工具,命令如下: tcpdump -i eth0 tcp and port 6379 -n -nn -s 74 -w dump.pcap Windows系统下还可以安装Wireshark工具抓包。 公网访问Redis 3.0时请将端口改成36379。 网卡名请改成实际的网卡名称。 父主题: 客户端和网络连接
  • 查找并禁用高消耗命令 使用了keys等消耗资源的命令,高消耗资源的命令即时间复杂度为O(N)或更高的命令,通常情况下,命令时间复杂度越高,在执行时消耗的资源越高,这会导致CPU使用率超高,容易触发主备倒换。关于各命令对应的时间复杂度信息请参见Redis官网。例如,使用了keys等消耗资源的命令,导致CPU超高,建议客户改成scan命令或者禁用keys命令。 通过性能监控功能,确认CPU使用率高的具体时间段。 通过下述方法,找出高消耗的命令。 慢查询功能会记录执行超过指定时间阈值的命令,通过分析慢查询的语句和执行时长可帮助您找出高消耗命令,具体操参见慢查询。 通过实例诊断功能,选择CPU冲高的时间点进行诊断后,可以看到报告中的对应时间段命令的执行情况以及CPU耗时百分比,具体操作参见实例诊断。 处理措施。 评估并禁用高风险命令和高消耗命令,例如FLUSHALL、KEYS、HGETALL等。 优化业务,例如避免频繁执行数据排序操作。 可选:根据业务情况,选择下述方法对实例进行调整: 调整实例为读写分离实例,对高消耗命令或应用进行分流。 扩容实例增强实例处理能力。
共100000条