由于Redis 3.0和Redis 4.0/5.0/6.0实例的部署模式不一样,DCS在控制访问缓存实例的方式也不一样,差别如下:
- Redis 3.0:通过配置安全组访问规则控制,不支持白名单功能。安全组配置操作请参考本章节操作。
- Redis 4.0/5.0/6.0:不支持安全组,只支持通过白名单控制。
客户端只能部署在与DCS缓存实例处于相同虚拟私有云(VPC)和相同子网的弹性云主机(ECS)上。
除了ECS、DCS缓存实例必须处于相同VPC和相同子网之外,还需要将安全组分别配置了正确的规则,客户端才能访问DCS缓存实例。
- 如果ECS、DCS缓存实例配置了相同的安全组,安全组创建后,默认包含组内网络访问不受限制的规则。
- 如果ECS、DCS缓存实例配置了不同的安全组,可参考如下配置方式:
a. 配置ECS所在安全组。
ECS所在安全组需要增加出方向规则,以保证客户端能正常访问DCS缓存实例。如果出方向规则不受限,则不用添加。
b. 配置DCS缓存实例所在安全组。
DCS实例所在安全组需要增加入方向规则,以保证能被客户端访问。


不支持在DCS实例绑定弹性IP进行公网访问的方式。您必须通过同一虚拟私有云下的弹性云主机来访问缓存实例,以确保缓存数据的安全。
跨VPC访问,即客户端和实例是否在同一个VPC。
一般情况下,不同VPC间网络不互通,不在同一VPC下的弹性云主机无法访问DCS缓存实例。
对于单机和主备类型的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对等连接,请参考《虚拟私有云 用户指南》的“对等连接”章节。
报错信息是指实例设置了免密访问。连接时不输入密码,即可避免上述错误。
原因分析:客户端使用长连接,或者连接池,用完后关闭与DCS实例的连接,再次使用时,出现报错。
解决方案:使用长连接或连接池,用完后不要关闭连接;如果发现连接中断,请重新建连。
针对低概率超时错误,是Redis使用的正常现象。Redis使用受到网络传输、客户端设置超时时间等因素影响,可能出现单个请求超时问题。
建议客户业务编码时,具备重试操作,提升业务的可靠性,避免低概率的单次请求失败时业务失败。
当出现了连接超时问题时,可以优先检查Redis是否开启了aof持久化功能,这需要根据业务需求,决定是否开启,防止出现阻塞,连接不上的情况。
如果出现超时错误概率频繁,请联系服务运维。
在使用Jedis连接池JedisPool模式下,比较常见的报错如下:
讯享网
首先确认DCS缓存实例是正常运行中状态,然后按以下步骤进行排查。
步骤 1 网络
- 核对IP地址配置
检查jedis客户端配置的ip地址是否与DCS缓存实例配置的子网地址一致。
- 测试网络
在客户端使用ping和Telnet小工具测试网络。
− 如果ping不通:
VPC内访问Redis 3.0实例时,要求客户端与DCS缓存实例的VPC相同,安全组相同或者DCS缓存实例的安全组放开了6379端口访问。
− 如果IP地址可以ping通,telnet对应的端口不通,则尝试重启实例,如重启后仍未恢复,请联系技术支持。
步骤 2 检查连接数是否超限
查看已建立的网络连接数是否超过JedisPool 配置的上限。如果连接数接近配置的上限值,则建议重启服务观察。如果明显没有接近,排除连接数超限可能。
Unix/Linux系统使用:
netstat -an | grep 6379 | grep ESTABLISHED | wc -l
Windows系统使用:

netstat -an | find "6379" | find "ESTABLISHED" /C
步骤 3 检查JedisPool连接池代码
如果连接数接近配置的上限,请分析是业务并发原因,或是没有正确使用JedisPool所致。
对于JedisPool连接池的操作,每次调用 jedisPool.getResource() 方法之后,需要调用 jedisPool.returnResource() 或者 jedis.close() 进行释放,优先使用close()方法。
步骤 4 客户端TIME_WAIT是否过多
通过ss -s查看time wait链接是否过多。


如果TIME_WAIT过多,可以调整内核参数(/etc/sysctl.conf):
讯享网
调整后重启生效:/sbin/sysctl -p
步骤 5 无法解决问题
如果按照以上原因排查之后还有问题,可以通过抓包并将异常时间点、异常信息以及抓包文件发送给技术支持协助分析。
抓包可使用tcpdump工具,命令如下:
tcpdump -i eth0 tcp and port 6379 -n -nn -s 74 -w dump.pcap
Windows系统下还可以安装Wireshark工具抓包。
客户端访问Redis实例出现“ERR unknown command”的原因是什么?
有以下可能原因:
- 命令拼写不正确
如下图所示,命令拼写有误,Redis实例返回“ERR unknown command”,删除String的正确命令为 del 。


- 在低版本Redis实例运行高版本命令
如下图所示,在Redis3.0版本运行Redis5.0新增的Stream相关命令,Redis实例返回命令出错信息。


- 部分命令被禁用
DCS Redis实例接口与开源Redis在数据访问方面完全兼容。但因易用性和安全性的原因,部分管理操作不能从Redis客户端发起,具体禁用的命令清单,请参考Redis命令。
如下介绍通过内网使用Redis-desktop-manager访问Redis实例的操作:
1.填写DCS实例子网地址,端口6379,以及相应密码。
2.单击左下角“测试连接”。
提示成功后,说明连接正常。
通过内网使用Redis-desktop-manager访问Redis实例

