Nginx實用插件_踩踩踩從踩的博客-CSDN博客
前言
前面文章介紹Nginx的核心及擴展插件必要的性能優化,以及在nginx中如何實用用https;本篇文章會繼續講解重要的概念 lvs高可用框架,怎么利用虛擬服務,使得nginx高可用,以及 負載均衡策略;基于Keepalived實作LVS高可用,負載均衡器LVS跟Nginx差別

也是源自對應請求量高并發的情況才 nginx集群進行高可用,如何實用lvs進行分流
LVS簡介
- 有一個負載調度器—負載均衡
- 內部結構對客戶端透明—封裝
- 無感知的增刪服務節點—可伸縮
- 檢測服務健康狀態—高可用


這就是lvs達到的效果 ,對于客戶端感覺像是一個的樣子,
為什么要用LVS
- 基于DNS,DNS將域名決議為服務器的不同IP地址來將請求分發到不同的服務器,實作集群負載
- 基于客戶端,客戶端需要值得服務集群資訊,
- 基于調度程式,調度程式可以以精細的粒度調度請求(例如每個連接) ,以便在服務器之間實更好的負載平衡,
- 基于IP
應用框架結構
LVS如何作業
IPVS - NAT
NAT(Network Address Translation,網路地址轉換)是1994年提出的,當在專用網內部的一些主機本來已經分配到了本地IP地址(即僅在本專用網內使用的專用地址),但又想和因特網上的主機通信(并不需要加密)時,可使用NAT方法,
這種方法需要在專用網(私網IP)連接到因特網(公網IP)的路由器上安裝NAT軟體,裝有NAT軟體的路由器叫做NAT路由器,它至少有一個有效的外部全球IP地址(公網IP地址),這樣,所有使用本地地址(私網IP地址)的主機在和外界通信時,都要在NAT路由器上將其本地地址轉換成全球IP地址,才能和因特網連接,
IPVS - IP TUN

