天天看點

淺析分布式、叢集及高并發分布式叢集什麼是雲計算平台?高并發

      分布式是指将一個業務拆分不同的子業務,分布在不同的機器上執行,叢集是指多台伺服器集中在一起,實作同一業務,可以視為一台計算機,一個雲計算平台,就是通過一套軟體系統把分布式部署的資源集中排程使用。要應對大并發,要實作高可用,既需要分布式,也離不開叢集。

分布式

   

淺析分布式、叢集及高并發分布式叢集什麼是雲計算平台?高并發

  将一個大的系統劃分為多個業務子產品,業務子產品分别部署到不同的機器上,各個業務子產品之間通過接口進行資料互動。差別分布式的方式是根據不同機器不同業務。

  上面:service A、B、C、D 分别是業務元件,通過API Geteway進行業務通路。

  注:分布式需要做好事務管理。

  分布式是否屬于微服務?

  答案是肯定的。微服務的意思也就是将子產品拆分成一個獨立的服務單元通過接口來實作資料的互動。

  微服務架構

  微服務的設計是為了不因為某個子產品的更新和BUG影響現有的系統業務。微服務與分布式的細微差别是,微服務的應用不一定是分散在多個伺服器上,他也可以是同一個伺服器。 分布式和微服的架構很相似,隻是部署的方式不一樣而已。

  分布式服務架構與微服務架構概念的差別與聯系是怎樣的

  分布式:分散壓力。

  微服務:分散能力。

  當下了解

  分布式:不同子產品部署在不同伺服器上;

  作用:分布式解決網站高并發帶來問題;

  叢集:相同的服務;

  多台伺服器部署相同應用構成一個叢集;

  作用:通過負載均衡裝置共同對外提供服務;

  SOA[組裝服務/ESB企業服務總線];

  業務系統分解為多個元件,讓每個元件都獨立提供離散,自治,可複用的服務能力;

  通過服務的組合和編排來實作上層的業務流程;

  作用:簡化維護,降低整體風險,伸縮靈活;

  微服務[找到服務/微服務網關open API];

  架構設計概念,各服務間隔離(分布式也是隔離),自治(分布式依賴整體組合)其它特性(單一職責,邊界,異步通信,獨立部署)是分布式概念的跟嚴格執行;

  SOA到微服務架構的演進過程;

  作用:各服務可獨立應用,組合服務也可系統應用

叢集

       叢集:是指多台伺服器集中在一起,實作同一業務,可以視為一台計算機。多台伺服器組成的一組計算機,作為一個整體存在,向使用者提供一組網絡資源,這些單個的伺服器就是叢集的節點。

       分布式中的每一個節點,都可以做叢集。 而叢集并不一定就是分布式的。上面的分布式開發案例中,每一個功能(A-D功能)都可以建立一個叢集,某一個功能的伺服器垮了,其它的伺服器可以頂上來。

       叢集是個實體形态,分布式是個工作方式。分布式是以縮短單個任務的執行時間來提升效率的;叢集則是通過提高機關時間内執行的任務數來提升效率。比如:如果一個任務由10個子任務組成,每個子任務單獨執行需1小時,則在一台伺服器上執行該任務需10小時。采用分布式方案,提供10台伺服器,每台伺服器隻負責處理一個子任務,不考慮子任務間的依賴關系,執行完這個任務隻需一個小時。(這種工作模式的一個典型代表就是Hadoop的Map/Reduce分布式計算模型)而采用叢集方案,同樣提供10台伺服器,每台伺服器都能獨立處理這個任務。假設有10個任務同時到達,10個伺服器将同時工作,1小時後,10個任務同時完成,這樣,整身來看,還是1小時内完成一個任務!

兩個特點

       可擴充性:叢集中的服務節點,可以動态的添加機器,進而增加叢集的處理能力。

       高可用性:如果叢集某個節點發生故障,這台節點上面運作的服務,可以被其他服務節點接管,進而增強叢集的高可用性。

叢集分類

      常用的叢集分類

     1.高可用叢集(High Availability Cluster)

        高可用叢集,普通兩節點雙機熱備,多節點HA叢集。

     2.負載均衡叢集(Load Balance Cluster)

       常用的有 Nginx 把請求分發給後端的不同web伺服器,還有就是資料庫叢集,負載均衡就是,為了保證伺服器的高可用,高并發。

     3.科學計算叢集(High Performance Computing Cluster)

       簡稱HPC叢集。這類叢集緻力于提供單個計算機所不能提供的強大的計算能力。

兩大能力

       負載均衡:負載均衡能把任務比較均衡地分布到叢集環境下的計算和網絡資源。

      叢集容錯:當我們的系統中用到叢集環境,因為各種原因在叢集調用失敗時,叢集容錯起到關鍵性的作用。

