Linux伺服器叢集概念辨識

weixin_34337265發表於2017-08-11

Linux伺服器叢集系統各概念辨析

計算機叢集

WEB的負載均衡、叢集、高可用解決方案



計算機叢集

計算機叢集簡稱叢集(Clusters),是一種計算機系統。它通過一組雜湊整合的 軟體或硬體 連線起來高度緊密地協作完成計算工作。在莫種意義上,他們可以被看做是一臺計算機。

叢集系統中的單個計算機通常稱為節點,通常通過內網連線,但也有其它的可能連線方式。叢集計算機通常用來改進單個計算機的計算速度和可靠性。

叢集分類

叢集分為同構和異構,他們區別在於 “組成叢集系統的計算機之間的體系結構是否相同”。

叢集計算機按功能和結構可以分為以下幾類:

高可用性叢集 HA(High-Availability clusters);

負載均衡叢集(Load Balancing clusters);

高效能運算叢集(High Performance clusters);

網格計算(Grid Computing);

叢集技術特點

通過多臺計算機完成同一工作,達到更高的效率;

多臺主機內容、工作過程等完全一樣,其中一臺當機不會影響全域性;



Linux伺服器叢集概念

叢集、冗餘、負載均衡、主從複製、讀寫分離、分散式、分散式計算、分散式計算平臺、平行計算......

實際生產環境中常有的問題:

1,當資料庫效能遇到問題時,是否能夠橫向擴充套件,通過新增伺服器的方式達到更高的吞吐量,從而充分利用現有的硬體實現更好的投資回報率;

2,是否擁有實時同步的副本,當資料庫面臨災難時,可以短時間內通過故障轉移的方式保證資料庫的可用性。此外,當資料丟失或損壞時,能否通過所謂的實時副本(熱備)實現資料的零損失;

3,資料庫的橫向擴充套件是都對應用程式透明,如果資料庫的橫向擴充套件需要應用程式端進行大量修改,則所帶來的後果不僅僅是高昂的開發成本,同時也會帶來很多潛在和非潛在的風險;


叢集和冗餘

叢集和冗餘並不對立,多臺伺服器做叢集(不是主從),本身就有冗餘和負載均衡的效果。

狹義上來說,叢集就是把多臺伺服器虛擬成一臺伺服器,而冗餘的每臺伺服器都是獨立的。

叢集的側重點在於協同,多臺伺服器系統分擔工作,提升效率;

冗餘的側重點在於防止單點故障,一主多備的架構,也就是主從複製;

資料冗餘==高可用性==主從;

主從一定程度上起到了負載均衡的作用,但主要目的還是為了保證資料冗餘和高可用性;

主從只提供一種成本較低的資料備份方案加上不完美的災難和負載均衡,由於複製存在時間差,不能同步讀,所以只是不完善的負載均衡和有損災備;

主從顯然達不到叢集的嚴格度,不論是 HA 還是 AA(多活並行叢集),主從都達不到資料一致性的叢集要求;

主從很難嚴格界定是哪種模式,可以歸類為:

有一定冗餘度的非一致性非同步副本(不可靠不同步);

對於沒有嚴格一致性要求的系統,可以定製為 分擔負載、查詢過時報表;


負載均衡、高可用、高效能是什麼

叢集有負載均衡叢集、高可用叢集、高效能叢集,分別側重於抗併發,避免單點故障和大資料下的並行處理。三者也有不同的實現方法,但同時這三者又是相輔相成的。

負載均衡叢集(Load Balance clusters)

負載均衡著重在於提供服務併發處理能力的叢集。是為了消除效能瓶頸,當然也可以起到備份工作。把負載壓力根據某種演算法合理分配到叢集中的每一臺計算機上,以減輕主伺服器的壓力,降低對主伺服器的硬體和軟體要求

