手把手教你用nginx開發自己的伺服器------利用nginx實現負載均衡(一)------負載均衡的整體架構
之前我們講的是用nginx做一個簡單的helloworld功能,幫助大家瞭解一下nginx中的基本框架,今天我們就來學習下如何用nginx實現一個負載均衡伺服器。
為什麼要先講nginx的負載均衡模組呢?主要是nginx現在在各個大廠的應用場景主要就是做7層負載均衡和一些CDN能力了。我們還是先不急講如何開發,先來聊聊什麼是負載均衡,大廠都是怎麼做負載均衡的。
首先什麼是負載均衡呢?很簡單,就是伺服器(後面我們稱之為server_proxy)收到client的訊息請求後,並不做處理,而是根據一定的策略將其轉發給負載列表內的一臺子伺服器,由子伺服器將這個請求處理完後再將結果返回給client。這個過程server_proxy扮演的角色就叫負載均衡器(LB,load balancer),這個功能也叫反向代理。
為什麼需要負載均衡呢?由於當client併發數量到達一定程度後,單個伺服器是沒有辦法支撐這麼多業務的,那麼我們首先想到的辦法是增加伺服器數量,那麼這一堆伺服器我們就叫他叢集,但伺服器多了,總不能每個伺服器都給個ip,然後申請個域名讓使用者去訪問吧,這個時候就衍生出了負載均衡技術,給LB一個ip,然後DNS伺服器記錄的域名對應ip就是LB的ip了,可以看到,負載均衡就是做了一道轉發嘛,nginx的負載均衡能力怎麼樣呢?出於epoll的高效,可以做到單機上萬QPS。
問題又來了,單機上萬就夠了嗎?首先這個單機百萬就是個理想數字,實際上LB還要隨時處理負載的叢集下的各個子伺服器的心跳包,還要和子伺服器各種打交道。實際處理client的QPS達到理想狀態一半就很不錯了。想想雙11的時候,可不止幾十萬人在等著12點那一波吧。
怎麼解決,我們首先想到的就是多個叢集,但是多個叢集又怎麼負載均衡呢?這就需要轉發能力更強的軟體了。這裡給大家說一下LVS,LVS的出現比nginx還要早的多,但是LVS是做的4層負載均衡(所謂四層就是工作在OSI七層模型的第四層,傳輸層),現在用的比較多的就是LVS-tunnel或者LVS-DR模式,關於LVS這裡就不展開講了,大致說下,LVS-tunnel是在收到的ip資料包上再包一層ip資料包,目的ip變成根據負載策略選取的子伺服器ip,LVS-DR則是修改資料包中的目的MAC地址為根據負載策略選取的子伺服器的MAC地址。
其實這樣還是無法滿足所有需求,還有一種負載均衡方式,DNS負載均衡,DNS負載均衡就更簡單了,當你在瀏覽器輸入域名後,需要去公司DNS伺服器下找對應的ip,一般大廠的DNS伺服器下,一個域名都掛著幾個公網ip,在DNS伺服器這裡根據你的地理位置或者乾脆就隨機給你個ip,也做到了一定的負載均衡,其實這是最早的負載均衡策略,由於瀏覽器會快取一段時間的DNS訊息,所以這種策略作為單個的負載均衡策略是很不靠譜的。
我們來看一下,一般一個大廠的整個伺服器架構是怎麼樣的
Nginx的角色就是7層負載均衡,所謂7層負載均衡,就是根據應用層的資料來做負載均衡,也就是根據業務做請求分發了,由於https的普及和規範化,Nginx還承擔著ssl解除安裝的責任,同時,nginx也是一個良好的CDN建設工具,所謂CDN(內容分發網路),就是,在一些離使用者地理位置比較近的地方的伺服器快取一些靜態訊息。這樣達到的效果是,在使用者載入瀏覽器頁面時。首先先顯示一些靜態的頁面,然後再顯示出一些ajax資料等等,提升使用者的體驗。
下一篇文章我們就正式開始學習如何用Nginx搭建一個負載均衡器。