LB-Haproxy/Nginx
💯 決議:七層負載均衡器,為與七層模型上的應用層,通過URL地址(應用層)進行負載均衡,
優點:詳細地址,資料精準定位
缺點:地址長、范圍廣
一、HAproxy

原理決議
別名:七層負載均衡、應用程式負載、URL負載、動靜分離技術 用80埠
簡介: 免費、快速可靠、高性能的負載均衡軟體
親緣性:
- 后方有三臺Web服務器,用戶進行資料請求,當用戶訪問Web1時(一些特定的敏感話題會進行認證)
- 當我們的用戶再次訪問時,請求分發到我們的Web2上,又要進行認證,
- 所有我們通過用戶訪問得特性讓用戶訪問到固定的服務器(IP port seesion cookie…),解決了身份再次驗證導致的用戶體驗感,
seesion(會話視窗 服務器): 用戶進行身份認證,保存資訊 ==> 用戶訪問淘寶,加購物車,第一次要進行身份認證,后面無需認證
cookie(快取 瀏覽器): 保存用戶身份認證資訊,通常由瀏覽器存盤,windows端
TCP連接(秒表)
-
User <==> Web
-
當User向Web請求資料時,會有一個計時器,當在一定的時間沒回應,直接返還給用戶,資料未找到,
-
當三次握手完成之后,向Web請求資料,服務器沒反應,開啟秒表,將資料進行重傳遞
-
-
User <=> HA <=> Web
-
多了中間人(HAproxy)作為代理,用戶訪問HA,HA在分發給Web,HA的兩邊都是互相無感知的
-
會出現問題,當User在請求資料后直接關機,請求到達HA,HA不將資料發送給Web,
如果Web服務出現問題,HA將User的請求分發給其他的Web(這時,秒表計時器有很大的體現),
-
1、環境準備
1、HAproxy:192.168.178.60
2、Web1:192.168.178.7
3、Web2:192.168.178.16
# systemctl --now disable firewalld
# sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
# setenforce 0
2、Web
1、安裝httpd:
# yum -y install httpd
2、Web1 添加內容:
# echo "Web1" > /var/www/html/index.html
3、Web2 添加內容
# echo "Web2" > /var/www/html/index.html
3、HAproxy
3.1、安裝軟體
# yum -y install epel-release haproxy
3.2、撰寫組態檔
# cd /etc/haproxy/
# cp -r haproxy.cfg haproxy.cfg.bak
# vim haproxy.cfg
global #全域配置
log 127.0.0.1 local3 info #日志配置
maxconn 4096 #最大連接數
uid 99 #用戶
gid 99 #用戶組
daemon #行程守護
nbproc 1 #HAproxy的行程數,該值與服務器的CPU核心數一致,比如2顆8核心的,這是設定值為16
pidfile /run/haproxy.pid #行程ID存盤位置
#----------------------------------------------------------------
defaults #系統默認配置
log global #日志使用上方的全域配置
mode http #模式為7層LB
maxconn 2048 #最大連接數
retries 3 #健康檢測,3次連接失敗認為服務器不可用
option redispatch # 服務器不可用,重定向到其他服務器,進行服務器之間的故障轉移
timeout connect 50000 # HAproxy 將 用戶請求 轉至 后端的超時時長
timeout client 50000 # HAproxy作為客戶端,與后端空閑的互動超時時長
timeout server 50000 # HAproxy作為服務端,與用戶之間空閑互動的超時時長
option abortonclose # 當服務端負載較高時,自動結束當前佇列比較久的鏈接
stats uri /admin?stats # 監控頁面的URL IP:/admin?stats
stats auth Private land # 登入監控頁面提示的內容
stats auth admin:admin # 登入頁面使用的 用戶與密碼 用戶:密碼
stats hide-version # 隱藏監控頁面的 HAproxy版本號,
#----------------------------------------------------------------
frontend httpd-in # 前端配置,面向與用戶
bind 0.0.0.0:80 # HAproxy 的監聽埠,用戶通過 IP+埠訪問
mode http # 模式為 七層的 http請求
log global # 使用上方的全域Log
option httplog # 日志格式變得更豐富,獲取更詳細的資訊
option httpclose # 每次請求后,關閉 http 通道
acl html url_reg -i \.html$ # (html自定義名,方便下方的呼叫) 如果用戶訪問以 .html 結尾的頁面
use_backend html-server if html # 如果命中上方的 html 定義的策略,分發到 html-server 后端
default_backend html-server # 默認用戶請求的 后端
#-----------------------------------------------------------------
backend html-server # 定義 后端的服務器
mode http # 模式為 七層 http請求
balance roundrobin # 負載演算法 為 輪詢
option httpchk GET /index.html # 允許 HAproxy 進行 HTTP-GET Web服務的 /index.html,進行健康檢查
cookie SERVERID insert indirect nocache # 增加親緣性,Web服務回傳給用戶帶有Cookie的資料,用戶可以訪問到相同的服務器
server Web1 192.168.178.7:80 weight 1 cookie 3 check inter 2000 rise 2 fall 5
server Web2 192.168.178.16:80 weight 1 cookie 4 check inter 2000 rise 1 fall 3
# server1 服務器ID 真實Web-IP埠 權重 cookie值 進行檢測 檢測5次,其中連續有2次成功,代表該Web服務器健康,反之Web服務器故障
3.3、啟動HAproxy
1、啟動服務:
# systemctl start haproxy
2、查看是否有報錯資訊:
# vim /var/log/messages
3、查看服務啟動成功:
# ss -anpt | grep 80
3.4、進行測驗
# curl 192.168.178.60
web2
# curl 192.168.178.60
web1
3.5、登入 Web 監控頁面