負載均衡執行時,一般通過一個或者多個前端負載均衡器,將工作負載分發到後端的一組伺服器上,從而達到整個系統的高效能和高可用性。這樣的計算機叢集有時也被稱為伺服器群(Server Farm);

實現原理,一個負載均衡器加上一個叢集實現的。負載均衡叢集中有一個 分發器(排程器),我們稱之為Director,它處在多臺伺服器上面,分發器根據內部鎖定義的規則或排程方式從下面的伺服器群中選擇一個以此來響應客戶端傳送的請求。分攤到多個操作單元上進行執行,例如Web伺服器,FTP伺服器,企業關鍵任務伺服器等,從而共同完成工作任務;

一般高可用性叢集和負載均衡叢集會使用類似的技術,或同時具有高可用性和負載均衡的特點;

Linux虛擬伺服器(LVS)專案 在Linux作業系統上提供最常用的負載均衡軟體;


高可用性叢集(High Availability clusters)

一般是指當叢集中有某個節點失效的情況下,其上的任務會自動轉移到其他正常的節點上.還指可以將叢集中的某節點進行離線維護再上線,該過程並不影響整個叢集的執行;

高可用 以提升服務線上的能力的叢集;

高可用叢集主要是為了避免單點故障存在的,備機平時不參與工作。高可用叢集是可用性比較高,當我們某臺伺服器當機後不會造成我們的服務不可用。其工作模式則是將一個具有故障的服務轉交給一個正常工作的伺服器,從而達到服務不會中斷。一般來說我們叢集中工作在前端(分發器)的伺服器都會對我們的後端伺服器做一個健康檢查,如果發現我們伺服器當機就不會對其再做轉發;

衡量標準:可用性=線上時間(線上時間+故障處理時間);

高可用性叢集,是保證業務連續性的有效解決方案,一般有兩個或兩個以上的節點,且分為活動節點及備用節點。通常把正在執行業務的稱為活動節點,而作為活動節點的一個備份則稱為備份節點。當活動節點出現問題,導致正在執行的業務不能正常執行時,備用結點此時就會偵測到,並立即接續活動節點來執行業務,從而實現業務的不中斷或短暫中斷;

實現原理:利用叢集管理軟體,當主機故障時,備機能夠自動接管主機的工作,並及時切換過去,以實現對使用者的不間斷服務;


高效能叢集(High Performance clusters)

高效能著重用於處理一個海量任務;

高效能叢集是當某一個任務量非常大的時候,我們做一個叢集共同來完成這一任務,所以又被稱為 “並行處理叢集”;

充分利用叢集中每一臺計算機的資源,實現複雜運算的並行處理,通常用於科學計算領域,如化學分析等;

實現原理:並行處理叢集試講大人物劃分為小任務,分別進行處理的機制。一般這樣的叢集用來科學研究與大資料運算等方面的工作。現在比較火的Hadoop就是使用並行處理叢集;


高可用與負載均衡有什麼區別

HA 和 LB 確實不是一個概念,解決方案的側重點完全不同。

HA偏重於備用資源,切機時會有業務的斷開的,保證了資料的安全,但造成資源的浪費;

LB側重於資源的充分應用,沒有主備的概念,只有資源的最大限度的加權平均應用,基本不會業務的中斷;

從目的上來說:

HA的目的是不中斷服務,LB的目的是為了提高接入能力。雖然經常放一起用,但確實是兩個不同的領域;

從功能上來說:

HA在一條路不通的時候提供另一條路可走,而 LB 就類似於是春運時的多個視窗;

HA 和 LB是兩個概念的問題,一般來說沒有誰優誰劣的標準,只有在特定的環境下,誰更適合的問題。


向上擴充套件和向外擴充套件(單機和多機)

向上擴充套件:升級當臺伺服器的硬體;

缺點是在一定的範圍之內它的效能是上升的趨勢,但是超出範圍之後就是下降的趨勢,隨著CPU個數的增加資源競爭性越大;

