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解析