云服务器内容精选

  • 应该选择 域名 还是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缓存实例。 父主题: 客户端和网络连接
  • 性能问题导致连接超时 使用了keys等消耗资源的命令,导致CPU使用率超高;或者实例没有设置过期时间、没有清除已过期的Key,导致存储的数据过多,一直在内存中,内存使用率过高等,这些都容易出现访问缓慢、连接不上等情况。 建议客户改成scan命令或者禁用keys命令。 查看监控指标,并配置对应的告警。监控项和配置告警步骤,可查看必须配置的监控告警。 例如,可以通过监控指标“内存利用率”和“已用内存”查看实例内存使用情况、“活跃的客户端数量”查看实例连接数是否达到上限等。 检查实例是否存在大Key和热Key。 D CS 控制台提供了大Key和热Key的分析功能,具体使用,请参考分析Redis实例的大Key和热Key。
  • 公网连接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连接超时现象。 您可以查看监控指标“流控次数”,统计周期内被流控的次数,确认带宽是否已经达到上限。 然后,检查实例是否有大Key和热Key,如果存在大Key或者单个Key负载过大,容易造成对于单个Key的操作占用带宽资源过高。大Key和热Key操作,请参考分析实例大Key和热Key。 Redis 4.0及之后版本的实例,支持通过控制台对Redis实例进行带宽扩容,可用于解决带宽超限的问题。
  • 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对等连接说明。
  • 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)。
  • 使用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。 网卡名请改成实际的网卡名称。 父主题: 客户端和网络连接
  • 使用Redis实例的发布订阅(pubsub)有哪些注意事项? Redis实例的发布订阅功能详细信息参见Pub/Sub,使用Redis发布订阅功能时有如下事项请注意: 客户端需要及时消费和处理消息。 客户端订阅了channel之后,如果接收消息不及时,可能导致DCS实例消息堆积,当达到消息堆积阈值(默认值为32MB),或者达到某种程度(默认8MB)一段时间(默认为1分钟)后,服务器端会自动断开该客户端连接,避免导致内部内存耗尽。 客户端需要支持重连。 当连接断开之后,客户端需要使用subscribe或者psubscribe重新进行订阅,否则无法继续接收消息。 不建议用于消息可靠性要求高的场景中。 Redis的pubsub不是一种可靠的消息系统。当出现客户端连接退出,或者极端情况下服务端发生主备切换时,未消费的消息会被丢弃。 父主题: 客户端和网络连接
  • 主备实例的只读地址是连接到主节点还是备节点? Redis 4.0、Redis 5.0、和Redis 6.0的基础版主备实例的连接信息中,有“连接地址”和“只读地址”。其中,连接地址是连接主备实例的主节点,只读地址是连接主备实例的备节点。 详情可以参考Redis 4.0/5.0/6.0基础版主备实例架构设计。 图1 连接信息 默认情况下,客户端通过主备实例的主节点读、写数据,备节点用于同步数据。如需使用“只读地址”实现读写分离,需要在客户端增加用户读写请求判断,如果是写请求,将请求发送给读写域名,如果是读请求,将请求发送给只读域名。 父主题: 客户端和网络连接
  • 客户端出现概率性超时错误 针对低概率超时错误,是Redis使用的正常现象。Redis使用受到网络传输、客户端设置超时时间等因素影响,可能出现单个请求超时问题。 建议客户业务编码时,具备重试操作,提升业务的可靠性,避免低概率的单次请求失败时业务失败。 当出现了连接超时问题时,可以优先检查Redis是否开启了AOF持久化功能,并根据业务需求,决定是否开启AOF持久化(开启/关闭AOF持久化的影响)。关闭AOF持久化可以提升客户端连接的稳定性,减少出现阻塞,连接不上的情况。 如果出现超时错误概率频繁,请联系技术服务人员。 父主题: 客户端和网络连接