動(dòng)態(tài)添加Redis密碼認(rèn)證的方法
如果redis已在線上業(yè)務(wù)使用中,但沒有添加密碼認(rèn)證,那么如何在不影響業(yè)務(wù)服務(wù)的前提下給redis添加密碼認(rèn)證,就是一個(gè)需要仔細(xì)考慮的問題。
本文描述一種可行的方案,適用于客戶端使用了jedis連接池,服務(wù)端使用了redis master-slave集群的情況。
1.定制jedis
對(duì)redis返回的錯(cuò)誤的處理,做兩處修改:
忽略 (error) ERR Client sent AUTH, but no password is set。使配置了密碼的jedis可以在沒有配置密碼redis上使用;
發(fā)生(error) NOAUTH Authentication required時(shí),將當(dāng)前connection置為broken,從而將連接踢出連接池。這樣動(dòng)態(tài)給redis添加上密碼時(shí),jedis會(huì)自動(dòng)重新創(chuàng)建可用連接。
我已經(jīng)對(duì)jedis 2.8.x版本做好了以上修改。可以直接下載使用 。如果使用了更高的版本jedis,可以參考我的代碼自行修改;如果使用了更低版本的,建議升級(jí)到2.8.x。
2.在項(xiàng)目代碼中使用定制的jedis
修改maven配置。將原來的jedis依賴注釋掉,添加對(duì)本地的定制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所在的相對(duì)路徑 --> </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> -->
因?yàn)榘讯ㄖ苆edis通過本地jar包的形式提供,maven不會(huì)自動(dòng)加載jedis的依賴,所以需額外添加對(duì)commons-pool2的依賴。
3.如果使用了低版本的jedis
老版本jedis的returnBrokenResource和returnResource這兩個(gè)方法在新版本jedis中已經(jīng)廢棄,如果升級(jí)jedis版本的話,需要替換為close方法。
替換前:
try { // ... } catch (JedisException e) { // ... pool.returnBrokenResource(jedis); } finally { pool.returnResource(jedis); }
替換后:
try { // ... } catch (JedisException e) { // ... } finally { jedis.close(); }
4.將使用定制jedis的項(xiàng)目代碼上線
此時(shí)redis尚未添加密碼,但定制jedis忽略了“ERR Client sent AUTH, but no password is set”,所以線上運(yùn)行正常。
5.給redis server添加密碼認(rèn)證
動(dòng)態(tài)添加密碼會(huì)導(dǎo)致redis主從同步斷開,為避免引起全量同步對(duì)業(yè)務(wù)造成較大影響。需要dba先調(diào)大redis master的client-output-buffer-limit和repl-backlog-size參數(shù),再做配置密碼操作。
給redis server添加密碼的同時(shí),觀察業(yè)務(wù)代碼的log,添加完密碼后,log中會(huì)出現(xiàn)數(shù)次如下報(bào)錯(cuò),隨后恢復(fù)正常。報(bào)錯(cuò)次數(shù)是添加密碼時(shí),業(yè)務(wù)服務(wù)器的jedis連接池中與該redis server之間連接數(shù)量。
redis.clients.jedis.exceptions.JedisConnectionException: NOAUTH Authentication required.
如果使用了shardedJedis,請逐個(gè)分片進(jìn)行操作,最小化對(duì)業(yè)務(wù)服務(wù)的影響。
6.更換jedis為官方版本
定制jedis就是為了動(dòng)態(tài)添加密碼認(rèn)證。添加完畢后,換回官方j(luò)edis,方便今后升級(jí)。
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.8.1</version> </dependency>
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python腳本實(shí)現(xiàn)Redis未授權(quán)批量提權(quán)
這篇文章主要給大家介紹了關(guān)于利用python腳本實(shí)現(xiàn)redis未授權(quán)批量提權(quán)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09如何使用Redis實(shí)現(xiàn)電商系統(tǒng)的庫存扣減
在日常開發(fā)中有很多地方都有類似扣減庫存的操作,本文主要介紹了如何使用Redis實(shí)現(xiàn)電商系統(tǒng)的庫存扣減,具有一定的參考價(jià)值,感興趣的可以了解一下2022-01-01Redis常用的數(shù)據(jù)結(jié)構(gòu)及實(shí)際應(yīng)用場景
本文介紹了Redis中常用的數(shù)據(jù)結(jié)構(gòu),包括字符串、列表、集合、哈希表、有序集合和Bitmap,并詳細(xì)說明了它們在各種場景下的使用,需要的朋友可以參考下2024-05-05