Nginx上的負載均衡和會話保持Redis

1.什么是負載均衡

    負載均衡,英文名稱為Load Balance,其含義就是指將負載(工作任務)進行平衡、分攤到多個操作單元上進行運行,例如FTP服務器、Web服務器、企業(yè)核心應用服務器和其它主要任務服務器等,從而協(xié)同完成工作任務。

    負載均衡構(gòu)建在原有網(wǎng)絡結(jié)構(gòu)之上,它提供了一種透明且廉價有效的方法擴展服務器和網(wǎng)絡設備的帶寬、加強網(wǎng)絡數(shù)據(jù)處理能力、增加吞吐量、提高網(wǎng)絡的可用性和靈活性。

2.為什么需要使用負載均衡?

負載均衡的作用在于,通過某種負載分擔技術(shù),讓所有節(jié)點以最小的代價、最好的狀態(tài)對外提供服務,快速獲取重要數(shù)據(jù),最大化降低了單個節(jié)點過載、甚至crash的概率,解決大量并發(fā)訪問服務問題,簡要概括就是:解決并發(fā)壓力,提高應用處理性能;提供故障轉(zhuǎn)移,實現(xiàn)高可用;通過添加或減少服務器數(shù)量,提供網(wǎng)站伸縮性;安全防護。

3.負載均衡實現(xiàn)的場景? 四層負載均衡

四層負載均衡:   轉(zhuǎn)發(fā)   改寫數(shù)據(jù)包   源IP  源端口  目標IP  目標端口  真實的目標IP 目標端口
七層負載均衡:   代理   代為辦理

4.七層負載均衡與四層負載均衡區(qū)別?

七層負載均衡效率沒有四負載均衡高。
四層負載均衡沒有七層負載均衡支持的功能多,比如  url匹配  設置頭部信息

負載均衡是基于代理實現(xiàn)的一種形式

5.七層負載均衡配置示例?

[root@lb01 conf.d]# cat proxy_web.oldxu.com.conf 
upstream web {
    server 172.16.1.7:80;
    server 172.16.1.8:80;
}

server {
    listen 80;
    server_name web.oldxu.com;

    location / {
        proxy_pass http://web;
        include proxy_params;
    }
}


[root@lb01 conf.d]# cat /etc/nginx/proxy_params 
proxy_http_version 1.1;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;

proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;


#后端web配置 (為了區(qū)分,將兩臺web的站點配置的不一樣,以便測試效果)
[root@web01 conf.d]# cat web.oldxu.com.conf 
server {
    listen 80;
    server_name web.oldxu.com;

    location / {
        root /html;
        index index.html;
    }
}

6.七層負載均衡整合集群架構(gòu)示例?

blog
zh

7.七層負載均衡調(diào)度算法、后端狀態(tài)?

1.負載均衡如何分配流量?
    1.強與弱
    2.平均

調(diào)度算法        概述
輪詢          按時間順序逐一分配到不同的后端服務器(默認)
    機器的配置一致                 (web集群  硬件環(huán)境 一致)

weight          加權(quán)輪詢,weight值越大,分配到的訪問幾率越高
    機器硬件不一致的情況下使用  (硬件  pc機)

ip_hash         每個請求按訪問IP的hash結(jié)果分配,這樣來自同一IP的固定訪問一個后端服務器
    解決問題:       能解決會話保持的問題  
    帶來新的問題: 會造成后端負載不均衡

url_hash        按照訪問URL的hash結(jié)果來分配請求,是每個URL定向到同一個后端服務器
least_conn      最少鏈接數(shù),那個機器鏈接數(shù)少   就分發(fā)


7.七層負載均衡后端狀態(tài)?

狀態(tài)              概述
down                當前的server暫時不參與負載均衡
backup              預留的備份服務器
max_fails           允許請求失敗的次數(shù)
fail_timeout        經(jīng)過max_fails失敗后, 服務暫停時間
max_conns           限制最大的接收連接數(shù)

    a   max_fails=2 fail_timeout=10s    運維
    b   max_fails=2 fail_timeout=10s    運維
    c   backup;     開發(fā)  運維
    d   down;       離職
    
    
    
    
企業(yè)案例:使用nginx負載均衡時,如何將后端請求超時的服務器流量平滑的切換到另一臺上。如果后臺服務連接超時,Nginx是本身是有機制的,如果出現(xiàn)一個節(jié)點down掉的時候,Nginx會更據(jù)你具體負載均衡的設置,將請求轉(zhuǎn)移到其他的節(jié)點上,但是,如果后臺服務連接沒有down掉,但是返回錯誤異常碼了如:504、502、500,應該如何處理。
可以在負載均衡添加如下配置proxy_next_upstream http_500 | http_502 | http_503 | http_504 |http_404;意思是,當其中一臺返回錯誤碼404,500...等錯誤時,可以分配到下一臺服務器程序繼續(xù)處理,提高平臺訪問成功率。

    nginx本身是有剔除機制,  指的是 后端的nginx沒有正常工作
    proxy_next_upstream nginx是正常工作,只不過后端的php或者其他程序出現(xiàn)問題  502

server {
    listen 80;
    server_name xuliangwei.com;

    location / {
        proxy_pass http://node;
        proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
    }
}

