Nacos下線一臺(tái)引發(fā)線上故障問(wèn)題排查記

背景

產(chǎn)線nacos集群硬件比較差固以,cpu只有2核墩虹,出現(xiàn)了一次cpu滿,導(dǎo)致服務(wù)調(diào)用失敗嘴纺,復(fù)盤(pán)后败晴,要進(jìn)行硬件升級(jí)浓冒,升到4核栽渴,先停1臺(tái),觀察稳懒,剛開(kāi)始沒(méi)有影響闲擦,以為穩(wěn)了,沒(méi)有想到過(guò)了3分鐘场梆,業(yè)務(wù)監(jiān)控指標(biāo)就不行了墅冷,服務(wù)出現(xiàn)調(diào)用失敗,報(bào)No provider 異常,立即重新拉起來(lái)或油,因?yàn)橄戮€一臺(tái)寞忿,就導(dǎo)致1分多鐘的線上故障,一身冷汗啊!!!

nacos作為服務(wù)注冊(cè)中心顶岸,不是AP嗎腔彰,怎么停一臺(tái)就有問(wèn)題。不合理啊辖佣。
為啥剛停沒(méi)有問(wèn)題霹抛,等了3分鐘才出現(xiàn)問(wèn)題,為啥啊

帶著這兩個(gè)問(wèn)題和錯(cuò)誤日志卷谈,花了幾天的時(shí)間排查杯拐,總算是把問(wèn)題弄清楚了,也順便把nacos的同步機(jī)制整明白了世蔗。

日志現(xiàn)象

重新拉起來(lái)后端逼,就立即開(kāi)始了故障分析,因?yàn)闆](méi)有其他異常污淋,就從錯(cuò)誤日志開(kāi)始排查裳食,我們集群三個(gè)節(jié)點(diǎn),發(fā)現(xiàn)另外兩臺(tái)在停掉一臺(tái)3分鐘后芙沥,都出現(xiàn)大批量的鏈接超時(shí)诲祸,刪除了鏈接對(duì)應(yīng)的client浊吏,從而觸發(fā)了推送,導(dǎo)致客戶端沒(méi)有了節(jié)點(diǎn)可用救氯。

客戶端空保護(hù)

dubbo consumr在路由時(shí)找田,如果對(duì)打tag的機(jī)器做路由不能給正常的機(jī)器使用,即使只剩下一臺(tái)打tag的機(jī)器着憨,也不能用墩衙,反而對(duì)tag的流量可用用非tag的機(jī)器,即做了降級(jí)甲抖,是不是很難理解漆改,不為正常的流量做降級(jí),反而為灰度的這點(diǎn)流量做了兜底准谚,個(gè)人覺(jué)得這個(gè)設(shè)計(jì)很坑挫剑,因?yàn)槲覀兙€上都會(huì)有一臺(tái)灰度的機(jī)器,nacos推送的時(shí)候柱衔,最后存活的是這個(gè)灰度的機(jī)器樊破,consumer 端就game over了,即出現(xiàn)no provider錯(cuò)誤唆铐。

同步原理

經(jīng)過(guò)日志分析哲戚,最終定位是同步延遲導(dǎo)致的,但為啥同步會(huì)延遲了艾岂,同步的機(jī)制和原理又是怎么樣的顺少,你一定又這些疑問(wèn),下面我們就來(lái)說(shuō)明下同步的原理王浴,只有搞明白了同步的原理脆炎,才能理解為啥在下線一臺(tái)后,同步就會(huì)延遲叼耙。

集群同步架構(gòu)

nacos 注冊(cè)中心是最終一致性腕窥,2.x的版本和客戶端是通過(guò)grpc長(zhǎng)鏈接來(lái)實(shí)現(xiàn)的,所以集群集群的每個(gè)節(jié)點(diǎn)會(huì)把注冊(cè)到自己節(jié)點(diǎn)的client筛婉,同步給集群其他幾臺(tái)節(jié)點(diǎn)簇爆,具體的架構(gòu)圖如下:

image.png
  • client :就是provdier和nacos 建立鏈接后 nacos維護(hù)的一個(gè)記錄,用來(lái)標(biāo)記一個(gè)客戶端爽撒,分兩種:

    • native client:即直接鏈接在本節(jié)點(diǎn)的provider入蛆,也該節(jié)點(diǎn)是client的責(zé)任節(jié)點(diǎn)。
    • 非native client硕勿,即是集群其他節(jié)點(diǎn)同步過(guò)來(lái)的哨毁,也就是非責(zé)任節(jié)點(diǎn),
  • Verify 任務(wù)
    同步給其他節(jié)點(diǎn)源武,怎么知道該client是否活的呢扼褪,因?yàn)殒溄佑植皇呛退⒌南牖茫瑸榱私鉀Q這個(gè)問(wèn)題,nacos 會(huì)為所有要同步的節(jié)點(diǎn)话浇,生成一個(gè)verify 任務(wù)脏毯,去更新下同步過(guò)去的client的活躍時(shí)間,來(lái)讓集群其他節(jié)點(diǎn)幔崖,認(rèn)為是活的食店,不要給刪了,nacos會(huì)有一個(gè)定時(shí)執(zhí)行的超時(shí)檢查任務(wù)赏寇,如果在3分鐘內(nèi)這個(gè)client 沒(méi)有更新活躍時(shí)間吉嫩,就認(rèn)為該同步過(guò)來(lái)的節(jié)點(diǎn)超時(shí)了,要干掉了

  • Delete 任務(wù)
    正常情況下嗅定,通過(guò)verify 任務(wù)來(lái)續(xù)約自娩,如果nacos發(fā)現(xiàn)這個(gè)client鏈接端了,異常了露戒,比如pod重啟了椒功,nacos 就會(huì)通過(guò)delete task 來(lái)告訴其他節(jié)點(diǎn)捶箱,該client已經(jīng)掛了智什,不需要維護(hù)了。

超時(shí)機(jī)制

上面介紹verify 任務(wù)時(shí)丁屎,說(shuō)了超時(shí)檢查荠锭,為了更好的理解,再提供一張圖:


image.png

同步原理

通過(guò)上面同步晨川,verify证九,delete 任務(wù),nacos讓provider在集群里保持一致共虑,做到了服務(wù)注冊(cè)無(wú)論鏈接到那個(gè)nacos節(jié)點(diǎn)愧怜,consumer 鏈接誰(shuí),都能消費(fèi)到全量的數(shù)據(jù)妈拌,就是這個(gè)同步來(lái)保證的拥坛。

上面只是一個(gè)概括同步機(jī)制,那同步是怎么實(shí)現(xiàn)的呢尘分,寫(xiě)再多猜惋,不如一張圖好理解,真正實(shí)現(xiàn)同步的原理在下面:

nacos-sync-arch.drawio.png

知識(shí)點(diǎn):

  • 集群又幾個(gè)節(jié)點(diǎn)培愁,就同步幾次著摔,每次都生成一個(gè)同步任務(wù)。
  • 當(dāng)前同步是添加到任務(wù)集合ConcurrentMap就結(jié)束定续,異步化谍咆。
  • 有一個(gè)線程專門(mén)負(fù)責(zé)從ConcurrentMap取任務(wù)禾锤,因?yàn)槿蝿?wù)支持延遲,就是在這里判斷的摹察,超過(guò)延遲時(shí)間时肿,就刪除,同時(shí)生成一個(gè)新的提交到同步線程引擎隊(duì)列港粱。
  • 同步引擎線程池螃成,線程數(shù)和cpu核數(shù)保持一致,每個(gè)線程匹配一個(gè)大小為2的15次方的隊(duì)列查坪,執(zhí)行線程就不斷的從這個(gè)隊(duì)列取任務(wù)來(lái)發(fā)給目前節(jié)點(diǎn)寸宏。
  • 網(wǎng)絡(luò)發(fā)送是通過(guò)grpc異步發(fā)送。
  • 失敗處理機(jī)制偿曙,因?yàn)椴荒軄G任務(wù)氮凝,所以失敗了是要把這個(gè)任務(wù)重新加回到隊(duì)列。

