的完整指南)
前陣子一個老客戶半夜打電話過來說辦公室網(wǎng)絡(luò)突然卡得沒法用。我遠程一看拓撲里核心交換機后面掛著兩臺接入交換機其中一臺離線了業(yè)務(wù)流量全擠到剩下那一臺上面廣播域又大環(huán)路檢測又沒做好整個局域網(wǎng)直接半癱瘓。這事其實挺典型的單臺交換機跑關(guān)鍵業(yè)務(wù)不出事怎么都好說一出事就是全網(wǎng)陪葬。后來我過去幫他們把兩臺接入交換機做了堆疊又順手整理了上聯(lián)鏈路問題才算徹底解決。今天沒別的就著這個場景認真聊聊交換機的堆疊與集群。1. 為什么說堆疊和集群是網(wǎng)絡(luò)運維的“雙保險”很多人第一次接觸堆疊和集群都是在被領(lǐng)導(dǎo)批評之后核心設(shè)備單點故障、鏈路帶寬不夠、管理地址太多太亂、配置同步麻煩。堆疊和集群這個名字一聽就覺得高端其實本質(zhì)思路特別樸素把多臺交換機變成一臺來用。1.1 一個“拿走交換機就卡死”的經(jīng)典故障熱搜里有個問題我一直印象很深為什么從局域網(wǎng)中拿走一個交換機后很卡這個問題如果放在沒有堆疊、沒有集群的環(huán)境里答案基本就一句話——拿走的那臺交換機承擔(dān)了部分網(wǎng)關(guān)或匯聚功能或者干脆就是環(huán)路被破壞了之后STP重新收斂導(dǎo)致全網(wǎng)廣播風(fēng)暴。但更深層的原因是你的網(wǎng)絡(luò)設(shè)計里壓根沒考慮設(shè)備冗余和鏈路冗余單臺設(shè)備死掉流量只能繞路繞路之后帶寬或者路徑又不對于是卡。我自己踩過的坑是公司有四個部門原來規(guī)劃是每層樓一臺24口接入交換機分別上聯(lián)到一臺核心核心沒做雙機接入更沒做堆疊。結(jié)果有一次一臺接入交換機因為電源模塊老化直接斷電整個樓層辦公全部斷網(wǎng)。修好之后我做了兩件事一是把接入交換機全部換成支持堆疊的型號并兩兩堆疊二是把上聯(lián)改成雙鏈路到兩臺核心。從那以后再遇到單臺硬件故障用戶基本無感知頂多丟一兩個包。1.2 我理解的堆疊和集群到底解決什么問題如果非要用一句話概括堆疊解決的是橫向擴展和簡化管理的問題集群解決的是高可用和負載分擔(dān)的問題。堆疊把多臺物理設(shè)備虛擬成一臺邏輯設(shè)備管理IP只有一個配置可以統(tǒng)一下發(fā)跨設(shè)備的鏈路可以捆綁成Eth-Trunk環(huán)路被天然消除。集群則更偏重控制層面的協(xié)同多臺設(shè)備之間通過心跳互相備份狀態(tài)一臺掛了另一臺立刻接管業(yè)務(wù)。我舉個生活化的例子堆疊就像你雇了好幾個員工但他們坐在一起對外只留一個接待窗口客戶覺得你是一個人集群呢是開了好幾個分店每家店都有人值班一家店出了問題客戶走到另一家店照樣辦事。前者優(yōu)化的是內(nèi)部效率和資源利用率后者保障的是服務(wù)的連續(xù)性。這里我得強調(diào)一點堆疊和集群不是替代關(guān)系。很多場景下它們會配合使用——接入層用堆疊擴展端口密度和上聯(lián)帶寬核心層用集群或雙機熱備保障整網(wǎng)穩(wěn)定。如果你在規(guī)劃設(shè)計階段把這兩件事分開想后面很多麻煩其實都可以避免。2. 堆疊與集群的底層邏輯拆解光知道概念不頂用咱得把原理吃透。交換機的堆疊和集群核心都是虛擬化技術(shù)但虛擬化的層面不同。2.1 堆疊是怎么“變一臺”的堆疊的底層實現(xiàn)簡單說就是把多臺交換機的控制平面和轉(zhuǎn)發(fā)平面合并成一個。每臺參與堆疊的設(shè)備叫成員交換機按角色分為主交換機、備交換機和從交換機。主交換機負責(zé)整個堆疊系統(tǒng)的管理和協(xié)議計算備交換機是主交換機的備份從交換機只做業(yè)務(wù)轉(zhuǎn)發(fā)。三者的角色不是固定的系統(tǒng)運行中會根據(jù)角色選舉規(guī)則動態(tài)調(diào)整比如主交換機掛了備交換機會自動頂上。堆疊系統(tǒng)的控制平面是合并的對外表現(xiàn)就是一臺設(shè)備。你登錄堆疊系統(tǒng)之后看到的接口會帶一個成員編號前綴比如GigabitEthernet 1/0/1和GigabitEthernet 2/0/1分別表示第一臺成員和第二臺成員上的接口。配置的時候一條命令就能下發(fā)到所有成員VLAN、ACL、路由協(xié)議這些配置全部全局生效。這里面最關(guān)鍵的是堆疊口。堆疊口是專門用來連接成員設(shè)備之間高速鏈路的口業(yè)務(wù)數(shù)據(jù)和控制報文都會走這個口。華為的設(shè)備上堆疊口可以是一個物理口也可以把多個物理口捆綁成一個邏輯堆疊口來用目的就是提高堆疊鏈路的帶寬和可靠性。2.2 集群/高可用和堆疊的差異集群這個詞在網(wǎng)絡(luò)里用得挺泛思科叫StackWise和VSS華為叫集群交換機系統(tǒng)Cluster Switch SystemCSSH3C叫IRFIntelligent Resilient Framework銳捷有自己的VSUVirtual Switching Unit。不同廠商的命名不同但核心思想都差不多把兩臺或多臺設(shè)備組合成一臺邏輯設(shè)備統(tǒng)一管理、統(tǒng)一轉(zhuǎn)發(fā)。集群和堆疊的區(qū)別最容易讓人暈的地方在于廠商有時會把這兩種技術(shù)混著叫。以我實際使用經(jīng)驗來看判斷標準很簡單——看它對控制平面的處理方式。堆疊通常是把多臺設(shè)備的控制平面合并成一個邏輯控制平面參與堆疊的設(shè)備之間通過堆疊口傳輸大量的協(xié)議報文和表項同步信息集群則更強調(diào)獨立設(shè)備的協(xié)同每臺設(shè)備仍然有自己的控制平面但通過集群協(xié)議同步關(guān)鍵狀態(tài)對外虛擬成一個整體。用華為的iStackIntelligent Stack和CSS來對比更直觀iStack一般用于中低端框式或盒式交換機最多支持9臺堆疊適合接入層和匯聚層CSS一般用于核心交換機本質(zhì)是把兩臺框式交換機虛擬成一臺適合數(shù)據(jù)中心核心或園區(qū)網(wǎng)核心。CSS對硬件的要求更高需要專門的集群接口板或集群線纜穩(wěn)定性也更強。2.3 各廠商堆疊技術(shù)命名與定位我在實際項目中接觸過不少廠商設(shè)備各家堆疊技術(shù)能力參差但總體上都挺成熟這里按我自己的經(jīng)驗給個定位參考廠商技術(shù)名稱典型型號最大成員數(shù)我的使用感受華為iStack / CSSS5720、S6720、S12700iStack 9臺 / CSS 2臺配置直觀堆疊口和邏輯口概念清晰適合園區(qū)網(wǎng)思科StackWise / StackWise VirtualC9300、C95008臺 / 2臺Catalyst 9000系列體驗很好StackWise線纜即插即用H3CIRFS5130、S6520、S105009臺 / 2臺IRF老牌穩(wěn)定配置命令多但資料全銳捷VSURG-S5750、RG-S62202~4臺界面友好中專院校和中小項目用得多中興堆疊R10系列2~4臺配置風(fēng)格接近華為做政企項目時見過表格里這些數(shù)字是常規(guī)值具體還要看軟件版本不要拿老版本的限制套新版本設(shè)備。另外我得提醒一句跨廠商堆疊是行不通的堆疊協(xié)議是私有的不用想著華為和思科混堆選型的時候就得把品牌統(tǒng)一。3. 華為堆疊配置實戰(zhàn)從零到一落地前面聊了原理下面拿華為設(shè)備走一遍真實配置。我這邊用的示例是兩臺S5720-52X-SI版本是V200R019C10做的是業(yè)務(wù)口堆疊。為什么選業(yè)務(wù)口堆疊而不是專門的堆疊口因為S5720這種盒式交換機大多數(shù)沒有專門堆疊口直接拿萬兆光口或者千兆光口當堆疊口就能用靈活又省錢。3.1 開工前必須確認的硬件條件做堆疊前先檢查三樣?xùn)|西缺一樣都別開工第一軟件版本必須一致。我用華為設(shè)備比較多在系統(tǒng)視圖下執(zhí)行display version就能看到版本號參與堆疊的設(shè)備版本不一致時系統(tǒng)會提示可能堆疊失敗。哪怕小版本號不同也建議先升級再組堆疊不然有的功能會異常。第二堆疊口之間的連線必須做對。華為的堆疊口是有編號的業(yè)務(wù)口堆疊的時候需要先創(chuàng)建邏輯堆疊口再把物理口加進去。兩臺設(shè)備組堆疊時通常要兩根線交叉連接1號設(shè)備的堆疊口1連2號設(shè)備的堆疊口21號設(shè)備的堆疊口2連2號設(shè)備的堆疊口1。如果接成直連堆疊會起不來。第三設(shè)備啟動方式要是堆疊模式。華為很多盒式交換機出廠默認就是堆疊模式不用額外切換但有些型號需要在BIOS里改啟動模式。我遇到過一次設(shè)備是獨立模式怎么配堆疊都不生效后來查文檔才發(fā)現(xiàn)要改啟動方式并重啟。3.2 華為堆疊配置從規(guī)劃到命令行我規(guī)劃的是兩臺設(shè)備組成一個堆疊系統(tǒng)成員編號分別是1和2堆疊域編號固定為10堆疊優(yōu)先級1號設(shè)為200讓它成為主2號保留默認100。這樣設(shè)計是防止設(shè)備同時啟動時角色競爭不穩(wěn)定。先配置1號設(shè)備。進入系統(tǒng)視圖修改成員編號和優(yōu)先級再創(chuàng)建堆疊端口system-view sysname SW_Building_A stack stack member 1 priority 200 stack member 1 domain 10 stack-port 1/1 port interface GigabitEthernet0/0/27 stack-port 2/1 port interface GigabitEthernet0/0/28注意這里的stack-port寫法第一個數(shù)字是成員編號第二個數(shù)字是堆疊口編號。比如stack-port 1/1表示給1號成員創(chuàng)建堆疊口1再把物理口27加進去。2號設(shè)備同樣操作但成員編號改成2優(yōu)先級保持默認system-view sysname SW_Building_A stack stack member 2 domain 10 stack-port 1/2 port interface GigabitEthernet0/0/27 stack-port 2/2 port interface GigabitEthernet0/0/28然后把兩臺設(shè)備斷電用堆疊線纜交叉連接1號設(shè)備的物理口27連2號設(shè)備的物理口281號設(shè)備的物理口28連2號設(shè)備的物理口27。接好后先給1號設(shè)備上電等它完全啟動后再給2號設(shè)備上電。這樣做的目的是讓1號先完成初始化大概率穩(wěn)坐主角色。兩臺設(shè)備都啟動后在1號設(shè)備上執(zhí)行display stack查看堆疊狀態(tài)。如果顯示堆疊成員有2臺角色一個是Master一個是Standby那就說明堆疊建立成功。如果只顯示1臺或者成員角色不對優(yōu)先檢查連線順序和堆疊口配置。3.3 業(yè)務(wù)口堆疊的雷區(qū)和注意事項業(yè)務(wù)口堆疊雖然方便坑也不少。第一物理口加入堆疊口之后這個物理口就不能再當普通業(yè)務(wù)口用了。我見過有人配完堆疊后怎么都ping不通某些業(yè)務(wù)地址排查半天發(fā)現(xiàn)是在堆疊口里加了業(yè)務(wù)物理口導(dǎo)致那根線被堆疊系統(tǒng)占用了。所以在規(guī)劃的時候端口預(yù)留一定要夠別把堆疊口和業(yè)務(wù)口混在一起。第二堆疊鏈路的帶寬會影響整機轉(zhuǎn)發(fā)性能。兩臺設(shè)備之間的流量如果走堆疊口帶寬不夠就會擁塞。我的建議是堆疊口至少用萬兆如果只有千兆口堆疊內(nèi)跨設(shè)備流量大的時候會明顯掉速。S5720-SI這種型號自帶4個萬兆光口優(yōu)先拿萬兆口做堆疊千兆口留給業(yè)務(wù)。第三跨設(shè)備鏈路聚合很重要。堆疊做完之后一定要把上聯(lián)口或下聯(lián)口跨設(shè)備捆綁成Eth-Trunk不然堆疊就失去了一半意義。我處理過一個現(xiàn)場堆疊做完了但下聯(lián)服務(wù)器的兩根網(wǎng)線分別插在不同成員交換機上沒有做鏈路聚合結(jié)果一臺成員設(shè)備掛了服務(wù)器依然斷網(wǎng)??缭O(shè)備聚合才能讓流量在成員間自動切換才能真正利用堆疊的冗余能力。4. 堆疊核心機制選舉、分裂與MAD配置做完只是第一步能把堆疊運行機制搞明白后面出問題才能快速定位。堆疊系統(tǒng)里最核心的三個機制角色選舉、成員加入、堆疊分裂。這三個機制決定了一旦拓撲變化堆疊表現(xiàn)如何。4.1 堆疊系統(tǒng)的角色選舉規(guī)則堆疊建立或拓撲變化的時候會觸發(fā)角色選舉。選舉規(guī)則按順序比較運行狀態(tài)已經(jīng)運行的優(yōu)先、堆疊優(yōu)先級數(shù)值大的優(yōu)先、MAC地址小的優(yōu)先。我前面配置里把1號設(shè)備的優(yōu)先級設(shè)成200就是為了保證它穩(wěn)定當主設(shè)備。角色確定后主交換機會負責(zé)收集所有成員的拓撲信息計算轉(zhuǎn)發(fā)表項然后同步給備機和從機。這里有個細節(jié)如果后來新加入一臺設(shè)備它的配置會和主設(shè)備沖突新設(shè)備會自動清空自己的配置跟隨主設(shè)備重新下發(fā)配置。所以給堆疊系統(tǒng)加新成員時千萬別接上就完事要等它自動同步著急開業(yè)務(wù)可能會因為配置不一致產(chǎn)生奇怪問題。4.2 堆疊分裂為什么很危險堆疊分裂是運行中最危險的事件沒有之一。人為原因最常見有人拔了堆疊線纜或者某臺設(shè)備的堆疊口光模塊壞了。一旦堆疊鏈路斷開原本的一個堆疊系統(tǒng)會變成兩個獨立的系統(tǒng)而且是兩個系統(tǒng)還在轉(zhuǎn)發(fā)同一個網(wǎng)段的流量IP地址、VLAN配置完全一樣這就形成了事實上的雙主沖突。雙主沖突之后原來走堆疊口的跨設(shè)備流量全部斷掉網(wǎng)絡(luò)廣播報文還會在兩個系統(tǒng)之間反復(fù)橫跳嚴重時直接廣播風(fēng)暴。這時候如果沒做MAD檢測整個網(wǎng)絡(luò)會變得極其不穩(wěn)定想遠程登錄設(shè)備處理都困難。4.3 MAD檢測配置與建議MADMulti-Active Detection多主檢測就是專門用來解決這個問題的。它通過一條獨立于堆疊口的鏈路檢測對方是否存活。常用的MAD方式有直連檢測和代理檢測。直連檢測適合兩臺成員設(shè)備的場景用一根普通網(wǎng)線把兩臺設(shè)備的檢測口互連代理檢測適合多成員設(shè)備通過中間設(shè)備進行檢測。華為設(shè)備配置直連MAD的典型命令system-view interface GigabitEthernet0/0/29 mad detect mode direct我在實際項目中習(xí)慣把所有空閑端口也開啟mad檢測并把堆疊域編號統(tǒng)一規(guī)劃。要注意MAD檢測口不能用來跑業(yè)務(wù)必須獨立占用一個物理口最好是千兆以上端口專門留給堆疊自愈用的。還有一個容易忽略的坑MAD檢測配置在成員設(shè)備上要寫一樣的命令。如果只在一臺設(shè)備上配了另一臺沒配分裂后檢測機制形同虛設(shè)。5. 從交換機堆疊看向服務(wù)器集群聊了這么多交換機堆疊肯定有不少朋友是搞服務(wù)器集群的。其實這兩個方向在工程實踐中往往是綁定的服務(wù)器集群要穩(wěn)定網(wǎng)絡(luò)側(cè)必須給力。5.1 服務(wù)器集群對網(wǎng)絡(luò)的新要求我自己搭過Hadoop、Kafka和K8s集群也幫人排查過因為網(wǎng)絡(luò)問題導(dǎo)致集群不穩(wěn)定的案例。服務(wù)器集群的流量模式和傳統(tǒng)辦公網(wǎng)差別很大東西向流量占比極高節(jié)點之間要頻繁通信數(shù)據(jù)副本同步、任務(wù)調(diào)度、心跳檢測全都在局域網(wǎng)內(nèi)完成。比如Kafka集群broker之間要復(fù)制消息節(jié)點一多內(nèi)網(wǎng)帶寬很容易被刷滿。這時候如果接入交換機的帶寬不夠、單臺設(shè)備轉(zhuǎn)發(fā)能力弱就會出現(xiàn)消費者拉取消息延遲、rebalance頻繁觸發(fā)。Hadoop集群跑shuffle的時候多個節(jié)點同時拉取中間結(jié)果對網(wǎng)絡(luò)時延非常敏感交換機緩存太小都會拖慢整個任務(wù)進度。所以有條件的情況下服務(wù)器接入交換機最好也是雙機上聯(lián)堆疊或集群服務(wù)器網(wǎng)卡做bond交換機之間做跨設(shè)備鏈路聚合。這樣即使一臺交換機故障集群通信也不會中斷不會因為網(wǎng)絡(luò)抖動觸發(fā)節(jié)點間心跳超時。5.2 網(wǎng)絡(luò)側(cè)給集群做保障的幾個習(xí)慣第一把服務(wù)器區(qū)域單獨劃VLAN隔離廣播域。辦公網(wǎng)的廣播報文本來就多如果服務(wù)器和辦公電腦混在一起集群通信會被擊穿。我的習(xí)慣是把服務(wù)器單獨劃一個VLAN并關(guān)閉不必要組播減少無謂的協(xié)議報文干擾。第二給集群業(yè)務(wù)流量打上高優(yōu)先級。現(xiàn)在很多交換機支持簡單的QoS可以通過簡化優(yōu)先級的配置讓集群的心跳、存儲同步這些關(guān)鍵流量優(yōu)先轉(zhuǎn)發(fā)。我用華為設(shè)備時會做流策略把服務(wù)器網(wǎng)段的流量映射到EF隊列保證集群流量在網(wǎng)絡(luò)擁塞時不被丟棄。第三監(jiān)控交換機的CPU和內(nèi)存。集群跑大任務(wù)的時候交換機如果處理不過來會出現(xiàn)CPU占用率飆升表現(xiàn)為管理面卡頓、協(xié)議鄰居頻繁震蕩。遇到這種情況優(yōu)先檢查是不是交換機型號選得小了其次檢查有沒有被異常廣播報文打滿。我一般會開啟SNMP配合Prometheus或Zabbix監(jiān)控交換機端口流量、CPU、內(nèi)存提前發(fā)現(xiàn)問題。6. 常見問題與排查技巧實錄寫了這么多最后來點實踐沉淀。我整理了一張速查表全是在現(xiàn)場遇到過的真實問題照著排查能省很多時間。6.1 我整理的一份常見故障速查表現(xiàn)象可能原因排查思路堆疊系統(tǒng)里少了一臺成員堆疊線纜松動或光模塊故障兩端查看端口物理狀態(tài)重啟堆疊口堆疊口配置失敗物理口被業(yè)務(wù)口占用檢查端口是否加入其他接口組或Eth-Trunk堆疊建立后業(yè)務(wù)中斷跨設(shè)備鏈路未做聚合配置跨設(shè)備Eth-Trunk不要跨成員單鏈路跑業(yè)務(wù)堆疊雙主網(wǎng)絡(luò)廣播嚴重MAD未配置或配置錯誤檢查MAD檢測鏈路重新配置mad detect mode堆疊成員配置自動丟失新加入設(shè)備配置與主設(shè)備沖突確認新設(shè)備軟件版本一致再組堆疊交換機CPU高管理卡頓被廣播報文攻擊或網(wǎng)段廣播域過大查日志、抓包縮小廣播域堆疊后端口速率不達標堆疊口帶寬不足萬兆堆疊優(yōu)先跨設(shè)備流量避免走聚合單鏈路交換機之間STP震蕩堆疊和STP配置沖突堆疊后跨設(shè)備鏈路做成Eth-Trunk關(guān)閉不必要的STP6.2 華為6720堆疊配置踩坑筆記熱搜里也有華為6720堆疊我順手說一下。S6720系列本身是數(shù)據(jù)中心接入交換機做堆疊和普通S5720思路類似但要注意它的40GE端口用得比較多配置堆疊口的時候需要指定端口類型。配置示例interface Stack-Port 1/1 port interface 40GE1/0/27 interface Stack-Port 2/1 port interface 40GE1/0/28我遇到過一次詭異問題S6720堆疊建好之后display stack顯示正常但兩臺設(shè)備之間的三層轉(zhuǎn)發(fā)一直不通。后來抓包發(fā)現(xiàn)是堆疊系統(tǒng)的虛擬MAC地址在跨設(shè)備學(xué)習(xí)的時候出了岔子最后把MAC地址老化時間調(diào)短、同時清空動態(tài)表項才恢復(fù)正常。這種底層表項問題不好復(fù)現(xiàn)真遇到了別慌先從表項查。6.3 銳捷、H3C堆疊的配置習(xí)慣銳捷交換機做VSU我習(xí)慣先確認設(shè)備是否支持因為不是所有型號都支持VSU。VSU配置需要在特定視圖下進行先給設(shè)備配置域編號再指定成員ID然后創(chuàng)建VSL端口并把物理口加進去。銳捷的VSL端口綁定和華為的邏輯堆疊口類似但它更強調(diào)物理口要成對綁定不推薦一根線堆疊。H3C的IRF配置邏輯和華為很像核心命令是irf member、irf-port、port group interface。H3C的坑在于如果設(shè)備之前配置過業(yè)務(wù)重新組IRF時經(jīng)常出現(xiàn)配置沖突最好的辦法是清空設(shè)備配置再組。H3C的IRF分裂之后也有irf mad檢測包括鏈路級檢測和擴展LACP檢測合理使用都能快速感知雙主問題。7. 最后分享幾個我自己的使用體會寫到這里差不多把我的經(jīng)驗和理解都鋪開了最后收個尾說幾句真心話。堆疊和集群說到底只是網(wǎng)絡(luò)高可用方案的前半段設(shè)備級冗余解決了后面還要考慮鏈路級、網(wǎng)關(guān)級、甚至機房級的冗余。我在實際規(guī)劃時一般遵循一個原則能成對就成對能聚合就聚合能檢測就檢測。堆疊解決了設(shè)備層面的虛擬化Eth-Trunk解決鏈路層面的冗余MAD解決分裂后的腦裂問題三者配合才能真正把網(wǎng)絡(luò)做穩(wěn)。我個人最深的體會是堆疊和集群不是配完就完事。我見過太多項目堆疊配好了但MAD沒開、跨設(shè)備聚合沒做、堆疊線纜質(zhì)量差、堆疊口帶寬不夠整個堆疊系統(tǒng)的價值大打折扣。技術(shù)沒有銀彈關(guān)鍵還是看落地細節(jié)。后面如果你也準備給自己的網(wǎng)絡(luò)加堆疊建議先在小范圍測試環(huán)境里把配置和故障演練做一遍再上生產(chǎn)這樣會踏實很多。