8.七層負載均衡實現(xiàn)Redis會話共享? redis

1、粘性session
粘性session是指Ngnix每次都將同一用戶的所有請求轉(zhuǎn)發(fā)至同一臺服務器上,及Nginx的 IP_hash。

2、session復制
即每次session發(fā)生變化時,創(chuàng)建或者修改,就廣播給集群中的服務器,使所有的服務器上的session相同。

3、session持久化 ( 慢 )
將session存儲至數(shù)據(jù)庫中,像操作數(shù)據(jù)一樣操作session。

4、session共享
緩存session至內(nèi)存數(shù)據(jù)庫中,使用redis ( 內(nèi)存-->刷到磁盤  ),memcached (內(nèi)存數(shù)據(jù)庫)。

思路:

--------------------------------------------------------------------------
1.在 172.16.1.8  和  172.16.1.7 安裝 phpmyadmin     
        分別進行測試-->測試登錄

    #1.安裝phpmyadmin(web01和web02上都裝)
    [root@web01 conf.d]# cd /code
    [root@web01 code]# wget https://files.phpmyadmin.net/phpMyAdmin/4.8.4/phpMyAdmin-4.8.4-all-languages.zip
    [root@web01 code]# unzip phpMyAdmin-4.8.4-all-languages.zip

    #2.配置phpmyadmin連接遠程的數(shù)據(jù)庫
    [root@web01 code]# cd phpMyAdmin-4.8.4-all-languages/
    [root@web01 phpMyAdmin-4.8.4-all-languages]# cp config.sample.inc.php config.inc.php
    [root@web01 phpMyAdmin-4.8.4-all-languages]# vim config.inc.php
    /* Server parameters */
    $cfg['Servers'][$i]['host'] = '172.16.1.51';
    
--------------------------------------------------------------------------
2.接入負載均衡  ---> 代理至后端2臺主機  

[root@lb01 conf.d]# cat proxy_php.oldxu.com.conf 
upstream  php {
    server 172.16.1.7;
    server 172.16.1.8;
}

server {
    listen 80;
    server_name php.oldxu.com;
    location / {
        proxy_pass http://php;
        proxy_set_header Host $http_host;
    }
}

--------------------------------------------------------------------------
3.發(fā)現(xiàn)無法正常登陸
    1.解決方法:  
        在負載均衡上配置  ip_hash 會話保持   (  造成用戶僅訪問后端的某一臺主機  )
[root@lb01 conf.d]# cat proxy_php.oldxu.com.conf 
upstream  php {
    ip_hash;
    server 172.16.1.7;
    server 172.16.1.8;
}

server {
    listen 80;
    server_name php.oldxu.com;
    location / {
        proxy_pass http://php;
        proxy_set_header Host $http_host;
    }
}

--------------------------------------------------------------------------
4.既希望能夠?qū)崿F(xiàn)流量的均攤,又希望會話的問題得以保持, 所以引入了redis

1)安裝redis
    [root@db01 ~]# yum install redis -y
2)配置redis
    [root@db01 ~]# sed -i '/^bind/c bind 127.0.0.1 172.16.1.51' /etc/redis.conf
3)啟動redis
    [root@db01 ~]# systemctl enable redis
    [root@db01 ~]# systemctl start redis


4) 改造php, session寫本地修改為寫入redis中  (所有的web上都需要配置)
    前提:  已經(jīng)安裝過了redis的模塊---> php71w-pecl-redis

    1.修改php存儲session至redis中
    [root@db01 ~]# vim /etc/php.ini
    session.save_handler = redis
    session.save_path = "tcp://172.16.1.51:6379?weight=1"


    2.修改php-fpm 注釋默認存儲session的位置
    [root@web01 ~]# vim /etc/php-fpm.d/www.conf
    ;php_value[session.save_handler] = files
    ;php_value[session.save_path]    = /var/lib/php/session

    3.將修改后的配置文件,推送至172.16.1.8
    [root@web01 ~]# scp /etc/php.ini root@172.16.1.8:/etc/  
    [root@web01 ~]# scp /etc/php-fpm.d/www.conf  root@172.16.1.8:/etc/php-fpm.d/www.conf
    
    4.重啟172.16.1.7 172.16.1.8兩臺服務器的php-fpm
    [root@web02 conf.d]# systemctl restart php-fpm

5) 測試效果
    1.瀏覽器登錄測試  (ok)
    
    2.查看redis的sessionID和    瀏覽器cookie中提交的sessionID是否一致
    [root@db01 ~]# redis-cli 
    127.0.0.1:6379> keys *
    1) "PHPREDIS_SESSION:38ecc8696c70a7252d943e7cb9b20f70"

9.SLB負載均衡 + ECS 云主機 ( 120 塊錢 --> 按量付費 )

ECS 云主機  ===> 服務器    ( Linux 操作系統(tǒng)   安裝  Nginx  PHP )
SLB 產(chǎn)品    ===> 開源技術(shù)  ( Tengine  LVS )   手動配置負載均衡沒什么區(qū)別

1) 購買云主機 (  按量  --->  釋放 )
2) 配置云主機環(huán)境  Nginx +PHP
2) 購買SLB負載均衡 (  按量  --->  釋放 )
3) 集成 SLB+ECS
4) DNS解析
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容