向外擴充套件:增加新的伺服器;

優勢是增減伺服器很方便,而且沒有向上擴充套件隨著增加效能下降;


叢集管理工具

Swarm - Docker;

Fleet – Core OS;

Kubernetes –谷歌;

Mesos – Apache;


負載均衡

所謂負載均衡,就是把大訪問量分發給不同的伺服器,也就是分流請求。

實現負載均衡的六種方法

1,HTTP重定向協議實現負載均衡

HTTP 重定向就是應用層的請求轉發,使用者的請求其實已經到了HTTP重定向負載均衡伺服器,伺服器根據演算法要求使用者重定向,使用者收到重定向請求後,再次請求真正的叢集;

優點:簡單;

缺點:效能較差;

2,DNS域名解析負載均衡

DNS域名解析負載均衡就是在使用者請求DNS伺服器,獲取域名對應的IP地址時,DNS伺服器直接給出負載均衡後的伺服器IP;

優點:交給DNS,不用我們去維護負載均衡伺服器;

缺點:當一個應用伺服器掛了,不能及時通知DNS,而且DNS負載均衡的控制權在域名服務商那裡,網站無法做更多的改善和更強大的管理;

3,反向代理負載均衡

在使用者的請求到達方向代理伺服器時(已到達網站機房),由於反向代理伺服器根據演算法轉發到具體的伺服器,常用的Apache,Nginx都可以充當反向代理伺服器;

優點:部署簡單;

缺點:代理伺服器可能成為效能的瓶頸,特別是一次上傳大檔案;

LVS叢集中實現的三種IP負載均衡技術

4,IP負載均衡

LVS-NAT,在請求到達負載均衡器後,負載均衡器通過修改請求的目的IP地址,從而實現請求的轉發,做到負載均衡;

優點:效能更好;

缺點:負載均衡器的頻寬稱為瓶頸;

5,直接路由負載均衡

LVS-DR,資料鏈路層負載均衡,在請求到達負載均衡器後,負載均衡器通過修改請求的Mac地址,從而做到負載均衡,與IP負載均衡不一樣的是,當請求訪問完伺服器之後,直接返回客戶,而無需在經過負載均衡器;

6,IP隧道負載均衡(LVS-TUN)


負載均衡和反向代理有什麼區別

做了反向代理才能實現負載均衡,負載均衡是做反向代理的目的之一。


Nginx負載均衡分發請求的幾種方式

1,輪詢;

2,權重;

3,IP-hsah

#1,2,3是Nginx自帶方法;4,5是第三方方法

4,fair;

5,url_hash;




主從複製

主從複製的作用

主從是一種用於資料容錯和災備的高可用解決方案,而不是一種處理高併發壓力的解決方案(負載均衡是用來抗併發的)

1,主機負責查詢,從機負責增刪改;

2,可以在從機上執行備份,以避免備份期間影響主機的服務;

3,主從複製後,也可以在從機上查詢,以降低主機的訪問壓力。但是,只有更新不頻繁的資料或者對實時性要求不高的資料可以通過從伺服器查詢,實時性要求高的資料仍需在主伺服器查詢(因為主從複製有同步延遲,所以不能保證強資料一致性);


主從複製和讀寫分離的區別

主從複製是實現讀寫分離的技術之一,也是實現讀寫分離的前提條件。

做讀寫分離時最重要的就是確保 讀庫 寫庫 的資料統一,而主從複製是實現資料統一最簡單的方法(並不能夠保證強資料的一致性);

讀寫分離,顧名思義,就是一個表只負責向前臺頁面展示資料,而後臺管理人員對錶的增刪改在另一個表中,把兩個表分開,就是讀寫分離;

主從複製則是一個表資料 增刪改 之後會及時更新到另一個表中,保證兩個表的資料一致;


實現主從複製的方法

MySQL主從複製;

MongoDB主從複製;


如何減少主從複製的同步延遲

