欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 宝鼎售后问题提交 | 后台管理


新闻资讯

MENU

软件开发知识

动态添加 昆山软件开发 Redis 暗码认证

点击: 次  来源:宝鼎软件 时间:2017-10-21

原文出处: 措施员赵鑫

假如redis已在线上业务利用中,但没有添加暗码认证,那么如安在不影响业务处事的前提下给redis添加暗码认证,就是一个需要仔细思量的问题。

本文描写一种可行的方案,合用于客户端利用了jedis毗连池,处事端利用了redis master-slave集群的环境。

1.定制jedis

对redis返回的错误的处理惩罚,做两处修改:

忽略 (error) ERR Client sent AUTH, but no password is set。使设置了暗码的jedis可以在没有设置暗码redis上利用;

产生(error) NOAUTH Authentication required时,将当前connection置为broken,劳务派遣管理系统,从而将毗连踢出毗连池。这样动态给redis添加上暗码时,jedis会自动从头建设可用毗连。

我已经对jedis 2.8.x版本做好了以上修改。可以直接下载利用 。假如利用了更高的版本jedis,可以参考我的代码自行修改;假如利用了更低版本的,发起进级到2.8.x。

2.在项目代码中利用定制的jedis

修改maven设置。将本来的jedis依赖注释掉,软件开发,添加对当地的定制jedis的依赖:

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.8.3</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/../libs/jedis-2.8.3.jar</systemPath> <!-- 此处的systemPath是jedis-2.8.3地址的相对路径 -->
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.4.2</version>
</dependency>
<!--
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.8.1</version>
</dependency>
-->

因为把定制jedis通过当地jar包的形式提供,maven不会自动加载jedis的依赖,所以需特别添加对commons-pool2的依赖。

3.假如利用了低版本的jedis

老版本jedis的returnBrokenResource和returnResource这两个要领在新版本jedis中已经废弃,假如进级jedis版本的话,需要替换为close要领。

替换前:

try {   
  // ...  
} catch (JedisException e) {
  // ...   
  pool.returnBrokenResource(jedis);   
}   
finally {   
  pool.returnResource(jedis);   
}

替换后:

try {   
  // ...  
} catch (JedisException e) {   
  // ...   
}   
finally {   
  jedis.close();
}

4.将利用定制jedis的项目代码上线

此时redis尚未添加暗码,但定制jedis忽略了“ERR Client sent AUTH, but no password is set”,所以线上运行正常。

5.给redis server添加暗码认证

动态添加暗码会导致redis主从同步断开,为制止引起全量同步对业务造成较大影响。需要dba先调大redis master的client-output-buffer-limit和repl-backlog-size参数,再做设置暗码操纵。

给redis server添加暗码的同时,调查业务代码的log,添加完暗码后,log中会呈现数次如下报错,随后规复正常。报错次数是添加暗码时,业务处事器的jedis毗连池中与该redis server之间毗连数量。

redis.clients.jedis.exceptions.JedisConnectionException: NOAUTH Authentication required.

假如利用了shardedJedis,请逐个分片举办操纵,最小化对业务处事的影响。

6.改换jedis为官方版本

定制jedis就是为了动态添加暗码认证。添加完毕后,换回官方jedis,利便此后进级。

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.8.1</version>
</dependency>
图纸加密