三分鐘深入TT貓之故障轉(zhuǎn)移

結(jié)束了一周繁忙的工作嚣崭,趁著周末笨触,小編手中的鍵盤早已饑渴難耐了,想知道上期省略號中發(fā)生了什么有趣的故事么雹舀?且聽小編娓娓道來芦劣,結(jié)尾有彩蛋。

目錄

1.png

風(fēng)月前場

春風(fēng)再續(xù)说榆,書接上回虚吟,春香園的老鴇媽媽寸认,給這位血?dú)夥絼偟尿}年挑選了一位佳人A,于是乎騷年興致勃勃的進(jìn)入了閨房串慰,宜言飲酒偏塞,與子同歡,琴瑟在御邦鲫,莫不靜好灸叼,誰知佳人A突然來月事了(這個(gè)事先老鴇是不知道的)

我了個(gè)擦,春宵一刻值千金啊庆捺,趕召喚系老鴇兒怜姿,老鴇先是把A從侍客名單中剔除,隨后趕緊給這位騷年換了一位佳人B疼燥,歌管樓臺聲細(xì)細(xì)沧卢,秋千院落夜沉沉,哈哈哈醉者,又是一個(gè)難忘的夜晚......

2.jpg

夢回現(xiàn)實(shí)

哎但狭,少年,醒醒撬即,別做夢了立磁,快起來搬磚了

3.jpg

其實(shí)在實(shí)際生產(chǎn)中,我們的負(fù)載均衡器可能要更加溫柔體貼智能剥槐,不能讓用戶有一絲感覺到服務(wù)器也來大姨媽唱歧。

  • 還記得我們的TT貓,下單失敗的場景么粒竖?被強(qiáng)行跳轉(zhuǎn)到登陸頁颅崩。

  • 還記得雙十一妹子那幽怨的小眼神么?可能你已在偷偷樂了蕊苗。

  • 還記得程序員小明瞎白活了一頓原理么沿后?其實(shí)可能他自己都沒搞明白。

模擬老鴇

在講如何體貼之前朽砰,先給大家傳授幾種老鴇經(jīng)常使用的分配手法尖滚,為了讓大家更加形象直觀的了解老鴇的內(nèi)心,小編決定帶大家扒開來看瞧柔,當(dāng)然了鴇媽的內(nèi)心也是一坨代碼而已漆弄。

4.jpg

首先我們定義一個(gè)OldBird,接著安排四個(gè)smallBirds值班造锅。

/**
 * 老鴇
 * 創(chuàng)建時(shí)間 2017年9月17日
 */
public class OldBird {
    // Key代表風(fēng)塵X子撼唾,Value代表該風(fēng)塵X子的受歡迎程度
    public static Map<String, Integer> smallBirds = new ConcurrentHashMap<String, Integer>();

    static {
        smallBirds.put("野雞", 1);
        smallBirds.put("幺二", 2);
        smallBirds.put("長三", 3);
        smallBirds.put("書寓", 4);
    }
}

開張了,開張了备绽,顯然第一位客人并沒有入的了鴇兒的法眼券坞,隨機(jī)了一個(gè)后繼續(xù)嗑她的瓜子。

/**
 * 隨機(jī) 
 * 創(chuàng)建時(shí)間 2017年9月17日
 */
public class Random {
    public static String getServer() {
        // 獲取值班名單
        Set<String> keySet = ServerMap.servers.keySet();
        ArrayList<String> keyList = new ArrayList<String>();
        keyList.addAll(keySet);
        // 老鴇看人辦事 精打細(xì)算了一下肺素、隨即了一個(gè)
        java.util.Random random = new java.util.Random();
        int randomPos = random.nextInt(keyList.size());
        // 程序員小明獲取了一個(gè)smallBird
        return keyList.get(randomPos);
    }
}

可能是鴇媽的隨機(jī)有點(diǎn)看心情恨锚,導(dǎo)致后院有些人有點(diǎn)不高興了,于是乎趕緊采取了另一種策略倍靡。

