spring-boot連接測試環(huán)境redis-cluster報 ndoe xxxx is unknown to cluster

一. 背景

有一天,同事在進行測試環(huán)境項目啟動時轰异,發(fā)現(xiàn)項目啟動不了了岖沛,看了一下日志,發(fā)現(xiàn)是redis連接不上搭独,測試又特別著急要測試即將上線的項目婴削,因此我快速的開始了bug的解決。我們項目使用的是redis-cluster牙肝,一共部署了6個redis唉俗,其中四臺是master,兩臺slave配椭,情況如下虫溜。

問題發(fā)生時的redis-cluster集群情況

spring-cloud中redis集群配置

二. 問題解決

2.1 百度

遇到這個問題后第一時間想到的是百度,但是發(fā)現(xiàn)搜索了很久都沒有一篇與這個問題相似的文章股缸。于是沒有辦法衡楞,只能自己一點點慢慢追蹤bug了。

2.2 查看服務器集群信息

根據(jù)提示信息敦姻,我第一時間想到的是7001結點宕機了瘾境,于是登錄7001所在服務器,查看了一下集群狀態(tài)镰惦,發(fā)現(xiàn)集群健康迷守,然后到redis-cli進入redis中查看集群信息

[root@centos-43 bin]# ./redis-cli -c -p 7001 -h 172.16.1.14
172.16.1.14:7001> cluster nodes

730376eb543eea5d0688493446f7048b05305fb3 172.16.1.15:7002 slave 3250e26afd654e3480dc9592b5bccb0c67b772b5 0 1630052995292 22 connected
3250e26afd654e3480dc9592b5bccb0c67b772b5 172.16.1.18:7005 master - 0 1630052993290 22 connected 5461-10922
98a20c554b733a254b79e7e795b8f81b6e73d0bf 172.16.1.19:7006 slave 5742015521dc500addc090d46c9fa85624f023d9 0 1630052993790 14 connected
e4dce6887c19274e7a5445f7a031dcba05b28e91 172.16.1.14:7001 master - 0 1630052994792 0 connected
ae4dea0536889fa0aa2b18b5900fbf3ef47aeafd 172.16.1.17:7004 master - 0 1630052995393 11 connected 0-5460
5742015521dc500addc090d46c9fa85624f023d9 172.16.1.16:7003 myself,master - 0 0 14 connected 10923-16383
172.16.1.14:7001> cluster info

cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:4
cluster_current_epoch:23
cluster_my_epoch:23
cluster_stats_messages_sent:433846
cluster_stats_messages_received:525659

集群狀態(tài)良好。然后再使用Redis Desktop Manager看是否能連接上redis旺入,發(fā)現(xiàn)可以正常連接上兑凿,又在本地ping了一下172.16.1.14telnet 172.16.1.14 7001眨业,都能夠正常連接急膀。這就感覺很奇怪了,代碼也沒有改動龄捡,redis也是正常啟動的卓嫂,怎么會報錯呢?

2.3 查看源碼

無奈,只能從源碼開始看起聘殖,由于問題已經(jīng)解決晨雳,所以我沒有異常棧的信息了,因此只能展示報錯位置

image-20210827172521671.png

JedisClusterConnectiongetResourceForSpecificNode方法中奸腺,報了IllegalArgumentException餐禁,說是Node 172.16.1.14:7001 is unknown to cluster,意思是 172.16.1.14:7001這個結點不能被集群感知到突照。這個方法里面調(diào)用了getResourcePoolForSpecificNode方法

image-20210830112726789.png
image-20210830112849035.png
image-20210830112901171.png

帮非,中間幾個追蹤的類這里就不多展示,直接到最后的位置,


image-20210827175416185.png
image-20210827175640190.png
image-20210827175153983.png
image-20210827175209982.png

上面那行代碼取出的RedisClusterNode就是從這個nodes參數(shù)轉換而來的末盔,這個nodes是一個由ip:port為key筑舅,JedisPool為value的map。

接下來回過頭看getResourcePoolForSpecificNode方法陨舱,發(fā)現(xiàn)其實就是從nodes這個map里面娶不到傳入的那個node翠拣,那么為什么會取不到呢?我們?nèi)フ艺疫@個node是怎么來的游盲。

從異常椢竽梗看JedisClusterConnectiongetResourceForSpecificNode方法的調(diào)用方,可以發(fā)現(xiàn)有以下調(diào)用鏈益缎。

image-20210827175742088.png
image-20210827175800996.png
image-20210827175807638.png

