1. 程式人生 > >一、常見網際網路架構叢集演化圖

一、常見網際網路架構叢集演化圖

在早期部署專案的時候採取的是單機應用,專案部署到伺服器上,使用者是直接訪問伺服器,並且這臺伺服器是臺外網(即廣域網)的伺服器

漸漸的隨著使用者量的增加,

問題:一臺伺服器已經不夠用了,

解決方式:於是我們將準備兩臺伺服器搭成叢集

搭完叢集之後,假如原來十個使用者訪問一臺伺服器,現在平均開,五個人訪問上面的伺服器,五個人訪問另一個伺服器,這樣使用者的體驗就會稍微好一點,這樣做還有個好處是假如其中一臺伺服器掛了,是不影響使用者訪問的,因為使用者可以訪問另一臺好的伺服器,這兩臺伺服器還同時在外網(廣域網)中。

問題:這樣做有一個侷限性,就是同時存在兩個伺服器,就會同時存在兩個外網IP;那麼在進行對映的時候使用者是需要記住兩個IP

地址的,IP地址後來是對映到域名上,如www.xxxx.com,而真正的ip地址是我們的四位有效數字。那麼這樣的話使用者的體驗也不太好。

解決方式:於是我們增加了一個代理伺服器,使用者不需要記住兩個伺服器的IP或域名了,只要記住一臺(代理伺服器)IP就可以了。由代理伺服器來負責分發使用者是訪問伺服器A還是訪問伺服器B;那麼使用者具體是訪問伺服器A還是訪問伺服器B,我們通過是實現的方式nginx,通過nginx裡面的權重設定來決定的。

那麼既然代理伺服器放在外網,於是我們把伺服器A和伺服器B等均放在內網,放在內網的目的是為了網路安全考慮,放在外網是可以被攻擊的,而這裡就變成內網域名了,外網是訪問不到的。這樣的話,使用者是不能直接訪問伺服器的,必須藉助代理伺服器來實現;

問題:這種方式還有個侷限性,就是資料的儲存問題,原來的資料都是存放到磁碟檔案當中的,這樣有個問題就是資料量越來越大,資料盤就會越來越大,還有個問題就是萬一哪天磁碟損壞了,那麼資料就沒了。那麼這樣的話資料是不安全的。

解決方式:於是這裡我們使用了JAVA的MVC設計思想,我們將資料進行了抽取,伺服器A和伺服器B僅負責動態代理的分發,而不負責資料的儲存,具體的資料放到資料伺服器當中,這裡的資料庫指的是關係型資料庫

關係型資料庫具有的四大特性,原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、永續性(Durability)

原子性:多個事情組成一個單元,要麼同時成功或失敗,不能只執行其中一個
一致性:

事務處理要將資料庫從一種狀態轉變為另一種狀態。一旦提交了修改資料,那麼其它人讀取這個資料,也是被修改後的資料
隔離性:在事務處理提交之前,事務處理的效果不能由系統中其它事務處理。多個使用者,不能同時讀寫同一個資料,應該有先後順序,在資料庫中是一個一 個事件地執行,如果事件的條件不滿足,後續事件就回滾
永續性:事件一旦提交成功,資料就發生了變化

這樣有出現了一個問題,於是我們搭建了資料庫的叢集,也就是下面這種模式

問題:使用者通過代理伺服器分發到應用伺服器,而應用伺服器負責從資料庫伺服器進行資料的讀取和寫入;那麼此時資料庫伺服器A和資料伺服器B是兩臺伺服器,假如資料通過應用伺服器A存放到資料服務A,那麼這是寫入,但是讀取資料的時候,可能使用者被分發到應用伺服器B了,但是資料是在資料伺服器B,那麼就要保證資料的一致性了,我們常用的網際網路應用資料庫是MySQl,這時我們就要保證Mysql資料叢集伺服器的資料一致性了。這裡會用到多執行緒裡面的一個是流執行緒一個是寫執行緒。這兩個執行緒就解決了資料的一致性。