使用SpringCloud时出现ERR Unsupported CONFIG subcommand怎么办?
DCS的Redis实例可以配合Spring_Session进行Session共享。DCS的Redis实例对接SpringCloud时,遇到如下错误信息:
Spring Cloud报错信息


原因为出于安全考虑,DCS暂不支持客户端发起的CONFIG命令,需要按如下步骤进行操作:
- 通过管理控制台修改Redis实例的配置参数notify-keyspace-event,将值指定为“Egx”。
- 在Spring框架的XML配置文件中,增加如下:
<util:constant
static-field="org.springframework.session.data.redis.config.ConfigureRedisAction.NO_OP"/>
- 修改Spring相关代码,通过启用ConfigureRedisAction.NO_OP这个bean组件,禁止通过客户端调用CONFIG命令,避免报错。
@Bean
public static ConfigureRedisAction configureRedisAction() {

return ConfigureRedisAction.NO_OP;
}
更多说明,可参考Spring官方文档。
- Redis实例支持密码模式和免密模式。Redis本身支持不设置密码,客户端可以直接连接Redis缓存服务并使用,但出于安全考虑,建议尽量选用密码模式,通过密码来鉴权验证,提升安全性。若选用密码模式,您需要在创建实例时自定义密码。
- 如需修改Redis访问方式、修改或重置密码,请参考密码管理。
- 检查连接地址
连接地址可从管理控制台的实例详情页面获取。
- 检查密码
密码输入错误时,端口可以连接上,但鉴权认证失败。
- 检查端口
VPC内访问,Redis实例端口默认为6379。
- 检查带宽是否使用超限
当实例使用带宽达到实例规格上限,可能会导致部分Redis连接超时现象。
- 如果是Redis 3.0实例,检查安全组的入方向规则
VPC内访问时,如果Redis客户端和Redis实例绑定了不同的安全组,则需要将Redis实例的入方向安全组放开6379端口。
具体请参考:安全组配置和选择。
- 如果是Redis 4.0/5.0/6.0实例,检查白名单配置
如果实例开启了白名单,在使用客户端连接时,需要确保客户端IP在白名单内,如果不在白名单,会出现连接失败。
客户端IP如果有变化,需要将变化后的IP加入白名单。
- 检查实例配置参数notify-keyspace-events
建议将notify-keyspace-events参数配置为Egx。
- Jedis连接池报错
- 出现Read timed out或Could not get a resource from the pool
排查是否使用了keys命令,keys命令会消耗大量资源,造成Redis阻塞。建议使用scan命令替代,且避免频繁执行。
应用程序通过短连接访问Redis实例时,报错:Cannot assign requested address。
出现这种错误的应用程序使用的架构基本都是php-fpm加上phpredis,这种架构在并发量较大的情况下,处于TIME-WAIT状态下的TCP连接数较多,客户端无法分配出新的端口,则会出现“Cannot assign requested address”问题。
- 方案一:使用pconnect替换connect。
此方案的思路是用长连接替代短连接,减少TCP连接,同时可以避免每次请求都会重新建立连接的问题,减少延时。
之前连接Redis的代码如下:
现使用pconnect替换connect,即使用persistent connection的方式连接。
讯享网
- 方案二:修改客户端所在ECS实例的tcp_max_tw_buckets内核参数。
此方案的思路是直接复用处于TIME-WAIT状态的端口,但是如果ECS和后端服务之间有重传,连接可能会失败,所以建议使用pconnect的方案。
a. 连接客户端所在ECS实例。
b. 执行以下命令,查看ip_local_port_range和tcp_max_tw_buckets参数。
sysctl net.ipv4.tcp_max_tw_buckets net.ipv4.ip_local_port_range
系统显示类似如下:
c. 执行以下命令,修改tcp_max_tw_buckets参数,确保tcp_max_tw_buckets的值比ip_local_port_range范围的值小。
sysctl -w net.ipv4.tcp_max_tw_buckets=10000
一般情况推荐使用方案一,对于一些特定场景(业务代码牵涉过多组件不易变更等场景),需要更快的满足高并发,可以使用方案二
Lettuce客户端及Jedis客户端比较如下:
- Lettuce:
- Lettuce客户端没有连接保活探测,错误连接存在连接池中会造成请求超时报错。
- Lettuce客户端未实现testOnBorrow等连接池检测方法,无法在使用连接之前进行连接校验。
- Jedis:
- Jedis客户端实现了testOnBorrow、testWhileIdle、testOnReturn等连接池校验配置
- 开启testOnBorrow在每次借用连接前都会进行连接校验,可靠性最高,但是会影响性能(每次Redis请求前会进行探测)。
- testWhileIdle可以在连接空闲时进行连接检测,合理配置阈值可以及时剔除连接池中的异常连接,防止使用异常连接造成业务报错。
- 在空闲连接检测之前,连接出现问题,可能会造成使用该连接的业务报错,此处可以通过参数控制检测间隔(timeBetweenEvictionRunsMillis)。
因此,Jedis客户端在面对连接异常,网络抖动等场景下的异常处理和检测能力明显强于Lettuce,可靠性更强。


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/191345.html