MySQL主從資料庫同步延遲問題;

MongoDB主從資料庫同步延遲問題;


主從複製側重點不同的幾種型別

雙機熱備=主機+備機;

主要應用執行在主機,備機即備用機器。備機不工作,主機出現故障時備機接管主機的所有工作;

雙機互備=主機(備機) + 備機(主機);

互為主備,部分應用執行於主機,部分應用執行於備機,主機備機同時工作;

雙機雙工=主機+主機;

兩臺主機同時執行應用,主機備機同時工作;



分散式

分散式與叢集有什麼區別

廣義上的分散式是指,將不同的服務分佈在不同的伺服器上;

叢集是指,將幾臺伺服器集中在一起,實現同一業務;

分散式中的每一個節點都可以做叢集,而叢集並不一定是分散式的;






Web負載均衡、叢集、高可用解決方案

元件

Apache,Apache軟體基金會下的一個專案,Apache HTTP Server ;

Nginx,高效能HTTP和反向代理伺服器,Nginx HTTP Server;

LVS,Linux虛擬伺服器,是一個虛擬的伺服器叢集系統;

HAProxy,可提供高可用性、負載均衡以及基於TCP和HTTP應用的代理,支援虛擬主機,它是免費、快速並且可靠的一種解決方案。HAProxy特別適用於那些負載特大的web站點,這些站點通常有需要會話保持或七層處理。HAProxy執行中當前的硬體上,完全可以支援數以萬計的併發連線,並且它的執行模式使得它可以很簡單安全的整合進你當前的架構中,同時可以保護你的Web伺服器不被暴露到網路上;

Keepalived,這裡說的keepalived不是Apache或者Tomcat等某個元件上的屬性欄位,它也是一個元件,可以實現Web伺服器的高可用。它可以檢測Web伺服器的工作狀態,如果該伺服器出現故障被檢測到,將其剔除伺服器群中,直至正常工作後,Keepalived會自動檢測到並加入到伺服器群裡面。實現主備伺服器發生故障時IP瞬時無縫交接。它是LVS叢集節點將抗檢測的一個使用者空間守護程式,也是LVS的引導故障轉移模組(director failover)。Keepalived守護程式可以檢查LVS池的狀態。如果LVS伺服器池當中的某一個伺服器當機了,Keepalived會通過一個setsockopt呼叫通知核心將這個節點從LVS拓撲圖中移除;

Memcached,它是一個高效能分散式記憶體物件快取系統,用於對業務查詢資料快取,減輕資料庫的負載,在memcached裡面快取的資料必須序列化;

Teeracotta,是一款由美國Teeracotta公司開發的著名開源Java叢集平臺,支援資料的持久化、session的複製以及高可用;


常用Web叢集

Tomcat

Apache Tomcat是Apache基金會下開發的一個Servlet容器,提供了作為web伺服器的一些特殊功能,如Tomcat管理和控制平臺、安全域管理和Tomcat閥。

Servlet(Server Applet),全稱Java Servlet,是用Java編寫的伺服器端程式。其功能在於互動地瀏覽和修改資料,生成動態web內容。

Tomcat更多用來做一個應用容器,管理整個Servlet的生命週期,主要用來跑Java web App。因為Java後臺程式無法執行在Apache和Nginx上,他兩不是Servlet容器。

與Apache HTTP Server相比,Tomcat能夠動態的生成資源並返回到客戶端。Apache 和 Nginx都能夠將某一個文字檔案的內容通過HTTP協議返回到客戶端,但這個文字檔案的內容是固定的。也就是說,無論何時、任何人訪問它得到的內容都是完全相同的,這樣的資源我們稱為靜態資源。動態資源與之相反,在不同的時間、不同的客戶端訪問得到的內容是不相同的。

Apache 和 Nginx 本身不支援生成動態頁面,但它們可以通過其他模組來支援(如shell、Python、PHP程式來生成動態內容)。

