日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

用简单的方法构建一个高可用服务端

發(fā)布時間:2024/1/17 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用简单的方法构建一个高可用服务端 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨角獸企業(yè)重金招聘Python工程師標準>>>

一. 什么是高可用性

服務(wù)端,顧名思義就是為用戶提供服務(wù)的。
停工時間,就是不能向用戶提供服務(wù)的時間。
高可用,就是系統(tǒng)具有高度可用性,盡量減少停工時間。

停工的原因一般有:

  • 服務(wù)器故障。例如服務(wù)器宕機,服務(wù)器網(wǎng)絡(luò)出現(xiàn)問題,機房或者機架出現(xiàn)問題等。
  • 訪問量急劇上升,導(dǎo)致服務(wù)器壓力過大。導(dǎo)致訪問量急劇上升的原因有:
  • 時間和訪問量都可以預(yù)見的,例如秒殺活動,售票系統(tǒng)。
  • 時間和訪問量都不可以預(yù)見的,例如特發(fā)性新聞(馬航失聯(lián)的事件)
  • 停工的原因,可以理解為災(zāi)難,所以系統(tǒng)的高可用性就是容災(zāi),即應(yīng)對災(zāi)難的能力,系統(tǒng)有較好的容災(zāi)能力,也就是即使災(zāi)難出現(xiàn),系統(tǒng)依然可以正常工作。

    二. 怎么提升系統(tǒng)的高可用性

    1. 機器層面的災(zāi)難

    例如:

    • 機器宕機(其中一臺服務(wù)器宕機了)
    • 機房故障(機房被水淹了)
    • 網(wǎng)絡(luò)異常(電信的某條光纖被挖斷了)

    從范圍了說,有可能是一臺機器,也有可能是多臺機器(機房或者某個區(qū)域,例如廣東),甚至全部機器(那就沒救了。。)。

    思路就是在多臺機器上部署服務(wù),即使一臺機器出現(xiàn)問題,其他機器依然可以提供服務(wù)。當(dāng)然,比較可靠的是,多臺機器最好在不同的機房,不同的地域,但是對應(yīng)的成本也會上升。

    1. 主從方式

    主服務(wù)負責(zé)提供服務(wù),從服務(wù)負責(zé)監(jiān)測主服務(wù)器的心跳。當(dāng)主服務(wù)出現(xiàn)問題,立刻轉(zhuǎn)換為從服務(wù)器提供服務(wù)。例如Mysql的主從架構(gòu)。

    2.多機多工方式

    在N臺機器上面,運行N個服務(wù),通過負載均衡,把請求分發(fā)到不同的機器。當(dāng)其中一臺機器出現(xiàn)問題。系統(tǒng)會自動的切換流量,也就是把請求都導(dǎo)流到其他正常的機器上。

    2. 業(yè)務(wù)層面的災(zāi)難

    例如:

    • 程序出bug了
    • 訪問量急劇上升(預(yù)計QPS是1k,突然去到1w)

    優(yōu)化思路:

  • 大系統(tǒng)小做。一個大系統(tǒng),必然會有許多模塊,把這些模塊切分為多個小服務(wù)。例如用戶系統(tǒng),是一個獨立的服務(wù),消費系統(tǒng),是一個獨立的服務(wù)。每個服務(wù)都提供訪問的API,給其他服務(wù)訪問。缺點是服務(wù)與服務(wù)之間的通訊成本增加,開發(fā)成本也會增加,因為要開發(fā)API。但是好處是:
  • 必要的時候,這些API可以提供給外部
  • 符合高內(nèi)聚低耦合的原則
  • 當(dāng)某個服務(wù)壓力上升時,或者服務(wù)出現(xiàn)bug時,其他不依賴于問題服務(wù)的服務(wù),依然可以正常工作。例如消費服務(wù)出現(xiàn)問題,但是聊天服務(wù)可以依然可以正常工作。
  • 有損服務(wù)。讓服務(wù)延遲執(zhí)行,以保證核心需求得到很好的處理。例如微信搶紅包,核心需求是立刻知道搶紅包的結(jié)果,所以服務(wù)端先返回搶紅包的結(jié)果,而用戶對是否即時入賬并不關(guān)心,所以,把入賬這個過程,放在異步隊列里面做。
  • 柔性可用。在正常服務(wù)和停工之間增加一個狀態(tài):部分可用。當(dāng)壓力上來的時候,可以停止某些非必要服務(wù),以保證必要服務(wù)可以正常運行。又例如遇到bug的時候,短時間內(nèi)不能立刻修復(fù),而且出bug的業(yè)務(wù)又是非必要業(yè)務(wù),可以先停止bug的業(yè)務(wù),當(dāng)然,這些要事先跟產(chǎn)品方商量好。
  • 快速拒絕(過載保護)。檢查當(dāng)前系統(tǒng)的負載請求,如果負載過高,立刻返回等待提示,例如:系統(tǒng)繁忙,請稍后再試。否則,用戶會不斷重試,讓已經(jīng)負載很高的系統(tǒng)雪上加霜。在客戶端,要限制重試的頻率,例如30s后才能重試,或者沒有收到服務(wù)端的返回前,不能再次提交請求。也可以在Nginx層加入限制,同一IP1秒內(nèi)不能發(fā)送多于N個請求,多于的就快速拒絕,防止被攻擊。
  • 3. 驗證高可用

    當(dāng)我們采用了各種措施來提升系統(tǒng)的容災(zāi)能力后,怎么測試我們的措施是否有用呢?

  • 模擬客戶端低網(wǎng)速。這個可以通過Fiddler來模擬
  • 模擬服務(wù)端丟包。可以使用netern和tc
  • 使用ab進行壓測。
  • 模擬服務(wù)器宕機,可以直接斷開服務(wù)器網(wǎng)絡(luò)來模擬
  • 三、應(yīng)用

    應(yīng)用一般都是針對上面的機器問題導(dǎo)致的機器層面的災(zāi)難,因為業(yè)務(wù)層面的,一般是在代碼開發(fā)階段考慮的。

    高可用可以分為兩個關(guān)鍵點:

    • 多節(jié)點
    • 自動切換流量

    多節(jié)點,也就是要部署多個節(jié)點,無論其他節(jié)點是掛起狀態(tài)(主從),還是工作昨天(多機多工)。
    當(dāng)有了多節(jié)點后,還是不夠的,因為當(dāng)災(zāi)難來臨的話,如果要人工去切換流量,必然要花費較長時間,所以需要有自動切換流量的機制。
    自動切換流量的另一個功能就是,當(dāng)損壞的節(jié)點恢復(fù)后,流量又會自動得切回去。

    四、HTTP的應(yīng)用

    常用的服務(wù)端架構(gòu),一般是這樣:

    ?

    Alt text

    • 客戶端從DNS服務(wù)器獲取服務(wù)器的IP
    • 客戶端發(fā)起請求,請求先到Nginx層
    • Nginx層分發(fā)請求到服務(wù)層
    • 如果需要,服務(wù)層會請求上游的服務(wù)層,例如向用戶系統(tǒng)獲取用戶數(shù)據(jù)。一般會已通過HTTP來實現(xiàn)。
    • 如果需要,服務(wù)層會訪問緩存層,獲取數(shù)據(jù)
    • 如果需要,服務(wù)層會訪問數(shù)據(jù)庫層,獲取數(shù)據(jù)

    1. 客戶端層到Nginx層

    會部署多個Nginx層,DNS服務(wù)器中部署多個IP,這樣DNS服務(wù)器會把流量均勻地分到多個Nginx。
    缺點是:

    • 不能自動切換流量。當(dāng)其中一臺Nginx不可用了,DNS服務(wù)器并不知道,所以不會自動切換流量

    本機的hosts配置中,可以設(shè)置一個域名對應(yīng)多個IP,設(shè)置方法:
    192.168.137.130?www.test.com
    192.168.137.133?www.test.com
    hosts的解析策略是,先訪問第一個IP,如果失敗,才會訪問第二個IP
    所以沒有負載均衡的功能,但是有自動流量切換的功能。

    2. Nginx到服務(wù)層

    Nginx里面可以配置多個服務(wù)層。
    Nginx有監(jiān)聽服務(wù)層是否可用的機制(upstream),所以可以實現(xiàn)自動切換流量

    nginx配置

    upstream gunicorn_pool {#server 地址:端口號 weight表示權(quán)值,權(quán)值越大,被分配的幾率越大;max_fails表示在fail_timeout中失敗的最大次數(shù),如果達到該次數(shù),就不再導(dǎo)流量到該serverserver 192.168.137.130:9098 weight=4 max_fails=2 fail_timeout=30s;server 192.168.137.133:9098 weight=4 max_fails=2 fail_timeout=30s; }server {listen 80;server_name 127.0.0.1 www.test.com;access_log /data/logs/nginx_access.log;error_log /data/logs/nginx_error.log;location @gunicorn_proxy {proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Host $http_host;proxy_redirect off;proxy_pass http://gunicorn_pool;} }

    配置一個upstream,gunicorn_pool。里面有兩個服務(wù)層(130和137)
    如果兩個服務(wù)層都正常,Nginx會把流量根據(jù)weight值,導(dǎo)流到兩個服務(wù)器。
    同一個請求中,如果nginx導(dǎo)流到server1,發(fā)現(xiàn)返回的是錯誤響應(yīng)(例如502),nginx會把請求再發(fā)送server2,相當(dāng)于重試。這時會記錄server1的fail次數(shù)+1
    如果再fail_timeout時間內(nèi),server1的fail次數(shù)超過max_fails,在fail_timeout時間內(nèi),nginx就不會再把其他請求導(dǎo)流到server1了。

    上面的機制,就可以實現(xiàn)自動的流量切換。當(dāng)然也有負載均衡的功能,這個就是高并發(fā)的范疇了。

    3. 服務(wù)層到上游服務(wù)器

  • DNS服務(wù)器。使用DNS服務(wù)器把流量均分到上游服務(wù)層。缺點也是不能自動切換流量
  • RPC-client。在服務(wù)器的機器中,部署一個RPC-client,一般的實現(xiàn)方案是啟動一個Nginx,利用Nginx的upstream功能來分發(fā)流量,同時可以實現(xiàn)自動流量切換。服務(wù)層到上游服務(wù)層的請求,會先發(fā)到RPC-client,然后再到上游服務(wù)層,相當(dāng)于加了一個HTTP代理。
  • 4.服務(wù)層到緩存層

    常用的緩存有redis和mongodb

    1.redis

    • 主從架構(gòu)
    • 哨兵架構(gòu)
    • 集群架構(gòu)

    redis cluster

    2.mongo

    • 主從架構(gòu)
    • 副本集架構(gòu)
    • 分片

    mongo HA

    5.服務(wù)層到數(shù)據(jù)庫層

    常用的數(shù)據(jù)庫就是Mysql了。

    • 一主多從(主從復(fù)制)
    • 二主多從(主主復(fù)制)

    五、TCP的應(yīng)用

    1. DNS方法

    配置DNS服務(wù)器,一個域名,對應(yīng)多個IP。
    缺點是不能實現(xiàn)流量自動切換,例如S1掛了,DNS還是會返回S1的iP給客戶端。客戶端可能要重試幾次,才會拿到其他Server的IP,才能實現(xiàn)連接。

    2.get-ip接口

    由于TCP是長連接,所以獲取IP的請求是很少的,所以可以自己寫一個接口,客戶端通過接口來獲取TCP Server的IP地址。
    這樣接口里面就可以做到自動切換流量了。例如A機器已經(jīng)掛了,就不會返回A機器的IP了。
    TCP Server可以把自身的狀態(tài)在Redis,然后接口那邊就可以獲取TCP Server的狀態(tài)了
    也可以TCP Server提供一個http接口,返回自身的狀態(tài),供get-ip接口那邊調(diào)用。
    在互聯(lián)網(wǎng)公司面試中,架構(gòu)的底層一定是面試官會問問的問題,針對面試官一般會提到的問題,我錄制了一些分布式,微服務(wù),性能優(yōu)化等技術(shù)點底層原理的錄像視頻,加群619881427可以免費獲取這些錄像,里面還有些分布式,微服務(wù),性能優(yōu)化,春天設(shè)計時,MyBatis的等源碼知識點的錄像視頻。這些視頻都是 找一些資深架構(gòu)師朋友一起錄制出來的,這些視頻幫助以下幾類程序員:

    1.對現(xiàn)在的薪資不滿,想要跳槽,卻對自己的技術(shù)沒有信心,不知道如何面對面試官。

    2.想從傳統(tǒng)行業(yè)轉(zhuǎn)行到互聯(lián)網(wǎng)行業(yè),但沒有接觸過互聯(lián)網(wǎng)技術(shù)。

    3.工作1 - 5年需要提升自己的核心競爭力,但學(xué)習(xí)沒有系統(tǒng)化,不知道自己接下來要學(xué)什么才是正確的,踩坑后又不知道找誰,百度后依然不知所以然。

    4.工作5 - 10年無法突破技術(shù)瓶頸(運用過很多技術(shù),在公司一直寫著業(yè)務(wù)代碼,卻依然不懂底層實現(xiàn)原理)

    如果你現(xiàn)在正處于我上述所說的幾個階段可以加下我的群來學(xué)習(xí)。而且我也能夠提供一些面試指導(dǎo),職業(yè)規(guī)劃等建議。

    轉(zhuǎn)載于:https://my.oschina.net/u/3779583/blog/1818255

    總結(jié)

    以上是生活随笔為你收集整理的用简单的方法构建一个高可用服务端的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。