簡單總結

       分布式,從狹義上了解,也與叢集差不多,但是它的組織比較松散,不像叢集,有一定組織性,一台伺服器宕了,其他的伺服器可以頂上來。

分布式的每一個節點,都完成不同的業務,一個節點宕了,這個業務就不可通路了。

        1. 分布式是指将一個業務拆分不同的子業務,分布在不同的機器上執行。

        2. 叢集是指多台伺服器集中在一起,實作同一業務,可以視為一台計算機。

分布式的每一個節點,都可以用來做叢集。而叢集不一定就是分布式了。

什麼是雲計算平台?

        一個雲計算平台,就是通過一套軟體系統把分布式部署的資源集中排程使用。要應對大并發,要實作高可用,既需要分布式,也離不開叢集。比如負載均衡,如果隻是一台伺服器,這台當機了就完蛋了。分布式的難點,就是很多機器做存在依賴關系的不同活兒,這些活兒需要的資源、時間差別可能很大,某些機器還可能罷工,要怎麼樣才能協調好,做到效率最高,消耗最少,不出錯。

分布式的應用場景?

       平時接觸到的分布式系統有很多種,比如分布式檔案系統,分布式資料庫,分布式WebService,分布式計算等等,面向的情景不同,但分布式的思路是否是一樣的呢?

1.簡單的例子

       假設我們有一台伺服器,它可以承擔1百萬/秒的請求,這個請求可以的是通過http通路網頁,通過tcp下載下傳檔案,jdbc執行sql,RPC調用接口…,現在我們有一條資料的請求是2百萬/秒,很顯然伺服器hold不住了,會各種拒絕通路,甚至崩潰,當機,怎麼辦呢。

       一台機器解決不了的問題,那就兩台。是以我們加一台機器,每台承擔1百萬。如果請求繼續增加呢,兩台解決不了的問題,那就三台呗。這種方式我們稱之為水準擴充。如何實作請求的平均配置設定便是負載均衡了。

       另一個栗子,我們現在有兩個資料請求,資料1九十萬,資料2八十萬,上面那台機器也hold不住,我們加一台機器來負載均衡一下,每台機器處理45萬資料1和40萬資料2,但是平分太麻煩,不如一台處理資料1,一台處理資料2,同樣能解決問題,這種方式我們稱之為垂直拆分。

       水準擴充和垂直拆分是分布式架構的兩種思路,但并不是一個二選一的問題,更多的是兼并合用。下面介紹一個實際的場景。這也是許多網際網路的公司架構思路。

2.實際的例子

       我此時所在的公司的計算機系統很龐大,自然是一個整的分布式系統,為了友善組織管理,公司将整個技術部按業務和平台拆分為部門,訂單的,會員的,商家的等等,每個部門有自己的web伺服器叢集,資料庫伺服器叢集,通過同一個網站通路的連結可能來自于不同的伺服器和資料庫,對網站及底層對資料庫的通路被配置設定到了不同的伺服器叢集,這個便是典型的按業務做的垂直拆分,每個部門的伺服器在hold不住時,會有彈性的擴充,這便是水準擴充。

       在資料庫層,有些表非常大,資料量在億級,如果隻是純粹的水準的擴充并不一定最好,如果對表進行拆分,比如可以按使用者id進行水準拆表,通過對id取模的方式,将使用者劃分到多張表中,同時這些表也可以處在不同的伺服器。按業務的垂直拆庫和按使用者水準拆表是分布式資料庫中通用的解決方案。

3.分布式一緻性

       分布式系統中,解決了負載均衡的問題後,另外一個問題就是資料的一緻性了,這個就需要通過同步來保障。根據不同的場景和需求,同步的方式也是有選擇的。在分布式檔案系統中,比如商品頁面的圖檔,如果進行了修改,同步要求并不高,就算有數秒甚至數分鐘的延遲都是可以接受的,因為一般不會産生損失性的影響,是以可以簡單的通過檔案修改的時間戳,隔一定時間掃描同步一次,可以犧牲一緻性來提高效率。

但銀行中的分布式資料庫就不一樣了,一丁點不同步就是無法接受的,甚至可以通過加鎖等犧牲性能的方式來保障完全的一緻。

在一緻性算法中paxos算法是公認的最好的算法,Chubby、ZooKeeper 中Paxos是它保證一緻性的核心。這個算法比較難懂,我目前也沒弄懂,這裡就不深入了。

高并發

       高并發(High Concurrency)是網際網路分布式系統架構設計中必須考慮的因素之一,它通常是指,通過設計保證系統能夠同時并行處理很多請求。我們講的并發、高并發,通常是指并發通路。也就是在某個時間點,有多少個通路者同時到來,如果一個系統每天都有千萬以上的通路量,就是一個高并發的系統。

       提高系統并發能力的方式,方法論上主要有兩種:垂直擴充(Scale Up)與水準擴充(Scale Out)。前者垂直擴充可以通過提升單機硬體性能,或者提升單機架構性能,來提高并發性,但單機性能總是有極限的,網際網路分布式架構設計高并發終極解決方案還是後者:水準擴充。

       提升單機處理能力。垂直擴充的方式又有兩種:

