天天看點

Nginx實作負載均衡 負載均衡幾種常用方式 實操 模拟其中一台故障 假如負載均衡服務故障了呢? session共享問題

本地搭建4台nginx虛拟機,其中一台做負載均衡伺服器,做轉發處理。

192.168.0.104 主伺服器,做轉發處理

192.168.0.106

192.168.0.107

192.168.0.108

我本地虛拟機搭建用的軟體是VMware+center os7+寶塔

負載均衡幾種常用方式

1、輪詢(預設)

每個請求按時間順序逐一配置設定到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。

upstream backserver {
    server 192.168.0.14;
    server 192.168.0.15;
}
           

2、weight

指定輪詢幾率,weight和通路比率成正比,用于後端伺服器性能不均的

情況。

upstream backserver {
    server 192.168.0.14 weight=3;
    server 192.168.0.15 weight=7;
}
           

權重越高,在被通路的機率越大,如上例,分别是30%,70%。

3、ip_hash

上述方式存在一個問題就是說,在負載均衡系統中,假如使用者在某台伺服器上登入了,那麼該使用者第二次請求的時候,因為我們是負載均衡系統,每次請求都會重新定位到伺服器叢集中的某一個,那麼已經登入某一個伺服器的使用者再重新定位到另一個伺服器,其登入資訊将會丢失,這樣顯然是不妥的。

我們可以采用ip_hash指令解決這個問題,如果客戶已經通路了某個伺服器,當使用者再次通路時,會将該請求通過雜湊演算法,自動定位到該伺服器。

每個請求按通路ip的hash結果配置設定,這樣每個訪客固定通路一個後端伺服器,可以解決session的問題。

upstream backserver {
    ip_hash;
    server 192.168.0.14:88;
    server 192.168.0.15:80;
}
           

4、fair(第三方)

按後端伺服器的響應時間來配置設定請求,響應時間短的優先配置設定。

upstream backserver {
    server server1;
    server server2;
    fair;
}
           

5、url_hash(第三方)

按通路url的hash結果來配置設定請求,使每個url定向到同一個(對應的)後端伺服器,後端伺服器為緩存時比較有效。

upstream backserver {
    server squid1:3128;
    server squid2:3128;
    hash $request_uri;
    hash_method crc32;
}
           

在需要使用負載均衡的server中增加

proxy_pass http://backserver/; 
upstream backserver{ 
    ip_hash; 
    server 127.0.0.1:9090 down; (down 表示單前的server暫時不參與負載) 
    server 127.0.0.1:8080 weight=2; (weight 預設為1.weight越大,負載的權重就越大) 
    server 127.0.0.1:6060; 
    server 127.0.0.1:7070 backup; (其它所有的非backup機器down或者忙的時候,請求backup機器) 
} 
           

max_fails :允許請求失敗的次數預設為1.當超過最大次數時,傳回proxy_next_upstream 子產品定義的錯誤

fail_timeout:max_fails次失敗後,暫停的時間

實操

主伺服器配置

upstream 192.168.0.104{
  #ip_hash;# ip_hash方式
  server 192.168.0.106;
  server 192.168.0.107;
  server 192.168.0.108;
}
server
{
    listen 80;
    server_name 192.168.0.104;
    index index.php index.html index.htm default.php default.htm default.html;
    root /www/wwwroot/192.168.0.104;
    
    # 省略寶塔預設配置...
    
    # 添加代理轉發
    location / {
      proxy_pass http://192.168.0.104;
    }
	access_log  /www/wwwlogs/192.168.0.104.log;
    error_log  /www/wwwlogs/192.168.0.104.error.log;
}
           

其他3個伺服器配置,均解析主伺服器ip

# 192.168.0.106
server
{
    listen 80;
    server_name 192.168.0.104 192.168.0.106;# 這裡
    #  省略寶塔預設配置...
}
# 192.168.0.107
server
{
    listen 80;
    server_name 192.168.0.104 192.168.0.107;# 這裡
    #  省略寶塔預設配置...
}
# 192.168.0.108
server
{
    listen 80;
    server_name 192.168.0.104 192.168.0.108;# 這裡
    #  省略寶塔預設配置...
}
           

其他3個伺服器目錄下的腳本

<?php
echo '2';// 其他2個改成 3 4
echo '<pre>';


var_dump($_SERVER);
           

然後通路 http://192.168.0.104/,會依次轉發到3個伺服器

Nginx實作負載均衡 負載均衡幾種常用方式 實操 模拟其中一台故障 假如負載均衡服務故障了呢? session共享問題
Nginx實作負載均衡 負載均衡幾種常用方式 實操 模拟其中一台故障 假如負載均衡服務故障了呢? session共享問題
Nginx實作負載均衡 負載均衡幾種常用方式 實操 模拟其中一台故障 假如負載均衡服務故障了呢? session共享問題

模拟其中一台故障

直接把nginx停止了,再通路,nginx會自動排除這台故障機,隻給其中2台轉發。

假如負載均衡服務故障了呢?

使用Keepalived實作高可用

參考我的另一篇:

https://blog.csdn.net/qq_31288929/article/details/111523539

參考其他部落客文章:

https://www.jianshu.com/p/b61b24324c32

https://blog.csdn.net/l1028386804/article/details/72801492

https://www.jianshu.com/p/a6b5ab36292a

session共享問題

可以使用ip_hash方式,或者參考

https://www.cnblogs.com/phper12580/p/10520908.html

1、使用Ip_hash

直接在upstream裡添加 ip_hash;

2、使用Redis或者Memcache

這裡使用redis測試。

主伺服器開啟redis伺服器。

Nginx實作負載均衡 負載均衡幾種常用方式 實操 模拟其中一台故障 假如負載均衡服務故障了呢? session共享問題

其他3台伺服器安裝php-redis拓展,并修改session儲存方式為redis

我這裡是用的寶塔,如果不是用的寶塔就百度一下安裝php-redis拓展和修改php儲存方式為redis的方法。

如果出現 warning:session_start(): Failed to read session data,請重載主伺服器的redis配置

Nginx實作負載均衡 負載均衡幾種常用方式 實操 模拟其中一台故障 假如負載均衡服務故障了呢? session共享問題
Nginx實作負載均衡 負載均衡幾種常用方式 實操 模拟其中一台故障 假如負載均衡服務故障了呢? session共享問題

3、測試

在第二台伺服器添加一個session,檢視其他幾台有沒有。

第二台代碼:

Nginx實作負載均衡 負載均衡幾種常用方式 實操 模拟其中一台故障 假如負載均衡服務故障了呢? session共享問題

第三、四台:

Nginx實作負載均衡 負載均衡幾種常用方式 實操 模拟其中一台故障 假如負載均衡服務故障了呢? session共享問題

通路:

Nginx實作負載均衡 負載均衡幾種常用方式 實操 模拟其中一台故障 假如負載均衡服務故障了呢? session共享問題
Nginx實作負載均衡 負載均衡幾種常用方式 實操 模拟其中一台故障 假如負載均衡服務故障了呢? session共享問題
Nginx實作負載均衡 負載均衡幾種常用方式 實操 模拟其中一台故障 假如負載均衡服務故障了呢? session共享問題

現在session已經成功在3台伺服器中共享。

以下省略。。。

最近弄了幾個站,留個外鍊

ITM遊戲資源

ITM資源

繼續閱讀