/**
 * 輪詢 
 * 創(chuàng)建時(shí)間 2017年9月17日
 */
public class RoundRobin {
    private static Integer pos = 0;

    public static String getServer() {
        //獲取今日值班名單
        Set<String> keySet = ServerMap.servers.keySet();
        ArrayList<String> keyList = new ArrayList<String>();
        keyList.addAll(keySet);
        //有些人 活太少 可能會不高興 還是排號來吧
        String server = null;
        synchronized (pos) {
            if (pos >= keySet.size())
                pos = 0;
            server = keyList.get(pos);
            pos++;
        }
        // 程序員小明獲取了一個(gè)smallBird
        return server;
    }
}

這時(shí)候大茶壺急急忙忙的趕到老鴇身邊猴伶,哎,別嗑了塌西,韋爺點(diǎn)名要書寓他挎,趕緊給安排安排,老鴇一想臣裥瑁客啊办桨,不行,我得好好編排一下站辉,省的老被打擾呢撞。

/**
 * 源地址哈希
 * 創(chuàng)建時(shí)間 2017年9月17日
 */
public class Hash {
    public static String getServer()      
    {      
        //獲取今日值班名單
        Set<String> keySet = ServerMap.servers.keySet();      
        ArrayList<String> keyList = new ArrayList<String>();      
        keyList.addAll(keySet);  
        //韋爺 悠哉的進(jìn)來的 點(diǎn)名要書寓
        String remoteGuest = "韋爺";      
        //老鴇給韋爺 設(shè)置固定編號
        int hashCode = remoteGuest.hashCode();
        int serverListSize = keyList.size();
        int serverPos = hashCode % serverListSize;
        //韋爺獲取到了指定服務(wù)
        return keyList.get(serverPos);      
    }      
}

讀到最后,小伙伴們可能要問了饰剥,那個(gè)Map中的Value并沒有起作用啊殊霞,讓老鴇吃了么?其實(shí)汰蓉,只是感覺用在這里不妥而已绷蹲,有些事,你懂我懂大家都懂顾孽。

具體到生產(chǎn)架構(gòu)中祝钢,應(yīng)該是這個(gè)樣子的

/**
 * 服務(wù)器負(fù)載均衡集群組 
 * 創(chuàng)建時(shí)間 2017年9月17日
 */
public class ServerMap {
    // Key代表服務(wù)器,Value代表該服務(wù)的權(quán)重
    public static Map<String, Integer> servers = new ConcurrentHashMap<String, Integer>();
    static {
        //這里有四個(gè)服務(wù) 權(quán)重分別是1234
        servers.put("1核1G-服務(wù)器", 1);
        servers.put("2核2G-服務(wù)器", 2);
        servers.put("3核3G-服務(wù)器", 3);
        servers.put("4核4G-服務(wù)器", 4);
    }
}

能者多勞若厚,權(quán)重視服務(wù)器的性能而定太颤,下面的算法,服務(wù)器4每次有百分之四十的幾率被獲取到盹沈。

/**
 * 加權(quán)輪詢
 * 創(chuàng)建時(shí)間 2017年9月17日
 */
public class WeightRoundRobin {
    private static Integer pos = 0;   

    public static String getServer()   
    {   
        //取得服務(wù)器List   
        Set<String> keySet = ServerMap.servers.keySet();   
        Iterator<String> iterator = keySet.iterator();   
        //計(jì)算權(quán)重總數(shù) 累加 比如 4核4G-服務(wù)器  權(quán)重為4 上述10個(gè)服務(wù)器中存在4個(gè)4核4G-服務(wù)器服務(wù)  增加隨機(jī)或者輪詢幾率
        List<String> serverList = new ArrayList<String>();   
        while (iterator.hasNext())   
        {   
            String server = iterator.next();   
            int weight = ServerMap.servers.get(server);   
            for (int i = 0; i < weight; i++)   
                serverList.add(server);   
        }   

        String server = null;   
        synchronized (pos)   
        {   
            if (pos >= keySet.size())   
                pos = 0;   
            server = serverList.get(pos);   
            pos ++;   
        }   

        return server;   
    }  
}

