Laravel+Nginx輕鬆實現讀寫分離、負載均衡,網站併發能力提升N倍

前言:

隨着互聯網應用的廣泛普及,海量數據的存儲和訪問成爲了系統設計的瓶頸問題。對於一個大型的互聯網應用,每天百萬級甚至上億的PV無疑對數據庫造成了相當高的負載。對於系統的穩定性和擴展性造成了極大的問題。

爲此,我們需要使用負載均衡、讀寫分離的方式,提升網站的系統性能和訪問速度。

硬件設備配置:使用5臺服務器,3臺做負載,1臺做數據備份,1臺做應急處理服務器(內存:8G,硬盤容量:40G,CPU:4核)。

一,Laravel讀寫分離配置(Laravel自行下載安裝):

 

Laravel 6 讀寫分離配置比較簡單,只需修改 config/database.php完成對數據庫的配置就完成了讀寫分離,下面以 MySQL 數據庫爲例,內容如下:

'mysql' => [ 
    'read' => [ 
        'host' => [ '192.168.72.100', '196.168.72.101', '196.168.72.102', ], 
    ], 
    'write' => [ 
        'host' => [ '196.168.72.99', ], 
    ], 
    'sticky'   => true, 
    'driver'   => 'mysql',
    'database' => 'database', 
    'username' => 'root', 
    'password' => '', 
    'charset'  => 'utf8mb4',     
    'collation' => 'utf8mb4_unicode_ci', 
    'prefix'   => '', 
],

設置完畢之後,Laravel6 默認將select 的語句讓read 指定的數據庫執行,insert/update/delete 則交給 write 指定的數據庫,達到讀寫分離的作用。

二,nginx負載均衡配置(Nginx自行下載安裝):

1、內置負載策略

  • 輪循(默認):Nginx根據請求次數,將每個請求均勻分配到每臺服務器上。

  • 最少連接:將請求分配給連接數最少的服務器。Nginx會統計哪些服務器的連接數最少。

  • IP Hash:綁定處理請求的服務器。第一次請求時,根據該客戶端的IP算出一個HASH值,將請求分配到集羣中的某一臺服務器上。後面該客戶端的所有請求,都將通過HASH算法,找到之前處理這臺客戶端請求的服務器,然後將請求交給它來處理。

2、詳細配置方法


 

 
upstream server1 {
        server 192.168.72.100:80 weight=3 max_fails=3 fail_timeout=15 max_conns=1000;
        server 192.168.72.101:80 weight=2 max_fails=3 fail_timeout=15;
        server 192.168.72.102:80 weight=1 max_fails=3 fail_timeout=15 ;
        server 192.168.72.103:80 backup;
        server 192.168.72.104:80 down;
}

 server {
        listen       80;
        server_name  www.xxx.com;
        #charset koi8-r;
        access_log  logs/host.access.log  main;
        location / {
            proxy_pass   http://server1;
            index  index.html index.htm index.php;
        }
}

通過以上配置,便可以實現,在訪問www.xxx.com這個網站時,由於配置了proxy_pass地址,所有請求都會先通過nginx反向代理服務器,在服務器將請求轉發給目的主機時,讀取upstream爲server1的地址,讀取分發策略,配置權重爲3,所以nginx會將大部分請求發送給100服務器上,較少部分給102服務器來實現有條件的負載均衡。

backup 參數說明:

1)、down:表示單前的server暫時不參與負載

2)、weight:默認爲1,weight越大,負載的權重就越大。

3)、max_fails:允許請求失敗的次數默認爲1.當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤

4)、fail_timeout:max_fails 次失敗後,暫停的時間。

5)、backup:其它所有的非backup機器down或者忙的時候,請求backup機器。所以這臺機器壓力會最輕。

6)、max_conns:最大鏈接數,超過以後就不會發生請求過來。

通過以上配置完成了Laravel中的讀寫分離和Nginx的負載均衡,重點說明完整項目還需要配置MySQL的主從配置或者主主複製,實現讀寫分離後才能達到數據的一致性(請看mysql主從複製文章)。

更多內容請關注公衆號(Laravel技術社區)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章