追到這個位置后谜慌,我打了個斷點,啟動了一下項目莺奔,看了一下代碼畦娄,重點是在initializeSlotsCach方法里面調(diào)用了cache.discoverClusterNodesAndSlots,而這個方法的代碼大概的意思是加載了配置里配置的集群信息弊仪,之后調(diào)用集群中一個結點來獲取這個集群中所有的分配了槽的結點并加入上面提到的nodes中熙卡。

2.4 得出結論

于是我們可以發(fā)現(xiàn),是在將第二個nodes里的node遍歷傳入励饵,并判斷是否在第一個nodes中驳癌,然后報錯的,那為什么在第一個nodes中不存在172.16.1.14:7001結點呢役听?這兩個nodes的區(qū)別在哪里呢颓鲜?仔細比對兩段添加nodes的代碼可以發(fā)現(xiàn),第一個地方傳入的時候是直接將集群中所有結點放入進去典予,而第二個甜滨,則對槽進行了判斷,這意味著可能有的master結點并沒有分配槽瘤袖,因此這個結點便沒有加入到第二個nodes中衣摩。

意識到這一點之后,我便去服務器上再看了一眼集群信息捂敌,發(fā)現(xiàn)172.16.1.14:7001這個結點確實沒有分配槽

問題發(fā)生時的redis-cluster集群情況

三. 重新分配槽

redis-cluster的操作是有一個redis-trib.rb腳本艾扮,這個腳本里面封裝了一些操作,其中就包括了往集群中增加機器后重新分配槽的命令

命令格式: redis-trib.rb reshard 節(jié)點h:p (此處可以參考https://blog.csdn.net/weixin_42363154/article/details/112367865這篇文章占婉,講的很詳細)

于是進入到redis-trib.rb所在的服務器泡嘴,再進入redis-trib.rbsrc目錄下執(zhí)行命令

./redis-trib.rb reshard reshard 172.16.1.14:7001

執(zhí)行完命令后,還有幾個選項逆济,包括給這個結點分配的槽數(shù)酌予、從其他結點分別轉移多少個槽到這個結點等等磺箕,一一填寫后,執(zhí)行命令

利用redis-trib.rb的命令重新分配結點槽位

執(zhí)行完成后的集群情況如下

重新分配槽之后的redis-cluster集群情況

可以看到抛虫,槽已經(jīng)重新分配成功滞磺,7001結點從其他結點分配過來了0-1364 5461-6826 10923-12287這三個段的槽

redis-cluster弄好之后,重啟項目莱褒,重啟成功!問題解決

四. 總結

測試環(huán)境的redis已經(jīng)使用好幾年了涎劈,一直都沒有問題广凸,不知道是不是因為有人操作過導致這一次問題,因為是測試環(huán)境蛛枚,因此賬號密碼是內(nèi)部公開的谅海。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蹦浦,隨后出現(xiàn)的幾起案子扭吁,更是在濱河造成了極大的恐慌,老刑警劉巖盲镶,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侥袜,死亡現(xiàn)場離奇詭異,居然都是意外死亡溉贿,警方通過查閱死者的電腦和手機枫吧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宇色,“玉大人九杂,你說我怎么就攤上這事⌒洌” “怎么了例隆?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長抢蚀。 經(jīng)常有香客問我镀层,道長,這世上最難降的妖魔是什么皿曲? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任鹿响,我火速辦了婚禮,結果婚禮上谷饿,老公的妹妹穿的比我還像新娘惶我。我一直安慰自己,他們只是感情好博投,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布绸贡。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪听怕。 梳的紋絲不亂的頭發(fā)上捧挺,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機與錄音尿瞭,去河邊找鬼闽烙。 笑死,一個胖子當著我的面吹牛声搁,可吹牛的內(nèi)容都是我干的黑竞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼疏旨,長吁一口氣:“原來是場噩夢啊……” “哼很魂!你這毒婦竟也來了?” 一聲冷哼從身側響起檐涝,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤遏匆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后谁榜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幅聘,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年窃植,在試婚紗的時候發(fā)現(xiàn)自己被綠了喊暖。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡撕瞧,死狀恐怖陵叽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情丛版,我是刑警寧澤巩掺,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站页畦,受9級特大地震影響胖替,放射性物質發(fā)生泄漏。R本人自食惡果不足惜豫缨,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一独令、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧好芭,春花似錦燃箭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽敬拓。三九已至,卻和暖如春裙戏,著一層夾襖步出監(jiān)牢的瞬間乘凸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工累榜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留营勤,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓壹罚,卻偏偏與公主長得像葛作,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子渔嚷,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355