IPVS - DR
高可用Nginx集群安裝
如何搭建一個nginx高可用集群
高可用Nginx集群安裝搭建手冊 提取碼:nnfp
環境準備
兩臺linux服務器,IP地址分別為
192.168.120.103
192.168.120.58
準備IP地址資訊列印程式balancer-1.0.0.jar,http://hostname:port/server/ip,列印服務器的IP埠號資訊,
安裝兩臺Nginx
安裝步驟,參考前面Nginx的手冊來操作,將Nginx分別安裝在前面準備的兩臺linux服務器上,
啟動Nginx,都為80埠,代理前面的的balancer-1.0.0.jar服務,
安裝LVS
LVS全稱為Linux Virtual Server,作業在ISO模型中的第四層,由于其作業在第四層,因此與iptables類似,必須作業在內核空間上,因此lvs與iptables一樣,是直接作業在內核中的,叫ipvs,主流的linux發行版默認都已經集成了ipvs,因此用戶只需安裝一個管理工具ipvsadm即可,
LVS現在已成為Linux內核的一部分,默認編譯為ip_vs模塊,必要時能夠自動呼叫,以下操作可以手動加載ip_vs模塊,并查看當前系統中ip_vs模塊的版本資訊,
安裝依賴
$ sudo yum install -y popt-static kernel-devel make gcc openssl-devel lftplibnl* popt* openssl-devel lftplibnl* popt* libnl* libpopt* gcc*
加載LVS
# 通過下面命令來檢查,如果沒有顯示,則說明沒有加載
$ lsmod |grep ip_vs
ip_vs 145497 0
# 加載LVS,執行下面命令就可以把ip_vs模塊加載到內核
$ sudo modprobe ip_vs
# 查看LVS版本號,說明安裝成功
$ cat /proc/net/ip_vs
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
安裝ipvsadm
curl "http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz" -o ipvsadm-1.26.tar.gz
tar zxf ipvsadm-1.26.tar.gz
cd ipvsadm-1.26
rpm -qa | grep kernel-devel # 確認是否安裝了kernel-devel(默認已經安裝)
su root # 需要root權限執行
make && make install
curl "http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.25-1.src.rpm" -o ipvsadm-1.25-1.src.rpm
sudo rpm -ivh ipvsadm-1.25-1.src.rpm
# 檢查是否安裝成功,顯示下面的內容表示安裝成功
$ sudo ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
LVS DR模式
DR模式是LVS三種實作負載均衡方式中性能最好的一個,下面就使用這個模式,配置Nginx負載均衡的實作,
設定IP環境如下
VIP:192.168.120.200
lvs-director:192.168.120.58
Nginx1:192.168.120.103
Nginx2:192.168.120.58
DR配置
LVS配置
編輯lvs檔案
sudo vim /usr/local/sbin/lvs_dr.sh
輸入下面內容
#! /bin/bash
# 1,啟用ip轉發;0,禁止ip轉發;默認0,
echo 1 > /proc/sys/net/ipv4/ip_forward
# 定義兩個變數方便后面使用
ipv=/sbin/ipvsadm
vip=192.168.120.200
# 通過ifconfig,找到自己的網卡名,我這里是enp0s3
# 下掉enp0s3:0的虛擬ip
ifconfig enp0s3:0 down
# 通過ifconfig,找到自己的網卡名,在其下面系結虛擬ip
# 在enp0s3上系結虛擬ip,虛擬ip地址的廣播地址是它本身
ifconfig enp0s3:0 $vip broadcast $vip netmask 255.255.255.255 up
# 添加路由規則
route add -host $vip dev enp0s3:0
# 清除原有轉發規則
$ipv -C
# 新增虛擬服務,采用輪詢策略,負載轉發埠是8080
$ipv -A -t $vip:8080 -s rr
# 定義實際服務ip
rs1=192.168.120.103
rs2=192.168.120.58
# -a在虛擬IP中添加上游服務資訊;-t表示tcp服務
# -r表示真實服務資訊;-g指定為LVS為直接路由模式
$ipv -a -t $vip:8080 -r $rs1:80 -g
$ipv -a -t $vip:8080 -r $rs2:80 -g
使配置生效
sudo sh /usr/local/sbin/lvs_dr.sh
sudo ipvsadm
ipvsadm操作說明
sudo ipvsadm -C 清除
說明:
-A --add-service在服務器串列中新添加一條新的虛擬服務器記錄
-t 表示為tcp服務
-u 表示為udp服務
-s --scheduler 使用的調度演算法, rr | wrr | lc | wlc | lblb | lblcr | dh | sh | sed | nq 默認調度演算法是 wlc
-a --add-server 在服務器表中添加一條新的真實主機記錄
-r --real-server 真實服務器地址
-m --masquerading 指定LVS作業模式為NAT模式
-w --weight 真實服務器的權值
-g --gatewaying 指定LVS作業模式為直接路由器模式(也是LVS默認的模式)
-i --ipip 指定LVS的作業模式為隧道模式
sudo ipvsadm -help 可以查看更多的幫助資訊
真實服務配置
在lvs的DR和TUn模式下,用戶的訪問請求到達真實服務器后,是直接回傳給用戶的,而不再經過前端的Director Server,因此,就需要在每個Real server節點上增加虛擬的VIP地址,這樣資料才能直接回傳給用戶,
2臺真實web服務器的配置資訊,編輯lvs_dr_rs.sh檔案
sudo vim /usr/local/sbin/lvs_dr_rs.sh
輸入內容
#! /bin/bash
vip=192.168.120.200
ifconfig enp0s3:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip enp0s3:0
# 關閉arp決議
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
關閉arp決議