(1)增強單機硬體性能,例如:增加CPU核數如32核,更新更好的網卡如萬兆,更新更好的硬碟如SSD,擴充硬碟容量如2T,擴充系統記憶體如128G;

(2)提升單機架構性能,例如:使用Cache來減少IO次數,使用異步來增加單服務吞吐量,使用無鎖資料結構來減少響應時間;

網際網路分層架構中,各層次水準擴充的實踐又有所不同:

(1)反向代理層可以通過“DNS輪詢”的方式來進行水準擴充;

(2)站點層可以通過nginx來進行水準擴充;

(3)服務層可以通過服務連接配接池來進行水準擴充;

(4)資料庫可以按照資料範圍,或者資料哈希的方式來進行水準擴充;

各層實施水準擴充後,能夠通過增加伺服器數量的方式來提升系統的性能,做到理論上的性能無限。

那怎麼解決高并發帶來的性能和體驗問題呢?

1、優化代碼,優化業務邏輯和優化SQL

2、叢集與分布式

      叢集就是每台電腦上的伺服器都具有相同的功能,處理請求時調用那台伺服器都可以,主要為了分流(通俗的講就是多台tomcat放相同的代碼)。分布式開發是将不同的業務放到不同的伺服器中,處理請求需要多台伺服器的幫助,這樣大大提高了一個請求的處理速度,并且分布式和叢集可以同時使用。

       使用叢集有兩個方法:一是在靜态資源叢集。二是應用程式叢集。靜态資源叢集方法比較簡單華。使用程式叢集在處理過程中最重要的問題就是Session 同步問題。使用Session 同步有兩種處理方法:一是在Session 發生變化後自動同步到其他伺服器上,第二種就是使用程式管理Session。并且所有使用叢集的伺服器都使用同一個Session,使用預設的Tomcat也是第一種方式,簡單配置就可以實作了,使用第二種方式就是專門的伺服器安裝Mencached等高效的緩存程式來管理session。

3、什麼是資料庫緩存,為什麼是要使用緩存?

       大多資料庫一些常見的關系型資料庫的資料都存儲在電腦的磁盤中,使用在高并發的情況下,業務應用對資料庫産生的增加删除修改查詢的操作會造成和查詢的壓力等,也會使資料庫和伺服器造成巨大的壓力,為了解決資料庫以上問題,使用緩存資料是不可缺少的。

       使用緩存資料就是為了資料庫伺服器端甚至不通路資料庫伺服器進行資料的增加删除修改查詢操作,在高并發下,也能最大程度的降低對資料庫伺服器的通路壓力也同時解決資料庫伺服器的壓力。

4、提高應用資料響應速度

        能使用緩存的都使用緩存,比如使用者,資訊等緩存,多使用點記憶體來做緩存,這樣就可以大量的減少與資料庫的互動,大大提高了資料庫的性能。

1.資料庫SQL語句優化和表結構優化等。SQL語句優化,文法優化和處理邏輯優化。

2.使用常用的架構Redis等。最關鍵的是什麼時候建立緩存,以及什麼時候失效機制。

3.緩存,使用程式直接儲存到記憶體中。主要使用Map集合等。

4.分布式資料庫将不同的表存放到不同的資料庫中,然後再放到不同的伺服器中。事務處理,多表查詢等。

5.批量讀取和延遲修改,高并發情況可以将多個查詢請求合并到一個。高并發且頻繁修改的可以暫存緩存中。

6.NoSql和Hadoop,NoSql,not only SQL,比較靈活高效。Hadoop,将一個表中的資料分層多塊,儲存到多個節點。每一塊資料都有多個節點儲存。叢集可以并行處理相同的資料,還可以保證資料的完整性。

7.讀寫分離,資料庫伺服器配置多個,配置主從資料庫。寫用主資料庫,讀用從資料庫。

高并發執行個體:

在會計彙有個投票調查項目,是和财政部合作的,會計人員進行填寫完調查結果後,将獲得5個學分。通過短信向全國500萬會計人員發送短信,這時高峰期會有10萬多使用者同時線上答題。

解決辦法是:

1、使用了LVS + Nginx四台機器進行負載均衡

2、用了Spring + Redis實作4台Tomcat的Session共享

3、答題頁面靜态化,

4、使用者送出答卷後臨時存放在Redis中,直接傳回結果。

5、定時器每隔一段時間将Redis資料儲存到MySQL 

繼續閱讀