服務端,顧名思義就是爲用戶提供服務的。
停工時間,就是不能向用戶提供服務的時間。
高可用,就是系統具備高度可用性,儘可能減小停工時間。html
停工的緣由通常有:nginx
停工的緣由,能夠理解爲災難,因此係統的高可用性就是容災,即應對災難的能力,系統有較好的容災能力,也就是即便災難出現,系統依然能夠正常工做。redis
例如:sql
從範圍了說,有多是一臺機器,也有多是多臺機器(機房或者某個區域,例如廣東),甚至所有機器(那就沒救了。。)。mongodb
思路就是在多臺機器上部署服務,即便一臺機器出現問題,其餘機器依然能夠提供服務。固然,比較可靠的是,多臺機器最好在不一樣的機房,不一樣的地域,可是對應的成本也會上升。數據庫
主服務負責提供服務,從服務負責監測主服務器的心跳。當主服務出現問題,馬上轉換爲從服務器提供服務。例如Mysql的主從架構。緩存
在N臺機器上面,運行N個服務,經過負載均衡,把請求分發到不一樣的機器。當其中一臺機器出現問題。系統會自動的切換流量,也就是把請求都導流到其餘正常的機器上。服務器
例如:微信
優化思路:網絡
系統繁忙,請稍後再試
。不然,用戶會不斷重試,讓已經負載很高的系統雪上加霜。在客戶端,要限制重試的頻率,例如30s後才能重試,或者沒有收到服務端的返回前,不能再次提交請求。也能夠在Nginx層加入限制,同一IP1秒內不能發送多於N個請求,多於的就快速拒絕,防止被攻擊。當咱們採用了各類措施來提高系統的容災能力後,怎麼測試咱們的措施是否有用呢?
應用通常都是針對上面的機器問題致使的機器層面的災難,由於業務層面的,通常是在代碼開發階段考慮的。
高可用能夠分爲兩個關鍵點:
多節點,也就是要部署多個節點,不管其餘節點是掛起狀態(主從),仍是工做昨天(多機多工)。
當有了多節點後,仍是不夠的,由於當災難來臨的話,若是要人工去切換流量,必然要花費較長時間,因此須要有自動切換流量的機制。
自動切換流量的另外一個功能就是,當損壞的節點恢復後,流量又會自動得切回去。
經常使用的服務端架構,通常是這樣:
會部署多個Nginx層,DNS服務器中部署多個IP,這樣DNS服務器會把流量均勻地分到多個Nginx。
缺點是:
本機的hosts配置中,能夠設置一個域名對應多個IP,設置方法:
192.168.137.130 www.test.com
192.168.137.133 www.test.com
hosts的解析策略是,先訪問第一個IP,若是失敗,纔會訪問第二個IP
因此沒有負載均衡的功能,可是有自動流量切換的功能。
Nginx裏面能夠配置多個服務層。
Nginx有監聽服務層是否可用的機制(upstream),因此能夠實現自動切換流量
nginx配置
upstream gunicorn_pool { #server 地址:端口號 weight表示權值,權值越大,被分配的概率越大;max_fails表示在fail_timeout中失敗的最大次數,若是達到該次數,就再也不導流量到該server server 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。裏面有兩個服務層(130和137)
若是兩個服務層都正常,Nginx會把流量根據weight值,導流到兩個服務器。
同一個請求中,若是nginx導流到server1,發現返回的是錯誤響應(例如502),nginx會把請求再發送server2,至關於重試。這時會記錄server1的fail次數+1
若是再fail_timeout時間內,server1的fail次數超過max_fails,在fail_timeout時間內,nginx就不會再把其餘請求導流到server1了。
上面的機制,就能夠實現自動的流量切換。固然也有負載均衡的功能,這個就是高併發的範疇了。
經常使用的緩存有redis和mongodb
經常使用的數據庫就是Mysql了。
配置DNS服務器,一個域名,對應多個IP。
缺點是不能實現流量自動切換,例如S1掛了,DNS仍是會返回S1的iP給客戶端。客戶端可能要重試幾回,纔會拿到其餘Server的IP,才能實現鏈接。
因爲TCP是長鏈接,因此獲取IP的請求是不多的,因此能夠本身寫一個接口,客戶端經過接口來獲取TCP Server的IP地址。
這樣接口裏面就能夠作到自動切換流量了。例如A機器已經掛了,就不會返回A機器的IP了。
TCP Server能夠把自身的狀態在Redis,而後接口那邊就能夠獲取TCP Server的狀態了
也能夠TCP Server提供一個http接口,返回自身的狀態,供get-ip接口那邊調用。
參考:
柔性可用——移動互聯網時代的一秒響應祕訣
發這麼多紅包 微信IT架構爲啥沒崩潰?
高可用性
騰訊大講堂:發10億個紅包,微信爲啥沒崩潰?
關於柔性可用的一些思考