根因分析

通過(guò)這個(gè)圖望忆,特地標(biāo)記紅色的地方罩阵,就是我們這次停了一臺(tái)機(jī)器導(dǎo)致服務(wù)調(diào)用失敗的根因,我們用的是2.0.3的版本启摄,我們集群3臺(tái)機(jī)器稿壁,所以停了一臺(tái)時(shí),這臺(tái)機(jī)器上的鏈接全部斷開(kāi)歉备,客戶端會(huì)重連傅是,這時(shí)就產(chǎn)生了很多的同步任務(wù),要同步蕾羊,好了這么多任務(wù)要同步喧笔,但是一個(gè)任務(wù)要同步給兩臺(tái)機(jī)器,也就是兩個(gè)任務(wù)龟再,同步給這個(gè)故障的節(jié)點(diǎn)由于在前面沒(méi)有判斷书闸,到最后執(zhí)行同步的線程檢查的時(shí)候,肯定是失敗的利凑,就等100ms浆劲,還重試3次,也就是往這臺(tái)故障的節(jié)點(diǎn)同步一個(gè)任務(wù)截碴,這個(gè)同步線程要阻塞300ms梳侨,才能去處理下一個(gè)任務(wù),這個(gè)地方的代碼貼下日丹,更直觀點(diǎn):

image.png

所以在停掉一臺(tái)節(jié)點(diǎn)的情況走哺,一個(gè)任務(wù)要延遲300ms,哪超過(guò)600個(gè)任務(wù)要同步時(shí)哲虾,這地600以后的任務(wù)同步延遲就在3分鐘以上丙躏,就超過(guò)了前面我們說(shuō)的同步client的超時(shí)時(shí)間择示,就觸發(fā)了刪除操作,push了錯(cuò)誤的數(shù)據(jù)給客戶端晒旅。

所以如果你是2.0.3的版本栅盲,平時(shí)重啟時(shí)一定要快,如果要長(zhǎng)時(shí)間下線的废恋,一定要升級(jí)到新的版本谈秫,否則給你的大禮就是故障了。

解決方案

上面的問(wèn)題鱼鼓, 是因?yàn)橥窖舆t導(dǎo)致超時(shí)拟烫,被刪除,觸發(fā)推送迄本,但是服務(wù)本身是沒(méi)有任何問(wèn)題的硕淑,而且除了這個(gè)場(chǎng)景外,還會(huì)有其他的問(wèn)題導(dǎo)致錯(cuò)誤推送嘉赎,比如nacos 節(jié)點(diǎn)cpu100%置媳,fugc等,網(wǎng)絡(luò)問(wèn)題等公条,都會(huì)觸發(fā)該問(wèn)題拇囊,所以我們需要一個(gè)完整的解決方案,確保nacos 無(wú)論出現(xiàn)了啥問(wèn)提赃份,都不能影響服務(wù)的調(diào)用寂拆,服務(wù)都是正常的,你nacos 有問(wèn)題,為啥影響服務(wù)調(diào)用忙干。

所以我們從兩個(gè)方便入手窍蓝,一個(gè)是增加一個(gè)反向檢查,確保服務(wù)正常時(shí)串结,不再亂推,還有一個(gè)就時(shí)推拉空保護(hù)。兩個(gè)措施結(jié)合英上,能把nacos穩(wěn)住。

反向檢查