arp_ignore:當ARP請求發過來后發現自己正是請求的地址是否回應;
0 - 利用本地的任何地址,不管配置在哪個介面上去回應ARP請求;
1 - 哪個介面上接受ARP請求,就從哪個埠上回應,
arp_announce :定義不同級別,當ARP請求通過某個埠進來是否利用這個介面來回應,
0 - 利用本地的任何地址,不管配置在哪個介面上去回應ARP請求;
1 - 避免使用另外一個介面上的mac地址去回應ARP請求;
2 - 盡可能使用能夠匹配到ARP請求的最佳地址,
使配置生效
sudo sh /usr/local/sbin/lvs_dr_rs.sh
sudo sysctl -p
測驗
在瀏覽器輸入訪問
http://192.168.120.200:8080/server/ip
安裝Keepalived
只有一臺LVS服務,萬一掛了怎么辦?需要Keepalived來做高可用,準備兩臺linux服務器,用來安裝兩臺keepalived,Keepalived安裝程序如下,
安裝依賴
2.0.18版本
sudo yum install -y openssl-devel popt-devel libnl-devel kernel-devel gcc
安裝Keepalived
2.0.18版本
cd ~
wget https://www.keepalived.org/software/keepalived-2.0.18.tar.gz
tar -xvzf keepalived-2.0.18.tar.gz
cd keepalived
# 安裝到/usr/local/keepalived目錄
./configure --prefix=/usr/local/keepalived --sysconf=/etc
sudo make & sudo make install
配置
配置放在/etc/keepalived/,三份組態檔(一個nginx_monitor監控腳本,主備各一份keepalived配置)
Nginx監控腳本
新建nginx_monitor.sh檔案
sudo vim /etc/keepalived/nginx_monitor.sh
腳本內容
#!/bin/bash
# shell腳本監控:如果程式的行程存在,則認為沒有問題
if [ "$(ps -ef | grep "nginx"| grep -v grep| grep -v keepalived )" == "" ]
then
# 輸出日志
echo "nginx ############# app down " >> /var/log/messages
exit 1
else
# 一切正常
exit 0
fi
執行腳本
# 創建nginx monitor 腳本,并賦予可執行權限
sudo chmod +x /etc/keepalived/nginx_monitor.sh
# 測驗一下腳本能不能執行
sh /etc/keepalived/nginx_monitor.sh
# 沒報錯即表示為成功
Keepalived配置
主配置 /etc/keepalived/keepalived-nginx-master.conf
# 定義一個名為monitor的腳本
vrrp_script monitor {
# 監控腳本存放地址
script "/etc/keepalived/nginx_monitor.sh"
# 每隔1秒執行一次
interval 1
}
# 定義一個vrrp示例
vrrp_instance VI_1 {
state MASTER #(主機為MASTER,備用機為BACKUP)
interface enp0s3 #(HA監測網卡介面)
virtual_router_id 61 #(主、備機的virtual_router_id必須相同,不大于255)
priority 90 #(主、備機取不同的優先級,主機值較大,備份機值較小,值越大優先級越高)
advert_int 1 #(VRRP Multicast廣播周期秒數)
track_script {
monitor #(監控腳本名稱)
}
virtual_ipaddress {
192.168.120.200 #(VRRP HA虛擬IP)
}
}
備份配置 /etc/keepalived/keepalived-nginx-backup.conf
# 定義一個名為monitor的腳本
vrrp_script monitor {
# 監控nginx的腳本存放地址
script "/etc/keepalived/nginx_monitor.sh"
# 每隔1秒執行一次
interval 1
}
# 定義一個vrrp示例
vrrp_instance VI_1 {
state BACKUP #(主機為MASTER,備用機為BACKUP)
interface enp0s3 #(HA監測網卡介面)
virtual_router_id 61 #(主、備機的virtual_router_id必須相同)
priority 80 #(主、備機取不同的優先級,主機值較大,備份機值較小,值越大優先級越高)
advert_int 1 #(VRRP Multicast廣播周期秒數)
track_script {
monitor #(監控腳本名稱)
}
virtual_ipaddress {
192.168.120.200 #(VRRP HA虛擬IP)
}
}
# - master主機
keepalived-nginx-master.conf
# - backup備機
keepalived-nginx-backup.conf
啟動Keepalived服務
# 啟動master主機
/usr/local/keepalived/sbin/keepalived -f /etc/keepalived/keepalived-nginx-master.conf
# 啟動backup備機
/usr/local/keepalived/sbin/keepalived -f /etc/keepalived/keepalived-nginx-backup.conf
注意事項
兩臺keepalived服務間需要通信,關閉防火墻
firewall-cmd --state #查看默認防火墻狀態(關閉后顯示notrunning,開啟后顯示running)
systemctl list-unit-files|grep firewalld.service
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall開機啟動
[root@localhost ~]#systemctl stop firewalld.service
[root@localhost ~]#systemctl disable firewalld.service
啟動一個服務:systemctl start firewalld.service
關閉一個服務:systemctl stop firewalld.service
重啟一個服務:systemctl restart firewalld.service
顯示一個服務的狀態:systemctl status firewalld.service
在開機時啟用一個服務:systemctl enable firewalld.service
在開機時禁用一個服務:systemctl disable firewalld.service
查看服務是否開機啟動:systemctl is-enabled firewalld.service;echo $?
查看已啟動的服務串列:systemctl list-unit-files|grep enabled
測驗
關閉master服務,服務是否仍然可用,backup服務是否替補上來,
LVS負載策略分析
LVS負載策略
- 輪詢(Round Robin)
- 加權輪詢(Weighted Round Robin)
- 最少連接(Least Connections)
- 加權最少鏈接(Weighted Least Connections)
- 基于區域性的最少鏈接(Locality-Based Least Connections)
- 帶復制的基于區域性最少鏈接(Locality-Based Least Connections with Replication)
- 目標地址散列(Destination Hashing)
- 源地址散列(Source Hashing)
基于Keepalived實作LVS高可用
什么是Keepalived
- ? LVS系統的健康檢查
- ? 實作VRRPv2堆疊以處理負載均衡器故障轉移
Keepalived for Linux
用 C 撰寫的路由軟體,該專案的主要目標是為 Linux 系統和 Linux 基礎設施提供簡單而強大的負載平衡和高可用性設施,負載平衡框架依賴于眾所周知且廣泛使用的Linux 虛擬服務器 (IPVS)內核模塊,提供第 4 層負載平衡,保持實作實作一組檢查器,以動態和自適應地維護和管理負載平衡服務器池根據他們的健康,另一方面,VRRP協議實作了高可用性,VRRP 是路由器故障轉移的基本磚塊,此外,Keepalived 還向 VRRP 有限狀態機器實施一組掛鉤,提供低級和高速協議互動,為了提供最快的網路故障檢測,保持實作BFD協議,VRRP 狀態過渡可以考慮 BFD 提示以推動快速狀態過渡,可獨立或全部使用保持框架,以提供彈性基礎設施,

Keepalived的設計

Keepalived的結構

健康檢查—Checkers
高可用特性—VRRP Stack

LVS和Nginx異同分析
其實都是為了解決高并發的問題,但lvs 從傳輸層,去處理,當然并發更高,
都有第四層、第七層負載均衡的機制,
Nginx在第7層更加成熟穩定、功能更加豐富,大量的第三方模塊和插件,LVS比擬不了,LVS應用層的負債均衡還不夠成熟,
LVS處于第四層負債均衡,并且集成到了LInux內核中,基于IP級別的負債均衡,又在內核中,效率更加的高效、Nginx四層負載均衡無法比擬,
得益于Nginx在第7層能拿到更多的資料,功能更強大,才連接tomcat服務器,
keepalived與lvs,他們是一個功能包含關系,keepalived依賴lvs的ipvs模塊,keepalived除了能進行負載均衡、還能提供負載均衡、還能提供高可用的特性,單點故障的問題,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/347287.html
標籤:其他
上一篇:Nginx實用插件