說了這么多龄章,以上只是幾種簡單的負(fù)載均衡算法,在 記一次JavaWeb網(wǎng)站技術(shù)架構(gòu)總結(jié) 中有提到十種負(fù)載均衡策略以及其優(yōu)缺點(diǎn)乞封,有興趣的同學(xué)可以一看做裙。

會話機(jī)制

各位看官莫急,要想弄明白故障轉(zhuǎn)移是怎么回事肃晚,必須要弄明白客戶端-服務(wù)端的會話認(rèn)證機(jī)制锚贱。

由于HTTP協(xié)議本身是無狀態(tài)的,這與HTTP協(xié)議本來的目的是相符的关串,那么小馬哥是怎么知道那些用戶買了那些東西的呢拧廊?

以Tomcat為例监徘,大家都知道session是在服務(wù)器端創(chuàng)建并存儲到容器的JVM內(nèi)存中的,瀏覽器初次訪問服務(wù)器會生成一個(gè)叫JSESSIONID的cookie吧碾,瀏覽器的每次請求都會附帶這個(gè)cookie凰盔,服務(wù)端通過JSESSIONID會找到內(nèi)存中對應(yīng)的狀態(tài)信息。

程序員小明倦春,打開TT貓户敬,輸入自己的賬號密碼,附帶cookie信息請求到了后臺睁本,TT貓后臺校驗(yàn)成功以后尿庐,會把用戶信息保存到JSESSIONID對應(yīng)的內(nèi)存中,這樣小明和TT貓就可以無障礙的深入交流了呢堰。

這個(gè)過程也可以用以下示意圖來描述:

5.png

如果你覺得會話機(jī)制如此簡單抄瑟,那可就有點(diǎn)高看小編了,篇幅有限枉疼,對會話機(jī)制感興趣的同學(xué)只能自行查閱資料了锐借。

故障轉(zhuǎn)移

老鴇之所以能快速安撫騷年使其順利度過這纏綿之夜,有沒有感受到老鴇強(qiáng)大的人工智能氣息往衷?

6.jpg

其實(shí)我們的負(fù)載均衡器Nginx钞翔,也是做的相當(dāng)智能的,如果后端節(jié)點(diǎn)服務(wù)器宕掉的話席舍,Nginx通過自帶的模塊可以把這臺壞掉的服務(wù)踢出upstream負(fù)載集群組布轿,然后自動切換到健康節(jié)點(diǎn)來提供訪問。

有過開發(fā)經(jīng)驗(yàn)的小伙伴来颤,都知道服務(wù)分有狀態(tài)和無狀態(tài)汰扭。

  • 無狀態(tài)服務(wù)(Stateless Service):游客瀏覽商品、搜索商品等等這種不需要鑒權(quán)的操作福铅。

  • 有狀態(tài)服務(wù)(Stateful Service): 添加購物車萝毛,下單,支付等等需要用戶認(rèn)證的操作滑黔。

對于這種無狀態(tài)的服務(wù)請求笆包,不管集群組使用任何負(fù)載均衡算法(隨機(jī)、輪詢略荡、hash)庵佣,只要有一個(gè)存活,小馬哥的TT貓就可以提供正常服務(wù)汛兜。

但是對于支付這種需要用戶認(rèn)證的操作巴粪,不得不說,我們要選擇合適的負(fù)載均衡算法。

服務(wù)獨(dú)自存儲用戶狀態(tài)

  • 隨機(jī)肛根、輪詢算法辫塌,小明可能一輩子都無法登陸TT貓
  • hash算法,單一服務(wù)宕掉的話會導(dǎo)致用戶狀態(tài)丟失

服務(wù)統(tǒng)一存儲用戶狀態(tài)

架構(gòu)設(shè)計(jì)之Spring-Session分布式集群會話管理

總結(jié)

7.png

秋名山上行人稀派哲,常有框架較高低臼氨,如今原理依舊在,不見當(dāng)年老框架狮辽。

