什麼是集羣?
集羣是一組相互獨立的、通過高速網絡互聯的計算機,它們構成了一個組,並以單一系統的模式加以管理。一個客戶與集羣相互作用時,集羣像是一個獨立的服務器。集羣配置是用於提高可用性和可縮放性。
——摘自百度百科
集羣的好處
1 提高性能
一些計算密集型應用,如:天氣預報、核試驗模擬等,需要計算機要有很強的運算處理能力,現有的技術,即使普通的大型機器計算也很難勝任。這時,一般都使用計算機集羣技術,集中幾十臺甚至上百臺計算機的運算能力來滿足要求。提高處理性能一直是集羣技術研究的一個重要目標之一。
2 降低成本
通常一套較好的集羣配置,其軟硬件開銷要超過100000美元。但與價值上百萬美元的專用超級計算機相比已屬相當便宜。在達到同樣性能的條件下,採用計算機集羣比採用同等運算能力的大型計算機具有更高的性價比。
3 提高可擴展性
用戶若想擴展系統能力,不得不購買更高性能的服務器,才能獲得額外所需的CPU 和存儲器。如果採用集羣技術,則只需要將新的服務器加入集羣中即可,對於客戶來看,服務無論從連續性還是性能上都幾乎沒有變化,好像系統在不知不覺中完成了升級。
4 增強可靠性
集羣技術使系統在故障發生時仍可以繼續工作,將系統停運時間減到最小。集羣系統在提高系統的可靠性的同時,也大大減小了故障損失。
集羣架構圖
那麼問題來了,我們的集羣由N太服務器組成,那麼客戶端怎麼知道有這麼多服務器,又該訪問哪一臺服務器呢?今天的主角Nginx就是用來幹這個事情的。
Nginx概述
Nginx (engine x) 是一個高性能的HTTP和反向代理web服務器,同時也提供了IMAP/POP3/SMTP服務。Nginx是由伊戈爾·賽索耶夫爲俄羅斯訪問量第二的Rambler.ru站點(俄文:Рамблер)開發的,第一個公開版本0.1.0發佈於2004年10月4日。
加入Nginx後,我們上面的架構圖就變成
準備程序,這次建一個.NetCore WebApi項目做演示
private IConfiguration _configuration;
public WeatherForecastController(ILogger<WeatherForecastController> logger,IConfiguration configuration)
{
_logger = logger;
_configuration = configuration;
}
[HttpGet]
public IEnumerable<string> Get()
{
//dotnet Cluster.dll --urls="http://*:6666" --ip="127.0.0.1" --port=6666
return new string[] { _configuration["port"] };//獲取命令行參數
}
新建項目使用原始的WeatherForecastController即可,並且注入IConfiguration以便等下命令行啓動程序時獲取端口和ip參數,Get方法中返回獲得的端口參數。
dotnet Cluster.dll --urls="http://*:6666" --ip="127.0.0.1" --port=6666
dotnet Cluster.dll --urls="http://*:7777" --ip="127.0.0.1" --port=7777
dotnet Cluster.dll --urls="http://*:8888" --ip="127.0.0.1" --port=8888
找到項目所在文件目錄cmd,通過命令行啓動多個程序,分別爲6666端口、7777端口、8888端口
分別訪問localhost:6666/WeatherForecast、localhost:7777/WeatherForecast、localhost:8888/WeatherForecast、localhost:9999/WeatherForecast
6666端口、7777端口、8888端口都可以正常訪問並且返回了對應的端口號,因爲我們並沒有啓動9999端口號,所以訪問失敗了。
我們啓動了3個不同端口的服務,想要訪問的話必須得手動輸入端口號。但是實際中,用戶是通過域名或者固定ip訪問的,不能要求用戶手動端口訪問。那麼久需要Nginx進反向代理並且完成負載均衡。
下載Nginx
下載地址:http://nginx.org/en/download.html
配置Nginx
打開conf文件夾下的nginx.conf文件
添加如下配置
啓動Nginx
可以看到我們的URL的8089端口沒有變 但是每次訪問的服務都是不一樣的。成功完成了Nginx的分發。
Nginx的各種策略
1、輪詢
我們上面用到的策略就是輪詢策略,也是Nginx的默認策略。輪詢模式會依次給每個服務器進行分發,相對平均。
2、weight(權重)
我們的服務器配置和各因素會存在性能上的差異,肯定希望把更多的請求分發給性能較高的服務器。那麼久可以使用權重策略。
我們只需在原來的配置加上 weight=權重比例 即可。
3、ip_hash
ip_hash 的作用是,根據訪問者的ip計算hash值 進行轉發,這樣就保證了同一個ip的訪問者永遠經過負載均衡後訪問的是同一個服務器。
4、url_hash