场景: redis集群三主三从, jedis接入, 只配置三个主节点
问题: 服务更新部署,发现连不上redis集群.包connection refused.
排查:
- 首先确定redis节点是否存在问题, redis-cli在当前服务器没有安装,使用telnet ip port进行测试, 发现三个节点中部分节点存在问题, 不能连接.
- 找运维确认节点状态,表示之前节点故障, 主从自动替换.
- 服务重启前运行正常, 重启出现问题,无法回滚.
发现:
- redis集群自动主从替换,服务无感知, 和下线节点之间的连接会自动和新节点建立连接
- 服务重新启动,服务会重新和配置中的ip建立连接,此步骤出错
解决方案:
jedis集群在添加节点时, 并不验证节点的可用性,需要我们在初始化的时候,自行进行校验,于是在cluster添加节点前,使用redis包自带的Connection进行校验.
import redis.clients.jedis.Connection;
private boolean validateConnection(String host, int port) {
Connection connection = new Connection(host, port);
try {
connection.connect();
} catch (Exception e) {
log.error("failed get connection with ip {}, port {}", host, port);
return false;
} finally {
connection.close();
}
return true;
}
可建立连接的节点,添加到集群中.