底層原理可能你這輩子都不過時(shí)陵且,解決問題的能力永遠(yuǎn)都不過時(shí)盟劫,積極向上的求知欲永遠(yuǎn)是你的強(qiáng)大后盾俐末。

既定目標(biāo)赴叹,做個(gè)有追求的程序員萨蚕,如果你連算法數(shù)據(jù)結(jié)構(gòu)都能搞得明白竹观,網(wǎng)絡(luò)傳輸都可以手到擒來阿弃,怎學(xué)不會簡單的API調(diào)用石洗?

塞內(nèi)加在《論生命之短暫》中說過“如果一個(gè)人出海遇到狂風(fēng)暴雨谦絮,被變換肆虐的風(fēng)吹得團(tuán)團(tuán)轉(zhuǎn)题诵,你可能會覺得他航行了很遠(yuǎn)。其實(shí)航行得并不遠(yuǎn)层皱,只是浮沉動蕩的時(shí)間長而已”性锭,沒錯(cuò)如今的知識就像出海時(shí)遇到的狂風(fēng)暴雨,我們只是被吹的原地團(tuán)團(tuán)轉(zhuǎn)而已叫胖,并沒有在知識的海洋航行很遠(yuǎn)草冈。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市瓮增,隨后出現(xiàn)的幾起案子怎棱,更是在濱河造成了極大的恐慌,老刑警劉巖绷跑,帶你破解...
    沈念sama閱讀 212,185評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拳恋,死亡現(xiàn)場離奇詭異,居然都是意外死亡砸捏,警方通過查閱死者的電腦和手機(jī)谬运,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,445評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來垦藏,“玉大人吩谦,你說我怎么就攤上這事∠ヅ海” “怎么了式廷?”我有些...
    開封第一講書人閱讀 157,684評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長芭挽。 經(jīng)常有香客問我滑废,道長蝗肪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,564評論 1 284
  • 正文 為了忘掉前任蠕趁,我火速辦了婚禮薛闪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘俺陋。我一直安慰自己豁延,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,681評論 6 386
  • 文/花漫 我一把揭開白布腊状。 她就那樣靜靜地躺著诱咏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缴挖。 梳的紋絲不亂的頭發(fā)上袋狞,一...
    開封第一講書人閱讀 49,874評論 1 290
  • 那天,我揣著相機(jī)與錄音映屋,去河邊找鬼苟鸯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛棚点,可吹牛的內(nèi)容都是我干的早处。 我是一名探鬼主播,決...
    沈念sama閱讀 39,025評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼瘫析,長吁一口氣:“原來是場噩夢啊……” “哼陕赃!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起颁股,我...
    開封第一講書人閱讀 37,761評論 0 268
  • 序言:老撾萬榮一對情侶失蹤么库,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后甘有,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诉儒,經(jīng)...
    沈念sama閱讀 44,217評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,545評論 2 327
  • 正文 我和宋清朗相戀三年亏掀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了忱反。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,694評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡滤愕,死狀恐怖温算,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情间影,我是刑警寧澤注竿,帶...
    沈念sama閱讀 34,351評論 4 332
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響巩割,放射性物質(zhì)發(fā)生泄漏裙顽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,988評論 3 315
  • 文/蒙蒙 一宣谈、第九天 我趴在偏房一處隱蔽的房頂上張望愈犹。 院中可真熱鬧,春花似錦闻丑、人聲如沸漩怎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,778評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勋锤。三九已至,卻和暖如春酸钦,著一層夾襖步出監(jiān)牢的瞬間怪得,已是汗流浹背咱枉。 一陣腳步聲響...
    開封第一講書人閱讀 32,007評論 1 266
  • 我被黑心中介騙來泰國打工卑硫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蚕断。 一個(gè)月前我還...
    沈念sama閱讀 46,427評論 2 360
  • 正文 我出身青樓欢伏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親亿乳。 傳聞我的和親對象是個(gè)殘疾皇子硝拧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,580評論 2 349

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