解決方式:這裡是關係型資料庫,是遵循原子性、一致性、隔離性、永續性四大特性的;這時候是業務層分離的,即主伺服器負責寫,從伺服器負責讀,這就是資料的一致性和主從庫讀寫分離;

那麼這時候,如果碰到例如雙十一這樣的大型網路促銷活動,使用者訪問量猛增,這樣資料伺服器A和資料伺服器B就都滿足不了使用者的訪問了,因為這個時候使用者的併發量是特別特別大的;這時候我們選擇將資料放到快取檔案伺服器;而不是直接請求資料伺服器,因為關係型資料庫伺服器總會用延遲的磁碟檔案相當於我們的記憶體,讀記憶體比讀伺服器要快很多很多,因為CPU是直接支援它的,那麼這樣的話就取決於硬體配置了,硬體配置越高可接受的請求次數就越大,支援的負載量就會越大

解決方式:那麼這樣的話,有一些資料就不存到資料庫了,而是直接存到快取檔案;但是快取資料是有有效期的,如果到期了就將資料放到資料庫裡面。

這樣做的目的是使用者訪問讀取資料時不從資料庫伺服器讀取了,而是直接從快取伺服器讀取;解決了訪問速度的問題;

哪些資料可以放到快取中:一種是讀取次數比較頻繁的資料;第二種是安全性不高的資料,如使用者購物車的資料,

當前企業常用的叢集方式;

即使用者通過(外網)代理伺服器去訪問(內網)應用伺服器,這個內網允許哪個外網網段進來取決於防火牆,而這個防火牆只允許代理伺服器的外網IP進來;那麼這樣的話應用伺服器就安全了;

前面兩臺代理伺服器並非叢集,一臺是正在使用的負載均衡代理伺服器,另一臺是備用的負載均衡代理伺服器,如果某天正在使用的負載均衡代理伺服器突然掛了,那麼備用的負載均衡代理伺服器則自動頂上來作為代理伺服器。主要使用的是ELB技術。

真正的叢集是防火牆後面的應用伺服器叢集和資料庫伺服器叢集。

負載:是指將請求負載到不同的伺服器;

均衡:指的是平分伺服器的請求次數。

熱備:指的是它可以自動的根據定時任務或者數量容量大小去備份資料庫,而不需停止資料庫。

如果資料庫正在寫入,資料熱備伺服器在一直備份,沒有寫完,那麼這個程序是一直開著的,發現IO流程序不起動,說明這個地方沒操作;

圖片快取伺服器:最常見的就是電商網站,因為上面會有大量的圖片,一般商品頁的左邊會有一個放大鏡,也就是一張小圖對應著一張大圖,一般我們為了載入速度,會將這個圖片放到快取圖片伺服器。

總結在叢集演進過程中遇到的問題:

1、為了應對使用者訪問量的增加,我們使用了應用伺服器叢集的方式。

2、為了解決使用者需要記住多個應用伺服器IP和應用伺服器的安全問題,我們使用了將應用伺服器放在內網,使用負載均衡代理伺服器進行分發使用者請求的方式;

3、為了應對資料量越來越大的問題,我們採用了資料庫專用伺服器,而應用伺服器僅負責接受動態代理的分發,而不負責存在資料,具體的資料放到(關係型)資料庫伺服器當中。

4、隨著使用者訪問量和資料讀寫頻率的增加,我們使用了(關係型)資料庫叢集以及讀寫分離的方式。

5、為了應對高併發量的問題,我們採用了資料庫快取伺服器和圖片檔案快取伺服器的方式,將使用較為高頻的資料和檔案放到快取伺服器。

6、為了應為資料庫可能因意外丟失的問題,採用資料熱備伺服器對資料伺服器的資料進行備份。

7、為了解決負載均衡代理伺服器可能出現突發故障的問題,採用備用負載均衡伺服器在負載均衡伺服器出現故障時自動切換的方式解決。