前言
Nginx是伺服器叢集的網關, 在生産中有流量分發的作用; 另外它屬于應用層的負載均衡(第七層), 可以對請求和響應作額外的代理操作, 比如: gzip, 添加響應頭以支援跨域, 防盜鍊配置
為保證Nginx的高可用, 需要搭建Nginx叢集, LVS的負載均衡是基于鍊路層(第四層), 隻分發請求而不進行代理, 是以LVS的吞吐量是高于Nginx的, 适合為Nginx叢集作負載均衡
伺服器與ip規劃
-
LVS一台: VIP(虛拟ip, 生産中應是公網ip): 192.168.209.150;
DIP(内網ip): 192.168.209.151
- Nginx2台, RIP(真實ip, 因被LVS負載均衡, 是以生産中處于内網): 192.168.209.222和 192.168.209.223
上述3個計算機節點關閉網絡配置管理器,因為有可能會和網絡接口沖突
systemctl stop NetworkManager
systemctl disable NetworkManager
LVS節點配置虛拟ip和負載均衡規則
配置虛拟ip
在LVS節點 (本案例為151節點)進入網卡配置目錄
/etc/sysconfig/network-scripts
拷貝網卡, 建立子接口
cp ifcfg-ens33 ifcfg-ens33:1
修改子接口配置:
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=cbebd981-2b3f-4271-812c-9b7d202ba714
DEVICE=ens33:1
ONBOOT=yes
IPADDR=192.168.209.150
GATEWAY=192.168.209.2
NETMASK=255.255.255.0
DNS1=114.114.114.114
注意改
DEVICE
和
IPADDR
即可
重新開機網絡服務
service network restart
, 再執行
ip addr
, 檢視虛拟ip是否添加成功
在雲端, 阿裡雲不支援虛拟IP,需要購買他的負載均衡服務
騰訊雲支援虛拟IP,但是需要額外購買,一台節點最大支援10個虛拟ip
用ipvsadm配置負載均衡規則
安裝ipvsadm:
yum install ipvsadm
建立LVS節點,使用者通路的叢集排程者
ipvsadm -A -t 192.168.209.150:80 -s rr -p 5
各參數含義如下:
-A:添加叢集
-t:tcp協定
ip位址:設定叢集的通路ip,也就是LVS的虛拟ip
-s:設定負載均衡的算法,rr表示輪詢
-p:設定連接配接持久化的時間
建立2台RS真實伺服器
ipvsadm -a -t 192.168.209.150:80 -r 192.168.209.222:80 -g
ipvsadm -a -t 192.168.209.150:80 -r 192.168.209.223:80 -g
-a:添加真實伺服器
-t:tcp協定
-r:真實伺服器的ip位址
-g:設定DR模式
儲存到規則庫,否則重新開機失效
ipvsadm -S
檢視叢集清單:
ipvsadm -Ln
LVS持久化配置, 選做, 參考連結 LVS持久化配置
為兩台Nginx配置虛拟ip和arp(響應級别和通告行為)
配置虛拟ip
在Nginx所在的真實伺服器節點(以222為例),
/etc/sysconfig/network-scripts
複制 lo網卡
cp ifcfg-lo ifcfg-lo:1
,
vim ifcfg-lo:1
修改為如下:
DEVICE=lo:1
IPADDR=192.168.209.150
NETMASK=255.255.255.255
NETWORK=127.0.0.0
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback
arp配置
vim /etc/sysctl.conf
配置所有網卡、預設網卡以及虛拟網卡的arp響應級别和通告行為,分别對應:all,default,lo:
# configration for lvs
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
重新整理配置檔案
sysctl -p
增加一個網關,用于接收資料封包,當有請求到本機後,會交給lo去處理:
route add -host 192.168.209.150 dev lo:1
防止重新開機失效,做如下處理,用于開機自啟動:
echo "route add -host 192.168.1.150 dev lo:1" >> /etc/rc.local
此時, 開啟兩台RS上的Nginx服務, 即可通過通路 LVS中配置的虛拟ip(150節點), 通路Nginx了
Keepalived +LVS 高可用
LVS單個節點當機, 則所有Nginx都不可通路, 考慮Keepalived +LVS實作高可用
下面, 以151節點為例, 使用keepalived配置LVS主節點
安裝Keepalived過程省略, 需要提示一點: 執行make編譯前, 需要指定核心配置檔案所在位置:
--prefix=/usr/local/keepalived --sysconf=/etc
keepalived注冊為系統服務:
keepalived 注冊為系統服務:
- 切換到路徑 /home/software/keepalived-2.0.18/keepalived/etc
- 将自啟動腳本複制到系統檔案夾 cp init.d/keepalived /etc/init.d/
cp sysconfig/keepalived /etc/sysconfig/
- systemctl daemon-reload, 重加載系統服務
- 将keepalived作為系統服務啟動, systemctl start keepalived.service
在 /etc/keepalived/ 下, 修改keepalived主配置檔案如下
! Configuration File for keepalived
global_defs {
# 主機辨別符,全局唯一
router_id keep_151
}
# 計算機節點執行個體
vrrp_instance VI_1 {
# MASTER, nginx 主節點
state MASTER
# 網卡名
interface ens33
virtual_router_id 151
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.209.150
}
}
# 配置叢集位址通路的IP+端口, 端口和Nginx保持一緻, 都是80
virtual_server 192.168.209.150 80 {
# 健康檢查時間
delay_loop 6
# 負載均衡算法, 預設輪詢
lb_algo rr
# 設定LVS的模式 NAT|TUN|DR
lb_kind DR
# 設定會話持久化時間
persistence_timeout 5
protocol TCP
# 負載均衡的RS
real_server 192.168.209.222 80 {
weight 1
# 設定健康檢查
TCP_CHECK {
connect_port 80
# 檢查的逾時時間
connect_timeout 2
# 重試次數
nb_get_retry 3
# 間隔時間
delay_before_retry 3
}
}
real_server 192.168.209.223 80 {
weight 1
# 設定健康檢查
TCP_CHECK {
connect_port 80
# 檢查的逾時時間
connect_timeout 2
# 重試次數
nb_get_retry 3
# 間隔時間
delay_before_retry 3
}
}
}
由于負載均衡規則已經由 keepalived定義了, 那我們可以清除 LVS此前定義的負載均衡規則
ipvsadm -C
啟動或重新開機 keepalived服務
systemctl start keepalived
或
systemctl restart keepalived
執行
ipvsadm -Ln
, 檢視 LVS負載均衡規則是否設定成功
151節點的配置完成了,152節點類似配置。通路192.168.209.150即可通路nginx
最後,150節點在生産環境應當是公網ip, 其他節點都是内網ip