Redis与ECS之间的连接问题
在ECS实例上通过内网地址访问Redis实例需要确保ECS与Redis之间可以相互连接。如果二者无法互访,可能是下列原因引起的。
Redis实例和ECS实例不在同一账号下。解决方法: 使用RDB文件将Redis实例迁移到ECS实例所在账号下的同一VPC中,操作方法请参见使用redis-shake迁移RDB文件内的数据。 跨账号连接Redis与ECS实例。 ECS与Redis不在相同地域。解决方法:
在ECS所在地域创建新的Redis实例,将源实例中的数据迁移到新实例中,操作步骤请参见使用redis-shake迁移RDB文件内的数据。
ECS与Redis的网络类型不同,一方是经典网络而另一方是VPC网络。解决方法: 将Redis实例的网络类型转换为VPC,请参见切换Redis实例的网络类型。 快速实现不同网络的ECS与Redis实例互访。 ECS的安全组规则阻塞了对Redis地址和端口的访问。解决方法:
添加安全组规则,允许访问。
Redis的白名单中未加入ECS的内网地址。解决方法:
设置Redis白名单,将ECS的内网IP加入其中。
说明 如果出现 Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: 拒绝连接 (Connection refused),请检查Redis白名单设置,若白名单设置无误且可以在ECS上 ping通Redis实例,请检查应用中的连接配置。 ECS行为异常触发安全策略,导致服务被禁止。如果多台正常连接到Redis的ECS实例中有某个实例出现突发的连接问题,尤其是ECS能ping通Redis但telnet 6379端口失败时,可能是该ECS存在异常行为(例如对外攻击)导致服务被禁止。解决方法:
请检查服务器,在安全组的出方向设置精确的规则,比如限定该ECS只能访问业务需要的地址和端口,此处为Redis实例的6379端口。若问题还不能解决,请提交工单进行详细排查。
DNS解析问题。客户端出现UnknownHostException或者failed to connect: r-***************.redis.rds.aliyuncs.com could not be resolved之类的报错。解决方法:
用ping或者telnet命令测试Redis连接地址的解析情况,如不成功请检查DNS配置。
说明 如因条件限制无法实施以上解决方案,您可以提交工单重新创建ECS或Redis实例,使二者在同一VPC中。