針對新手入門的普及魁亦,有過大型網(wǎng)站技術(shù)架構(gòu)牛人路過,別耽誤浪費(fèi)了時間羔挡,閱讀之前洁奈,請確保有一定的網(wǎng)絡(luò)基礎(chǔ),熟練使用Linux绞灼,瀏覽大概需要3-5分鐘的時間利术,結(jié)尾有彩蛋。
分布式
小馬正在經(jīng)營一個在線購物網(wǎng)站低矮,名叫TT貓印叁,有商品管理、訂單管理、用戶管理轮蜕、支付管理昨悼、購物車等等模塊,每個模塊部署到獨(dú)立的云服務(wù)主機(jī)跃洛。
現(xiàn)在率触,程序員小明同學(xué)瀏覽TT貓,想買一款牛逼的cherry機(jī)械鍵盤來提升自己的工作效率汇竭。小明打開TT貓首頁葱蝗、搜索商品、瀏覽詳情以及評論细燎、添加購物車两曼、下單、支付等等一系列操作玻驻。小明同學(xué)一氣呵成悼凑,流暢的完成了購物,當(dāng)然也花費(fèi)了不少銀子击狮。
但是系統(tǒng)又是如何對這一系列操作佛析,如下圖錯綜復(fù)雜的調(diào)用關(guān)系(自行忽略部分細(xì)節(jié))。用戶看不見彪蓬,模不著寸莫,整個下單過程卻行走在網(wǎng)絡(luò)之間。
TT貓把所有功能模塊分布部署在不同的地方档冬,最終完成了用戶一系列的請求膘茎,這大概就是一個分布式系統(tǒng)吧。
微服務(wù)
博主認(rèn)為微服務(wù)是一種架構(gòu)酷誓,也是在分布式范疇之內(nèi)的披坏。多微才叫微?在分布式系統(tǒng)中盐数,微服務(wù)更加強(qiáng)調(diào)單一職責(zé)棒拂、輕量級通信(HTTP)、獨(dú)立性并且進(jìn)程隔離玫氢。
好了帚屉,沒什么好說的了,實(shí)踐出真知漾峡,建議大家多多了解 spring-cloud相關(guān)微服務(wù)組件攻旦。
TT貓,每年都會搞一些活動生逸,比如女生最愛的光棍節(jié)(雙11)堰塌,夜深人靜的時候會瞬間涌入大量用戶,指不定就會把某個服務(wù)打趴下荧飞。
這時候,問題來了用戶下單超時锋谐,或者直接500錯誤,如何去解決皱炉?
負(fù)載均衡集群
這種事情怎么可以在如此重要的活動中出現(xiàn)怀估,其實(shí)馬爸爸提前購買了多臺服務(wù)器,工程師們已分別把各個業(yè)務(wù)功能模塊復(fù)制部署了多份合搅。
每個相同功能的模塊多搀,它們構(gòu)成了一個組,并以單一系統(tǒng)的模式加以管理灾部。當(dāng)妹子進(jìn)行下單操作時康铭,實(shí)際上是跟一個集群組發(fā)生關(guān)系,但系統(tǒng)會確保只跟其中一個發(fā)生了關(guān)系赌髓,具體跟誰从藤,集群組有自己的調(diào)度算法,不要擔(dān)心跟妹子發(fā)生不了關(guān)系锁蠕。
舉個古代猥瑣而不淫蕩的例子吧夷野,如果你生活在古代,年18荣倾,未婚悯搔,高富帥,急需解決個人生理問題舌仍。故妒貌,你來到了傳說中的風(fēng)月場,咳咳铸豁,這個古代可是合法的灌曙。這時候老鴇或者大茶壺過來招呼你了,如果沒有特殊要求节芥,你會被帶進(jìn)一個屋里在刺,里面有個風(fēng)塵女子……
畫風(fēng)一轉(zhuǎn),有沒有閃瞎自己的程序員萬年鈦合金狗眼头镊。你可以這么理解增炭,老鴇就是負(fù)載均衡器,內(nèi)置調(diào)度算法拧晕,風(fēng)塵女子就是集組其中的一個。
好了梅垄,言歸正傳厂捞,省略號自行腦補(bǔ)输玷,小伙伴們看到這里可能會問了,平時生產(chǎn)環(huán)境中我們都用什么做負(fù)載均衡器靡馁。
財大氣粗的用硬件F5
不差錢的使用DNS負(fù)載均衡
技術(shù)牛逼的用LVS
苦逼的創(chuàng)業(yè)型小公司只能使用Nginx
當(dāng)然欲鹏,負(fù)載均衡器不止以上幾種,有興趣的同學(xué)自行谷歌了解臭墨。
《論知行》篇中說:知其然知其所以然赔嚎,簡單說下這幾種負(fù)載均衡器到底是如何行走于網(wǎng)絡(luò)中的吧,學(xué)過網(wǎng)絡(luò)的朋友大概都清楚七層網(wǎng)絡(luò)模型胧弛。
首先一張圖尤误,讓大家重溫一下大學(xué)基礎(chǔ)課程。
有沒有瞬間課堂書本的感覺结缚,不過癮损晤?再來一張TCP/IP五層模型。
在每一層都工作著不同的設(shè)備红竭,比如財大氣粗尤勋,不差錢的國企使用的F5工作在4-7層,一般互聯(lián)網(wǎng)企業(yè)使用的LVS工作在傳輸層茵宪,使用最廣泛的Nginx工作在應(yīng)用層最冰。
最后來聊一下DNS負(fù)載均衡,雖然DNS最原始也是最簡單的方法稀火,但是DNS負(fù)載均衡的控制權(quán)在域名服務(wù)商手里暖哨,NDS存在多級解決,緩存A記錄的問題憾股,以及網(wǎng)站自身無法做更多的管理鹿蜀。這樣導(dǎo)致了一般中小公司很少使用。
當(dāng)然服球,自身實(shí)力夠硬茴恰,DNS負(fù)載均衡也是個不錯的選擇。下圖是檢測TT貓域名的A記錄得到的部分信息斩熊,僅供參考往枣,自行領(lǐng)悟。
高可用集群
既然是集群粉渠,就不能夠出現(xiàn)單點(diǎn)故障分冈,如果大家關(guān)注云服務(wù),可能會接觸到以下詞匯霸株,“雙機(jī)熱備”雕沉,“兩地三中心”等等詞匯。
雙擊熱備是高可用的一種體現(xiàn)形式去件,如上圖所示坡椒,生產(chǎn)環(huán)境中我們存在兩個負(fù)載均衡節(jié)點(diǎn)扰路,主節(jié)點(diǎn)處于激活狀態(tài),另一個節(jié)點(diǎn)處于備用狀態(tài)倔叼,當(dāng)主節(jié)點(diǎn)意外宕機(jī)汗唱,可以通過keepalived檢測并迅速切換到備用服務(wù),保障業(yè)務(wù)正常運(yùn)轉(zhuǎn)丈攒。
至于兩地三中心哩罪,下圖可能會讓大家理解的更加透徹,圖片源于網(wǎng)絡(luò)巡验。
彈性云
小馬哥為了準(zhǔn)備雙十一际插,購置了大量服務(wù)器,但是活動一過深碱,平時的用戶訪問量并不能滿足服務(wù)器的接客能力腹鹉,導(dǎo)致大量服務(wù)器處于空窗期。
這還了得敷硅,不能閑著啊功咒,精明的小馬哥一拍腦袋,組建了TT云團(tuán)隊绞蹦。通過多年的努力開發(fā)了按量付費(fèi)云力奋、彈性IP、共享帶寬等等產(chǎn)品為中小企業(yè)開源節(jié)流幽七。
故障轉(zhuǎn)移
小明同學(xué)覺得這款鍵盤不錯景殷,美滋滋的點(diǎn)擊購買按鈕,突然跳到了登陸頁面澡屡。
什么鬼猿挚,褲子我都脫了,你就給我看這個驶鹉?普通用戶可能不會覺得有什么問題绩蜻,重新登陸一次就是了。但是小明作為一只嚴(yán)謹(jǐn)?shù)某绦蛟呈衣瘢肱靼灼渲械降装l(fā)生了什么办绝。
經(jīng)過仔細(xì)的查閱資料分析,小明得出了以下結(jié)論:
發(fā)生以上故障姚淆,小明以為自己下單的那臺服務(wù)掛機(jī)了孕蝉,請求被分發(fā)到另一臺服務(wù)上,但為什么會跳到登陸頁面呢腌逢?作為一名程序員降淮,小明清楚的知道服務(wù)分為有狀態(tài)和無狀態(tài)的,盡管我們平時的HTTP請求是無狀態(tài)的搏讶,但是一般會通過cookie或者session來確定用戶狀態(tài)骤肛。
到這里纳本,各位看官應(yīng)該明白到底是個什么鬼了吧。就拿我們比較熟悉的Tomcat來說腋颠,我們的用戶信息一般存儲在session中,而session存儲在Tomcat內(nèi)存中吓笙。瀏覽器通過cookie中的JSESSIONID來與服務(wù)器進(jìn)行認(rèn)證淑玫。
然服務(wù)器掛了,下單請求被分發(fā)到另一臺服務(wù)面睛,自然小明再也找不到他的session了絮蒿。
小明同學(xué)把問題反饋給了TT貓,小馬哥一看這還得了叁鉴,集群都做了還差這點(diǎn)土涝,于是趕緊叫工程師們拿出解決方案。
工程師最終提出了兩種方案:
服務(wù)器用戶狀態(tài)復(fù)制(成本大幌墓,需要軟硬件支持但壮,有延遲,存在失敗的風(fēng)險)
統(tǒng)一存儲用戶狀態(tài)(我不說話常侣,我就笑笑)
最終蜡饵,工程師們采用第二種方案,使用Redis存儲用戶狀態(tài)數(shù)據(jù)胳施。