二、實戰一 動靜分離技術+Keepalived

動靜分離技術
簡介:
- 用戶請求資料時,訪問的是圖片,到達后方的圖片服務器
- 訪問的是視頻,到達后方的視頻服務器
- 訪問的文本服務器,到達文字服務器
1、環境準備
1、HAproxy1-keepalived1:192.168.178.60
2、HAproxy2-keepalived2:192.168.178.61
3、keepalived-VIP:192.168.178.200
2、Web1-html靜:192.168.178.7
3、Web2-php動:192.168.178.16
# systemctl --now disable firewalld
# sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
# setenforce 0
2、Web
2.1、Web1-html靜
# yum -y install httpd
# echo 'Web1-html' > /var/www/html/index.html
# systemctl --now enable httpd
# curl localhost
Web1-html
2.2、Web2-php動
a、安裝軟體
# yum -y install epel-release && yum -y install php php-fpm nginx
b、配置nginx 連接PHP
# vim /etc/nginx/nginx.conf
#在Server 中進行添加
server {
.........
location / {
html index.php index.html index.htm;
}
location ~ \.php$ { #連接PHP服務器
root /usr/share/nginx/html; #php存放檔案的目錄
fastcgi_pass 127.0.0.1:9000; #PHP服務器的地址:埠 !!!!!!
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
.........
}
因為Nginx 與 PHP 部署在一臺機器上,不許要修改PHP 配置,直接啟動
c、 啟動服務
1、重啟nginx 與 啟動 php-fpm:
# systemctl restart nginx
# systemctl start php-fpm
2、查看服務是否啟動成功:
# ss -anpt | egrep '(80|9000)'
d、撰寫index.php,訪問
# echo '<?php phpinfo() ?>' > /usr/share/nginx/html/index.php

2、HAproxy
兩臺主機同時進行
2.1、安裝軟體
# yum -y install epel-release && yum -y install haproxy keepalived
2.2、撰寫haproxy配置
# cd /etc/haproxy/
# cp -r haproxy.cfg haproxy.cfg.bak
# vim haproxy.cfg
global
log 127.0.0.1 local3 info
maxconn 4096
uid 99
gid 99
daemon
nbproc 1
pidfile /run/haproxy.pid
#--------------------------------------
defaults
log global
mode http
maxconn 2048
retries 3
option redispatch
timeout connect 50000
timeout client 50000
timeout server 50000
option abortonclose
stats uri /admin?stats
stats auth Private land
stats auth admin:admin
stats hide-version
#--------------------------------------
frontend httpd-in
bind 0.0.0.0:80 # 監聽埠
mode http
log global
option httplog
option httpclose
acl php url_reg -i \.php$ #匹配 .php 結尾
acl html url_reg -i \.html$ #匹配 .html 結尾
use_backend php-server if php #上方匹配成功后對應的后端
use_backend html-server if html
default_backend php-server
#--------------------------------------
backend php-server #匹配 .php 對應的后端服務器,可以有多個,自定義
mode http
balance roundrobin
option httpchk GET /index.php
cookie SERVERID insert indirect nocache
server Php1 192.168.178.16:80 weight 1 cookie 3 check inter 2000 rise 2 fall 5
backend html-server #匹配 .html 對應的后端服務器
mode http
balance roundrobin
option httpchk GET /index.html
cookie SERVERID insert indirect nocache
server Web1 192.168.178.7:80 weight 1 cookie 4 check inter 2000 rise 2 fall 5
2.3、啟動服務
1、啟動服務:
# systemctl start haproxy
2、查看日志:
# vim /var/log/messages
3、查看服務啟動:
# ss -anpt | grep 80
2.4、測驗效果
1、訪問 HAproxy1:
# curl 192.168.178.60/index.html
Web1-html
2、訪問 HAproxy2:
# curl 192.168.178.61/index.html
Web1-html


3、Keepalived
3.1、Keepalived1
a、修改配置
# cd /etc/keepalived/
# cp -r keepalived.conf keepalived.conf.bak
# vim keepalived.conf
! Configuration File for keepalived
global_defs { #全域配置
router_id HA1 #設備在組中的標識,設定不一樣即可
}
vrrp_script chk_haproxy { #健康檢查
script "/etc/keepalived/ck_HA.sh" #檢查腳本
interval 6 #檢查頻率.秒(每隔6秒去執行腳本)
weight -5 #priority減5
fall 3 #失敗三次(嘗試三次,每隔兩秒去執行腳本,如果腳本失敗,就記下來,等檢查三次后,將優先級減5)
}
vrrp_instance VI_1 { #VI_1(組號),實體名兩臺路由器相同,
state MASTER #主或者從狀態
interface ens33 #監控網卡(心跳網卡)
mcast_src_ip 192.168.178.60 #心跳源IP
virtual_router_id 55 #虛擬路由編號(組編號),主備要一致,
priority 100 #優先級 (主要應用與1主多從)
advert_int 1 #心跳間隔S (對方主機運行狀態的監控)/可以為毫秒級監控
authentication { #秘鑰認證(1-8位)
auth_type PASS #密碼認證型別
auth_pass 123456 #密碼
}
virtual_ipaddress { #VIP
192.168.178.200/24
}
track_script { #參考腳本,監控腳本
chk_haproxy
}
}
b、撰寫監控腳本
🔺決議:因為是與HAproxy部署在同一臺機器上,所以對HAproxy的高可用進行監控,HAproxy會對后方的Web服務進行監控,
# vim ck_hA.sh
#!/bin/bash
#檢查HAproxy行程是否存在
counter=$(ps -C haproxy --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
systemctl restart haproxy
sleep 5 #嘗試啟動一次HAproxy,停止5秒后再次檢測
counter=$(ps -C haproxy --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
systemctl stop keepalived #如果啟動沒成功,就殺掉keepalive觸發主備切換
fi
fi
# chmod +x ck_HA.sh
c、拷貝檔案至 Keepalived2
# scp -r keepalived.conf 192.168.178.61:/etc/keepalived/
# scp -r ck_HA.sh 192.168.178.61:/etc/keepalived/
3.2、Keepalived2
1、修改配置:
# vim keepalived.conf
#找到進行修改
router_id hA2
state BACKUP
mcast_src_ip 192.168.178.61
priority 99
2、啟動 keepalived:
#systemctl start keepalived
3.3、所有Keepalived啟動
# systemctl --now enable keepalived
# ip a
3.4、訪問測驗
# curl 192.168.178.200/index.html
Web1-html

3.5、故障模擬
決議:將HAproxy1的組態檔移除,致使HAproxy起不來,實作VIP的轉移
1、移動 HAproxy1 的組態檔:
# mv /etc/haproxy/haproxy.cfg /opt/
# systemctl stop haproxy
2、查看 HAproxy2 上的IP,IP進行轉移:
# ip a
3、再次訪問服務,訪問成功:
# curl 192.168.178.200/index.html
Web1-html
# curl -I 192.168.178.200/index.php
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Sat, 20 Nov 2021 04:49:01 GMT
Content-Type: text/html
Connection: close
X-Powered-By: PHP/5.4.16
Set-Cookie: SERVERID=3; path=/ # cookie ID
Cache-control: private
三、實戰二 生產環境

決議:這也是企業中常用的一種架構,在生產環境中,haproxy與LVS等負載均衡設備往往不是單種存在的,主要是每一個設備都有自身的優點與缺點,把四層與七層組合起來使用,進行互補,既有四層的吞吐量,又有七層的精準定位與動靜分離等,這是再好不過了,
1、環境準備
LVS-VIP:192.168.178.100
LVS1-keepalived:192.168.178.60
LVS2-keepalived:192.168.178.61
HAproxy1:192.168.178.62
HAproxy2:192.168.178.63
Web1:192.168.178.7
Web2:192.168.178.16
1、關閉防火墻:
# systemctl --now disable firewalld
# sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
# setenforce 0
2、修改主機名:
# hostnamectl set-hostname lvs1/lvs2/ha1/ha2/web1/web2
3、時間同步:
# yum -y install ntpdate
# ntpdate ntp1.aliyun.com
4、計劃任務,時間同步
# systemctl --now enable crond
# crontab -e
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com
2、Web 配置
2.1、Web1-html靜
# yum -y install httpd
# echo 'Web1-html' > /var/www/html/index.html
# systemctl --now enable httpd
# curl localhost
Web1-html
2.2、Web2-php動
a、安裝軟體
# yum -y install epel-release && yum -y install php php-fpm nginx
b、配置nginx 連接PHP
# vim /etc/nginx/nginx.conf
#在Server 中進行添加
server {
.........
location / {
html index.php index.html index.htm;
}
location ~ \.php$ { #連接PHP服務器
root /usr/share/nginx/html; #php存放檔案的目錄
fastcgi_pass 127.0.0.1:9000; #PHP服務器的地址:埠 !!!!!!
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
.........
}
因為Nginx 與 PHP 部署在一臺機器上,不許要修改PHP 配置,直接啟動
c、 啟動服務
1、重啟nginx 與 啟動 php-fpm:
# systemctl restart nginx
# systemctl start php-fpm
2、查看服務是否啟動成功:
# ss -anpt | egrep '(80|9000)'
d、撰寫index.php,訪問
# echo '<?php phpinfo() ?>' > /usr/share/nginx/html/index.php

3、HAproxy 配置
兩臺主機同時進行
3.1、安裝軟體
# yum -y install epel-release && yum -y install haproxy keepalived
3.2、撰寫haproxy配置
# cd /etc/haproxy/
# cp -r haproxy.cfg haproxy.cfg.bak
# vim haproxy.cfg
global
log 127.0.0.1 local3 info
maxconn 4096
uid 99
gid 99
daemon
nbproc 1
pidfile /run/haproxy.pid
#--------------------------------------
defaults
log global
mode http
maxconn 2048
retries 3
option redispatch
timeout connect 50000
timeout client 50000
timeout server 50000
option abortonclose
stats uri /admin?stats
stats auth Private land
stats auth admin:admin
stats hide-version
#--------------------------------------
frontend httpd-in
bind 0.0.0.0:80 # 監聽埠
mode http
log global
option httplog
option httpclose
acl php url_reg -i \.php$ #匹配 .php 結尾
acl html url_reg -i \.html$ #匹配 .html 結尾
use_backend php-server if php #上方匹配成功后對應的后端
use_backend html-server if html
default_backend php-server
#--------------------------------------
backend php-server #匹配 .php 對應的后端服務器,可以有多個,自定義
mode http
balance roundrobin
option httpchk GET /index.php
cookie SERVERID insert indirect nocache
server Php1 192.168.178.16:80 weight 1 cookie 3 check inter 2000 rise 2 fall 5
backend html-server #匹配 .html 對應的后端服務器
mode http
balance roundrobin
option httpchk GET /index.html
cookie SERVERID insert indirect nocache
server Web1 192.168.178.7:80 weight 1 cookie 4 check inter 2000 rise 2 fall 5
3.3、啟動服務
1、啟動服務:
# systemctl --now enable haproxy
2、查看日志:
# vim /var/log/messages
3、查看服務啟動:
# ss -anpt | grep 80
3.4、測驗效果
1、訪問 HAproxy1:
# curl 192.168.178.62/index.html
Web1-html
2、訪問 HAproxy2:
# curl 192.168.178.63/index.html
Web1-html


4、LVS 配置
4.1、安裝軟體
LVS1:
# yum -y install ipvsadm keepalived
LVS2:
# yum -y install keepalived
4.2、LVS1配置
a、修改組態檔
# cd /etc/keepalived/
# cp -r keepalived.conf keepalived.conf.bak
# vim keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS1 #名稱,自定義
}
vrrp_instance VI_1 {
state MASTER #另外一臺機器是BACKUP
interface ens33 #心跳網卡
virtual_router_id 51 #虛擬路由編號,主備要一致
priority 150 #優先級
advert_int 1 #檢查間隔,單位秒
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.178.100/24 dev ens33 #VIP和作業介面
}
}
virtual_server 192.168.178.100 80 { #LVS 配置,VIP
delay_loop 3 #服務論詢的時間間隔,#每隔3秒檢查一次real_server狀態
lb_algo rr #LVS 調度演算法
lb_kind DR #LVS 集群模式
protocol TCP
real_server 192.168.178.62 80 { #HAproxy1服務器
weight 1
TCP_CHECK {
connect_timeout 3 #健康檢查方式,連接超時時間 (每隔三秒去連接Web,如果超時,就認為Web服務down機)
}
}
real_server 192.168.178.63 80 { #HAproxy2服務器
weight 1
TCP_CHECK {
connect_timeout 3
}
}
}
b、啟動服務,重啟
# scp -r keepalived.conf 192.168.178.61:/etc/keepalived/
# systemctl --now enable keepalived
# reboot
4.3、LVS2配置
a、修改配置
# vim /etc/keepalived/keepalived.conf
#找到進行修改
router_id LVS2
state BACKUP
priority 145
b、自啟動服務與重啟
# systemctl --now enable keepalived
# reboot
5、再次配置HAproxy lo:0虛擬介面
兩臺機器同時操作
5.1、配置虛擬IP -> lo:0
# cd /etc/sysconfig/network-scripts/
# cp -r ifcfg-lo ifcfg-lo:0
# vim ifcfg-lo:0
DEVICE=lo:0 #介面名
IPADDR=192.168.178.100 #LVS的虛擬IP
NETMASK=255.255.255.255 #地址唯一性
ONBOOT=yes #自啟
#其他的注釋
5.2、配置路由
# vim /etc/rc.local
#添加
# 開機生效 確保如果請求的目標IP是$VIP,那么讓出去的資料包的源地址也顯示為$VIP
/sbin/route add -host 192.168.178.100 dev lo:0
5.3、配置ARP
1、忽略arp請求,可以回復
# vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
5.4、重啟生效
# reboot
6、故障測驗
6.1、訪問服務
# curl 192.168.178.100/index.html
Web1-html
# curl -I 192.168.178.100/index.php
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Sat, 20 Nov 2021 11:00:33 GMT
Content-Type: text/html
Connection: close
X-Powered-By: PHP/5.4.16
Set-Cookie: SERVERID=3; path=/
Cache-control: private
6.2、停止LVS1的keepalived,再次訪問服務
# systemctl stop keepalived
# curl 192.168.178.100/index.html
Web1-html
# curl -I 192.168.178.100/index.php
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Sat, 20 Nov 2021 11:02:57 GMT
Content-Type: text/html
Connection: close
X-Powered-By: PHP/5.4.16
Set-Cookie: SERVERID=3; path=/
Cache-control: private
6.3、停止 HAproxy1服務,再次訪問服務
# systemctl stop haproxy
# curl 192.168.178.100/index.html
Web1-html
# curl -I 192.168.178.100/index.php
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Sat, 20 Nov 2021 11:04:46 GMT
Content-Type: text/html
Connection: close
X-Powered-By: PHP/5.4.16
Set-Cookie: SERVERID=3; path=/
Cache-control: private
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/389118.html
標籤:其他
上一篇:數通技術-網路參考模型
下一篇:架構整潔之道:設計模式
