計算機集群
計算機集群簡稱集群(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)
高性能著重用于處理一個海量任務;
高性能集群是當某一個任務量非常大的時候,我們做一個集群共同來完成這一任務,所以又被稱為 “并行處理集群”;
充分利用集群中每一臺計算機的資源,實現復雜運算的并行處理,通常用于科學計算領域,如化學分析等;
實現原理:并行處理集群試講大人物劃分為小任務,分別進行處理的機制。一般這樣的集群用來科學研究與大數據運算等方面的工作?,F在比較火的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模塊能夠達到故障自動轉移到備份服務器,不間斷提供服務。
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內存中共享的對象需要序列化。
其他方案
通過cookie保存用戶信息(一般是登錄信息),每一個請求到達Web應用的時候,Web應用從cookie中取出數據進行處理(這里cookie肯定要加密);
另一種是把用戶信息的關鍵屬性保存到數據庫,這樣就不需要session了。請求過來從數據庫查詢關鍵屬性數據,做相應處理。缺點是加大了數據庫的負載,是數據庫成為集群的瓶頸。