JAVA用最简单的方法来构建一个高可用的服务端,提升系统可用性
一、什么是提升系統(tǒng)的高可用性
JAVA服務(wù)端,顧名思義就是23體驗網(wǎng)為用戶提供服務(wù)的。停工時間,就是不能向用戶提供服務(wù)的時間。高可用,就是系統(tǒng)具有高度可用性,盡量減少停工時間。如何用最簡單的方法來搭建一個高效率可用的服務(wù)端JAVA呢?
停工的原因一般有:
服務(wù)器故障。例如服務(wù)器宕機,服務(wù)器網(wǎng)絡(luò)出現(xiàn)問題,機房或者機架出現(xiàn)問題等;訪問量急劇上升,導(dǎo)致服務(wù)器壓力過大導(dǎo)致訪問量急劇上升的原因;時間和訪問量都可以預(yù)見的,例如23體驗網(wǎng)的秒殺活動,售票系統(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)依然可以正常工作。
二、怎么用JAVA提升系統(tǒng)的高可用性
1、機器層面的災(zāi)難
機房故障(機房被水淹了);網(wǎng)絡(luò)異常(電信的某條光纖被挖斷了)
從范圍了說,有可能是一臺機器,也有可能是多臺機器(機房或者某個區(qū)域,例如廣東),甚至全部機器(那就沒救了..)。思路就是在多臺機器上部署服務(wù),即使一臺機器出現(xiàn)問題,其他機器依然可以提供服務(wù)。當然,比較可靠的是,多臺機器最好在不同的機房,不同的地域,但是對應(yīng)的成本也會上升。這就是構(gòu)建一個高可用服務(wù)端的ngix配置
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.23tiyan.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;}
}
主服務(wù)負責提供服務(wù),從服務(wù)負責監(jiān)測主服務(wù)器的心跳。當主服務(wù)出現(xiàn)問題,立刻轉(zhuǎn)換為從服務(wù)器提供服務(wù)。例如Mysql的的的主從架構(gòu)。
2、多機多工方式
在?臺機器上面,運行?個服務(wù),通過負載均衡,把請求分發(fā)到不同的機器。當其中一臺機器出現(xiàn)問題。系統(tǒng)會自動的切換流量,也就是把請求都導(dǎo)流到其他正常的機器上。程序出錯誤,訪問量急劇上升(預(yù)計QPS是1K,突然去到1W)的。
本機的主機配置中,可以設(shè)置一個域名對應(yīng)多個IP,設(shè)置方法:
192.168.137.130 www.23tiyan.com?
192.168.137.133 www.23tiyan.com?
主機的解析策略是,先訪問第一個IP,如果失敗,才會訪問第二個IP?所以沒有負載均衡的功能,但是有自動流量切換的功能。
3、提升系統(tǒng)可用性的優(yōu)化思路:
大系統(tǒng)小做。一個大系統(tǒng),必然會有許多模塊,把這些模塊切分為多個小服務(wù)。例如用戶系統(tǒng),是一個獨立的服務(wù),消費系統(tǒng),是一個獨立的服務(wù)。每個服務(wù)都提供訪問的API,給其他服務(wù)訪問缺點是服務(wù)與服務(wù)之間的通訊成本增加,開發(fā)成本也會增加,必要的時候,這些API可以提供給外部符合高內(nèi)聚低耦合的原則。
當某個服務(wù)壓力上升時,或者服務(wù)出現(xiàn)錯誤時,其他不依賴于問題服務(wù)的服務(wù),依然可以正常工作。例如消費服務(wù)出現(xiàn)問題,但是聊天服務(wù)可以依然可以正常工作。有損服務(wù)。讓服務(wù)延遲執(zhí)行,以保證核心需求得到很好的處理。例如微信搶紅包,核心需求是立刻知道搶紅包的結(jié)果,所以服務(wù)端先返回搶紅包的結(jié)果,而用戶對是否即時入賬并不關(guān)心,所以,把入賬這個過程,放在異步隊列里面做。也可以TCP Server提供一個http接口,返回自身的狀態(tài),供得到-IP接口那邊調(diào)用。
快速拒絕(過載保護)。檢查當前系統(tǒng)的負載請求,如果負載過高,立刻返回等待提示,例如:系統(tǒng)繁忙,請稍后再試。否則,用戶會不斷重試,讓已經(jīng)負載很高的系統(tǒng)雪上加霜。重試的頻率,例如30秒后才能重試,或者沒有收到服務(wù)端的返回前,不能再次提交請求。也可以在Nginx的層加入限制,同一IP1秒內(nèi)不能發(fā)送多于?個請求,多于的就快速拒絕,防止被攻擊。
當我們采用了各種措施來提升系統(tǒng)的容災(zāi)能力后,怎么測試我們的措施是否有用呢?
三、搭建高可用服務(wù)端后面的應(yīng)用
應(yīng)用一般都是針對上面的機器問題導(dǎo)致的機器層面的災(zāi)難,因為業(yè)務(wù)層面的,一般是在代碼開發(fā)階段考慮的。
高可用可以分為兩個關(guān)鍵點:多節(jié)點;自動切換流量。
多節(jié)點,也就是要部署多個節(jié)點,無論其他節(jié)點是掛起狀態(tài)(主從),還是工作昨天(多機多工)。
當有了多節(jié)點后,還是不夠的,因為當災(zāi)難來臨的話,如果要人工去切換流量,必然要花費較長時間,所以需要有自動切換流量的機制。
自動切換流量的另一個功能就是,當損壞的節(jié)點恢復(fù)后,流量又會自動得切回去。
四、HTTP的應(yīng)用
常用的服務(wù)端架構(gòu),客戶端從DNS服務(wù)器獲取服務(wù)器的IP;客戶端發(fā)起請求,請求先到Nginx的層;Nginx的層分發(fā)請求到服務(wù)層。
總結(jié)
以上是生活随笔為你收集整理的JAVA用最简单的方法来构建一个高可用的服务端,提升系统可用性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022-2028年中国氢化丁晴橡胶行业
- 下一篇: 2022-2028年中国氢化丁腈橡胶行业