华为云用户手册

  • Cluster集群实例容量和性能未达到瓶颈,但某个分片容量或性能已过载是什么原因? 这是由于Cluster集群采用的是分片设计理念,每个具体的Key只能分布到某一个具体的分片节点上,计算Key的分布过程有以下两个步骤: 针对Key值进行CRC16算法计算后对16384取模,得到对应的槽位(Slot)值。 根据S槽位(Slot)和分片的映射关系,找到Key具体应该属于的分片,并且进行存取。 所以,Key并没有均匀分布在实例的各个分片上,是根据计算结果进行存取的。在大Key和热Key存在时,就会出现某个分片容量或性能已过载,但其他分片内存负载还是很低,并没有达到容量和性能的瓶颈。 父主题: Redis使用
  • Memcached实例支持公网访问么? Memcached实例暂不支持公网访问。 未开启公网访问的D CS 缓存实例,本地环境不能直接连接DCS缓存实例。DCS采用虚拟私有云(VPC)管理各服务的网络安全,用户创建的DCS缓存实例,必须通过与DCS缓存实例相同虚拟私有云(VPC)的弹性云服务器(ECS)来访问。 如果您在应用开发调试阶段,可以通过网络代理转发的方式,用一台能与DCS缓存实例网络互通的弹性云服务器(ECS)做中转,实现本地环境连接DCS缓存实例。具体操作参考使用SSH隧道代理机制实现公网访问DCS实例。 父主题: Memcached使用
  • 创建Memcached实例时如何选择可用区? 简单来说,只要是在同一区域(Region)内,选择任意一个可用区内DCS的Memcached都没有功能上的本质区别。 一般来讲,同一可用区比跨可用区的网络时延更有优势,但是跨可用区从容灾的角度比同可用区更有优势。当应用内部需要更低的网络时延,可以将应用实例组部署在同一个可用区中。 DCS的Memcached目前已支持跨可用区部署,在管理控制台创建DCS的Memcached时进行配置。只要与您的ECS在同一个区域(Region)内,无论选择创建哪个可用区的Memcached都可以实现与ECS正常的连通使用。若您希望获得更低的网络时延,请根据您ECS的可用区选择创建对应可用区的Memcached。 例如,您有一台华南-广州的ECS,其属于华南-广州可用区B,那么当您在购买DCS的Memcached时,选择华南-广州任何一个可用区的实例都是可以正常使用的。您选择华南-广州可用区B的实例可以获得与这台ECS更低的网络时延。 注意:由于资源库存因素,可能出现您在创建DCS的Memcached时仅有一个可用区资源供选择的情况,这不会影响您的正常使用。 父主题: Memcached使用
  • 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使用
  • 什么是大Key/热Key? 名词 定义 大Key 大Key可以分为两种情况: Key的Value较大,例如一个String类型的Key大小达到10MB,或者一个集合类型(Hash,List,Set等)的元素总大小达到了100MB。一般单个String类型的Key大小达到10KB,或者集合类型的Key总大小达到50MB,则定义其为大Key。 Key的元素较多,例如一个Hash类型的Key,其元素数量达到了10000。一般定义集合类型的Key中元素超过5000个,则认为其为大Key。 热Key 通常以一个Key被操作的频率和占用的资源来判定其是否为热Key,例如: 某个集群实例一个分片每秒处理10000次请求,其中有3000次都是操作同一个Key。 某个集群实例一个分片的总带宽使用(入带宽+出带宽)为100Mbits/s,其中80Mbits是由于对某个Hash类型的Key执行HGETALL所占用。 父主题: 大Key/热Key分析/过期Key扫描
  • 如何分析Redis 3.0实例的热Key? 由于Redis 3.0本身不提供热Key能力,您可以参考以下方法进行分析。 方法1:进行业务结构和业务实现分析,找到可能的热Key。 例如,某商品在秒杀,或者用户登录,对业务代码分析,很容易找到热Key。 优点:简单易行。 缺点:需要对业务代码比较了解,另外对于一些复杂的业务场景,不太容易分析。 方法2:在客户端代码中,调用Redis的函数中,进行访问Key的记录,进而统计出热Key。 缺点:需要代码进行侵入式修改。 方法3:抓包分析 优点:简单易行 父主题: 大Key/热Key分析/过期Key扫描
  • 监控指标中存在已拒绝连接数是什么原因? 当监控指标中出现已拒绝连接数时,请确认客户端连接数是否已经超过实例的最大连接数限制,实例最大连接数可以查看参数maxclients。 查看最大连接数:单击实例名称,进入实例详情页面,选择“配置参数”页签,查看maxclients参数的值。(Proxy集群实例不支持maxclients参数,最大连接数请参考控制台实例创建页面中的实例规格。) 查看实际连接数:单击实例名称,进入实例详情页面,选择“性能监控”页签,找到“活跃的客户端数量”监控项查看。 如果客户端连接数已到达连接上限,可以根据需要调整maxclients参数,如果maxclients参数已经是最大可配连接数,仍不满足需求,则需要升级规格。 父主题: 监控告警
  • Redis执行大Key分析后内存使用率降低的原因 Redis执行大Key分析,只会查询占用空间过大的Key,并不会删除Key。如果Redis执行大Key分析后内存使用率降低,可能是因为原Redis中存在较多过期Key,因为过期Key的惰性删除机制,Key过期后如果未被访问和识别到,不会立即被删除从而积压,在实例进行大Key分析过程中,会遍历Redis实例中的所有Key,使实例中的过期Key被识别到过期,因而被删除。 过期Key的删除机制,以及如何手动执行过期Key或设置自动过期Key扫描的操作,请参考过期Key扫描。 父主题: 大Key/热Key分析/过期Key扫描
  • Redis实例是否支持SSL加密传输? Redis 6.0基础版实例SSL默认关闭,如需开启SSL加密传输,请参考SSL设置。 当前DCS实例在开启公网访问时(仅Redis 3.0实例支持),支持基于Stunnel的客户端与服务端TLS加密传输(参考文档:Stunnel安装和配置)。在开启公网访问时,指定的CA会为每个实例生成唯一的服务证书。客户端可以使用从服务控制台上下载的CA根证书,并在连接实例时提供该证书,对实例服务端进行认证并达到加密传输的目的。 Redis 4.0/5.0不支持SSL加密传输,仅支持明文传输。 父主题: Redis使用
  • 查找匹配Key 在大Key和热Key分析中,不支持按照指定格式分析,如果需要查找指定前缀或者后缀格式的Key,您可以使用scan命令,根据指定格式进行匹配查找。 例如,需要查找Redis实例中包含a关键字的Key,可以使用Redis-cli工具,执行以下命令: ./redis-cli -h {redis_address} -p {port} [-a password] --scan --pattern '*a*'
  • 遍历所有Key 由于keys命令复杂度高,容易导致Redis无响应,所以禁止使用keys命令遍历实例所有的Key。如果需要在Redis实例中遍历所有的Key,可以使用Redis-cli工具,执行以下命令可以遍历Redis实例的所有key。 ./redis-cli -h {redis_address} -p {port} [-a password] --scan --pattern '*' scan命令的使用方法,可以参考Redis官方网站。
  • 为什么实例实际可用内存比申请规格小而且已使用内存不为0? 由于系统开销会占用部分资源,主备实例的持久化也需要一部分资源,所以Redis 3.0和Memcached实例创建后,缓存实例实际可用内存小于申请规格。除了用户存储数据外,Redis-server内部的buffer以及内部数据结构会占用一部分内存。所以缓存实例创建后,实例已使用内存量不为0。其他版本的实例不涉及该问题。 父主题: Redis使用
  • 监控数据出现实例已使用内存略大于实例可使用内存是什么原因? DCS单机和主备实例已使用内存为redis-server进程统计的已使用内存。集群是基于分片机制实现的,集群的已使用内存为各个分片redis-server的已使用内存的总和。 由于开源redis-server内部机制的原因,有时会出现DCS缓存实例已使用内存略大于可使用内存的情况,此为正常现象。 Redis通过zmalloc来分配内存,不会在每一次分配内存时都检查是否会超过max_memory,而是在周期任务以及命令处理的开头处等地方,判断一次当前的used_memory是否超过max_memory,如果超过就触发逐出操作。所以,对于max_memory策略的限制实施并不是实时、刚性的,会出现某个时间used_memory大于max_memory的情形。 父主题: 监控告警
  • Redis/Memcached实例创建失败的可能原因 子网IP不足 分析:单机实例需要绑定1个子网IP地址,主备实例需要绑定2个子网IP地址,集群实例有多个节点,需要绑定多个IP地址。 解决方案:在VPC内可以跨子网访问实例,因此,如果子网IP资源不足,可以更换子网创建实例或者释放当前子网下其他IP地址 IAM 用户(子用户)没有创建权限 分析:用户所属组需要拥有“DCS FullAccess”策略或“DCS Administrator”角色或者拥有创建DCS实例的权限。 解决方案:使用管理员用户创建DCS实例。 父主题: 购买和权限
  • 问题分析 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/Memcached实例变更失败的原因 检查是否有其他任务在执行。 实例变更过程中,同时有其他任务在执行。例如实例正在重启的同时,执行删除或扩容操作,或者实例正在扩容的时候,执行删除操作。 遇到实例变更操作失败,可以稍后尝试,如果仍然存在问题,请提工单联系技术支持。 如果是主备变更为Proxy集群,请确认主备实例DB0以外的DB是否有数据,如果非DB0外的其他DB上有数据(如DB1有数据),会出现变更失败。 数据必须是只存储在DB0上的主备实例才支持变更为Proxy集群。 父主题: 扩容缩容与实例升级
  • Redis命令执行失败的可能原因 Redis命令执行失败,一般有以下可能原因: 命令拼写不正确 如下图所示,命令拼写有误,Redis实例返回“ERR unknown command”,删除key的正确命令为del。 在低版本Redis实例运行高版本命令 如下图所示,在Redis 3.0版本运行Redis 5.0新增的Stream相关命令,Redis实例返回命令出错信息。 DCS Redis不支持的部分命令。 出于安全原因,DCS禁用了部分命令,具体参考Redis命令的兼容性,查看禁用命令与受限使用命令。 在控制台提供的webcli界面执行命令失败。 webcli工具除了同样不支持上述列出的禁用命令与受限命令,对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命令
  • Redis实例是否支持版本升级,如Redis 4.0升级到Redis 5.0? 暂不支持直接升级。Redis不同版本的底层架构不一样,在创建Redis实例时,确定Redis版本后,不能修改,如Redis 4.0的实例不能升级到Redis 5.0。 如您的业务需要使用Redis高版本的功能特性,可重新创建高版本Redis实例,然后将原有Redis实例的数据迁移到高版本实例上。具体数据迁移操作,可参考数据迁移指南。 父主题: 扩容缩容与实例升级
  • Redis命令执行不生效 如果客户端代码业务异常,怀疑是Redis命令不生效,则可以通过Redis-cli命令进行命令执行和数据查看,判断Redis命令执行是否异常。 以下列举两个场景: 场景一:通过设置key值和查看key值,即可判断该命令是否生效。 Redis通过set命令写String类型数据,但是数据未变化,则可以使用Redis-cli命令访问Redis实例,执行如下命令: 场景二:通过expire命令设置过期事件,但是怀疑过期时间不对,则可以执行如下操作: 设置10秒过期时间,然后执行ttl命令查看过期时间,如下图表示,执行ttl命令时,过期时间剩下7秒。 Redis客户端和服务端通过二进制协议进行通信,使用Redis-cli、Jedis、Python客户端并没有差异。 因此如果怀疑Redis有问题,但是使用Redis-cli排查没问题,那就很可能是业务代码存在问题,如果日志没有明显错误信息,则建议在代码添加日志支撑进一步分析。 父主题: Redis命令
  • Redis 3.0 Proxy集群不支持redisson分布式锁的原因 redisson分布式锁的加锁和解锁流程如下: redisson分布式锁的加锁和解锁都是执行一段lua脚本功能实现的。 在加锁阶段,需要在lua脚本中执行exists、hset、pexpire、hexists、hincrby、pexpire、pttl命令。 在解锁阶段,需要在lua脚本中执行exists、publish、hexists、pexpire、del命令。 由于Proxy集群支持publish/subscribe(redis的发布订阅)时,是需要在Proxy节点上识别publish/subscribe命令,做一些特殊处理(转发给所有redis-server的节点),因此不支持直接在lua脚本中执行publish命令。 因此,Redis 3.0 Proxy集群无法支持redisson的分布式锁机制,如果需要使用redisson分布式锁功能,建议使用Redis 4.0或Redis 5.0集群。 父主题: Redis使用
  • 使用redis_exporter出错怎么办? 通过在命令行启动redis_exporter,根据界面输出,查看是否存在错误,根据错误描述,进行问题排查。 [root@ecs-swk /]./redis_exporter -redis.addr 192.168.0.23:6379INFO[0000] Redis Metrics Exporter V0.15.0 build date:2018-01-19-04:08:01 sha1: a0d9ec4704b4d35cd08544d395038f417716a03a Go:go1.9.2INFO[0000] Providing metrics at :9121/metricsINFO[0000] Connecting to redis hosts: []string{192.168.0.23:6379}INFO[0000] Using alias:[]string{""} 父主题: Redis使用
  • 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。 DB的个数不支持修改,每个DB的大小也不支持自定义。 父主题: Redis使用
  • Redis实例支持的单个Key和Value数据大小是否有限制? Key的大小上限为512M。 建议key的大小不超过1KB,这样既节约存储空间,也利于Redis进行检索。 String类型的value值上限为512M。 集合、链表、哈希等key类型,单个元素的value上限为512M。 事实上,集合、链表、哈希都可以看成由String类型的key按照一定的映射关系组合而成。 同时,请注意避免对大Value进行长时间高并发写入,这样会影响网络传输效率,也会增加redis-server的内部处理耗时,从而导致请求时延较大。 父主题: Redis使用
  • 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使用
  • 性能问题导致连接超时 使用了keys等消耗资源的命令,导致CPU使用率超高;或者实例没有设置过期时间、没有清除已过期的Key,导致存储的数据过多,一直在内存中,内存使用率过高等,这些都容易出现访问缓慢、连接不上等情况。 建议客户改成scan命令或者禁用keys命令。 查看监控指标,并配置对应的告警。监控项和配置告警步骤,可查看必须配置的监控告警。 例如,可以通过监控指标“内存利用率”和“已用内存”查看实例内存使用情况、“活跃的客户端数量”查看实例连接数是否达到上限等。 检查实例是否存在大Key和热Key。 DCS控制台提供了大Key和热Key的分析功能,具体使用,请参考分析Redis实例的大Key和热Key。
  • 公网连接Redis (仅Redis 3.0涉及) 在进行公网访问时,请先仔细阅读公网连接章节,检查实例是否满足公网访问的要求。 连接时提示:Error: Connection reset by peer或者出现:远程主机强迫关闭一个现有的连接。 原因1:安全组没有配置正确。 解决方法:需要允许Redis实例被访问,具体配置操作和公网连接操作,请按照公网连接章节中的操作进行。 原因2:查看Redis所在vpc子网是否被ACL关联,同时这个ACL出方向被限制了。若是,放开限制。 原因3:开启了SSL加密传输,连接时没有安装配置Stunnel,直接使用了界面提示的IP地址进行连接。 解决方法:开启SSL加密时,必须安装配置Stunnel客户端,具体操作,请按照公网连接Redis实例(开启SSL加密)执行。其中,请注意,在连接Redis实例命令中,IP地址需要配置为Stunnel客户端地址和端口,不要使用控制台展示的Redis实例公网连接地址和端口。 已经开启了公网访问的Redis实例,公网访问被关闭了,无法使用公网访问。 原因:该Redis实例绑定的弹性公网IP被解绑,导致Redis实例公网被关闭。 解决方法:在控制台重新开启实例的公网访问,绑定弹性公网IP,并重新连接。
  • 客户端连接问题 在使用Redis-cli连接Cluster集群时,连接失败。 解决方法:请检查连接命令是否加上-c,在连接Cluster集群节点时务必使用正确连接命令。 Cluster集群连接命令: ./redis-cli -h {dcs_instance_address} -p 6379 -a {password} -c 单机、主备、Proxy集群连接命令: ./redis-cli -h {dcs_instance_address} -p 6379 -a {password} 具体连接操作,请参考Redis-cli连接。 出现Read timed out或Could not get a resource from the pool。 解决方法: 排查是否使用了keys命令,keys命令会消耗大量资源,造成Redis阻塞。建议使用scan命令替代,且避免频繁执行。 排查实例是否是Redis 3.0,Redis 3.0底层用的是sata盘,当Redis数据持久化即AOF时,会触发偶现的磁盘性能问题,导致连接异常,可更换Redis实例为4.0及以上版本,其底层是ssd盘,磁盘性能更高,或若不需要持久化可关闭AOF。 出现unexpected end of stream错误,导致业务异常。 解决方法: Jedis连接池调优,建议参考Jedis参数配置建议进行配置连接池参数。 排查是否大key较多,建议根据优化大key排查优化。 连接断开。 解决方法: 调整应用超时时间。 优化业务,避免出现慢查询。 建议使用scan命令替代keys命令。 Jedis连接池问题,请参考使用Jedis连接池报错如何处理?。
  • Redis和ECS之间的连接问题 客户端所在的ECS必须和Redis实例在同一个VPC内,并且需要确保ECS和Redis之间可以正常连接。 如果是Redis 3.0或企业版实例,Redis和ECS的安全组没有配置正确,连接失败。 解决方法:配置ECS和Redis实例所在安全组规则,允许Redis实例被访问。具体配置,可以参考配置安全组。 如果是Redis 4.0/5.0/6.0基础版实例,开启了白名单功能,连接失败。 如果实例开启了白名单,在使用客户端连接时,需要确保客户端IP是否在白名单内,如果不在白名单,会出现连接失败。具体配置操作,可以参考配置白名单。客户端IP如果有变化,需要将变化后的IP加入白名单。 Redis实例和ECS不在同一个Region。 解决方法:不支持跨Region访问,可以在ECS所在的Region创建Redis实例,创建时注意选择与ECS相同VPC,创建之后,使用数据迁移进行迁移,将原有Redis实例数据迁移到新实例中。 Redis实例和ECS不在同一个VPC。 不同的VPC,网络是不相通的,不在同一VPC下的ECS是无法访问Redis实例。可以通过创建VPC对等连接,将两个VPC的网络打通,实现跨VPC访问Redis实例。 关于创建和使用VPC对等连接,请参考VPC对等连接说明。
  • 带宽超限导致连接问题 当实例已使用带宽达到实例规格最大带宽,可能会导致部分Redis连接超时现象。 您可以查看监控指标“流控次数”,统计周期内被流控的次数,确认带宽是否已经达到上限。 然后,检查实例是否有大Key和热Key,如果存在大Key或者单个Key负载过大,容易造成对于单个Key的操作占用带宽资源过高。大Key和热Key操作,请参考分析实例大Key和热Key。 Redis 4.0及之后版本的实例,支持通过控制台对Redis实例进行带宽的临时扩容(7天内有效),可用于临时解决业务流量高峰,带宽超限的问题。
共100000条