在超時(shí)任務(wù)觸發(fā)時(shí)啤覆,如果超時(shí)了苍日,就對(duì)client做一次健康檢查,通過(guò)類似tcp telnet機(jī)制窗声,因?yàn)槲覀冇蟹?wù)的ip和端口相恃,通過(guò)建立鏈接來(lái)判斷是否成功,現(xiàn)在服務(wù)注冊(cè)的都有這個(gè)機(jī)制笨觅,比如consul都支持拦耐,不過(guò)這里需要注意的事耕腾,檢查通過(guò)了,需要做一些臟數(shù)據(jù)清理杀糯。

推拉空保護(hù)

客戶端從nacos獲取數(shù)據(jù)扫俺,就兩個(gè)地方,一個(gè)是客戶端主動(dòng)拉固翰,一個(gè)是nacos推送狼纬,所以在這兩個(gè)地方都要加一個(gè)保護(hù),防止推送空的實(shí)例骂际,我們是定義一個(gè)空的發(fā)展畸颅,計(jì)算實(shí)例數(shù)小于該閥值時(shí),就不推送或者飯后空的集合方援。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末没炒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子犯戏,更是在濱河造成了極大的恐慌送火,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件先匪,死亡現(xiàn)場(chǎng)離奇詭異种吸,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)呀非,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)坚俗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人岸裙,你說(shuō)我怎么就攤上這事猖败。” “怎么了降允?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵恩闻,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我剧董,道長(zhǎng)幢尚,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任翅楼,我火速辦了婚禮尉剩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘毅臊。我一直安慰自己理茎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著功蜓,像睡著了一般园爷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上式撼,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天童社,我揣著相機(jī)與錄音,去河邊找鬼著隆。 笑死扰楼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的美浦。 我是一名探鬼主播弦赖,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼浦辨!你這毒婦竟也來(lái)了蹬竖?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤流酬,失蹤者是張志新(化名)和其女友劉穎币厕,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體芽腾,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡旦装,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了摊滔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阴绢。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖艰躺,靈堂內(nèi)的尸體忽然破棺而出呻袭,到底是詐尸還是另有隱情,我是刑警寧澤描滔,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布棒妨,位于F島的核電站,受9級(jí)特大地震影響含长,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜伏穆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一拘泞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧枕扫,春花似錦陪腌、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)染簇。三九已至,卻和暖如春强岸,著一層夾襖步出監(jiān)牢的瞬間锻弓,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工蝌箍, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留青灼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓妓盲,卻偏偏與公主長(zhǎng)得像杂拨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子悯衬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 1.客戶端向nacos服務(wù)端注冊(cè) 1.1 客戶端注冊(cè)的地方 NacosServiceRegistryAutoCon...
    王偵閱讀 980評(píng)論 0 1
  • 配置中心 配置中心簡(jiǎn)介 說(shuō)到配置中心弹沽, 大家可能都不陌生。我們攜程現(xiàn)在用的qconfig筋粗, 就是一個(gè)典型的配置中心...
    窩糯遥狂奔閱讀 7,963評(píng)論 0 3
  • redis是什么 redis是一個(gè)非關(guān)系型數(shù)據(jù)庫(kù),以KV結(jié)構(gòu)存儲(chǔ)數(shù)據(jù)亏狰,提供了多種數(shù)據(jù)類型和各自的本地方法役纹,單線程處...
    小丸子的呆地閱讀 514評(píng)論 0 2
  • 整理多種中間件,橫向?qū)Ρ确植际较嚓P(guān)的特性暇唾,關(guān)注高可用促脉、負(fù)載均衡、故障恢復(fù)等不同中間件的實(shí)現(xiàn)方式策州。主要包含Redis...
    陳晨_軟件五千言閱讀 3,188評(píng)論 0 5
  • 一瘸味、Kafka 集群部署架構(gòu) 為了讓讀者能與小編在后續(xù)的問(wèn)題分析中有更好的共鳴,小編先與各位讀者朋友對(duì)齊一下我們 ...
    坨坨的大數(shù)據(jù)閱讀 239評(píng)論 0 1