前言:
隨着互聯網應用的廣泛普及,海量數據的存儲和訪問成爲了系統設計的瓶頸問題。對於一個大型的互聯網應用,每天百萬級甚至上億的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技術社區)