雖然Tomcat也可以認為是HTTP伺服器,但通常它仍然會和Nginx配合在一起使用:

動靜態資源分離,運用Nginx的反向代理功能分發請求,所有動態資源的請求交個Tomcat,而靜態資源的請求則直接由Nginx返回到瀏覽器,這樣能大大減輕Tomcat的壓力;

負載均衡,當也無壓力增大時,可能一個Tomcat的例項不足以處理,那麼這時可以啟動多個Tomcat例項進行水平擴充套件,而Nginx的負載均衡功能可以把請求通過演算法分發到各個不同的例項進行處理;

Tomcat叢集方案

Apache + Tomcat;

Nginx + Tomcat;

Lvs + Nginx + Tomcat;

# lvs負責叢集排程,Nginx負責靜態檔案處理,Tomcat負責動態檔案處理;


Session複製

在訪問系統會話的過程中,使用者登入系統後,不管訪問系統的任何資源地址都不需要重複登入,這裡面的 Servlet容易儲存了該使用者的會話(session)。如果兩個Tomcat(A、B)提供叢集服務時,使用者在 A上登入,接下來的請求Web伺服器根據策略分發到 B,因為B沒有儲存使用者的會話(session)資訊,不知道其登入,會跳轉到登入介面。這時候我們需要讓 B也儲存有 A的會話,我們使用Tomcat的session複製實現或者通過其他手段讓session共享。

如果不採用 粘性session,那麼我們可以採用Tomcat的session複製使所有節點Tomcat的會話相同,Tomcat使用組播技術,只要叢集中一個Tomcat節點的session發生改變,會廣播通知所有的Tomcat節點發生改變。


高可用(HA)和session共享

使用 Lvs + Keepalived 實現叢集高可用,達到更健壯的LB

我們可以做前端使用 Lvs 來做負載均衡,根據Lvs的8種排程演算法,分發請求到對應的Web伺服器叢集上。Lvs做雙機熱備,通過Keepalived模組能夠達到故障自動轉移到備份伺服器,不間斷提供服務。

4809537-de1457ab2b4f2ba2.png

Web端使用的負載均衡:

HAProxy + Keepalived + Nginx;

資料庫叢集(如MySQL):

Lvs + Keepalived + MySQL;

因為HAProxy和Nginx一樣是工作在網路7層之上,並且HAProxy彌補了Nginx的一些缺點(如session的保持,cookie的引導),且它本身是個負責均衡軟體,處理負載均衡上面必然優於Nginx。

Lvs比較笨重,對於比較龐大的網路應用,實施比較複雜,雖然它執行在網路4層之上,僅做分發沒有流量產生,但是它不能做正則處理也不能做動靜分離,所以一般用 Lvs + Keepalived或heatbeat做資料庫層的負載均衡。

使用 terracotta 或 memcached 使session共享

terracotta 是 jvm 級別的 session共享

它基本原理是對於叢集間共享的資料,當在一個節點發生變化的時候,Terracotta只把變化的部分傳送給Terracotta伺服器,然後伺服器把它轉發給真正需要這個資料的節點,並且共享的資料物件不需要序列化。

通過 memcached 實現記憶體級 session共享

通過 memcached-session-manager(msm)外掛,通過Tomcat上一定的配置,即可實現把session儲存到memcached伺服器上。在memcached記憶體中共享的物件需要序列化。

4809537-1341a08b14575628.png

其他方案

通過cookie儲存使用者資訊(一般是登入資訊),每一個請求到達Web應用的時候,Web應用從cookie中取出資料進行處理(這裡cookie肯定要加密);

另一種是把使用者資訊的關鍵屬性儲存到資料庫,這樣就不需要session了。請求過來從資料庫查詢關鍵屬性資料,做相應處理。缺點是加大了資料庫的負載,是資料庫成為叢集的瓶頸。

相關文章