在大型網站中一般服務端會做叢集,同時利用負載均衡器做負載均衡。這樣有利於將大量的請求分散到各個伺服器上,提升網站的響應速度。當然為了解決單點故障的問題,還會做熱備份方案。這裡演示利用LVS做負載均衡器,同時利用Keepalived保證其高可用,基於LVS的DR模式構建Nginx叢集。
1、環境準備
各個軟體及其版本資訊如下:
軟體 | 版本 |
---|---|
Centos系統 | Linux release 7.3.1611 (Core) |
Nginx | 1.16.0 |
LVS | ipvsadm-1.27-7.el7.x86_64 |
Keepalived | keepalived.x86_64 0:1.3.5-8.el7_6 |
節點分配及角色如下:
節點 | 角色 |
---|---|
192.168.208.154 | lvs master |
192.168.208.155 | lvs slave |
192.168.208.150 | nginx1 |
192.168.208.151 | nginx2 |
同時特別注意這裡設定的VIP地址為:192.168.208.100,VIP也即虛擬的IP地址,即當外部請求所訪問的IP地址。
2、部署架構
基於上述的環境,部署的架構如下:
特別注意:
由於是採用DR模式,也即當使用者請求傳送到VIP時,LVS會根據所設定的負載均衡演算法將請求轉發到具體的Nginx伺服器(Real Server)上,而當具體的Nginx伺服器處理完後是直接將結果返回給使用者。所以在具體的Nginx伺服器是要設定迴環的IP,即在lo網路卡上設定VIP的地址。
3、部署程式
(1)、首先在lvs master節點和slave節點安裝lvs和keepalived:
yum install ipvsadm
yum install keepalived
(2)、在nginx1和nginx2節點上安裝nginx:
# 新增nginx的yum源
rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
# 安裝
yum install nginx
安裝完成nginx後,編輯其預設頁面,加上特定的資訊,這樣才能判斷請求到底是哪個nginx處理的,即:
vi /usr/share/nginx/html/index.html
對於nginx1加上150字樣,nginx2加上151字樣,即:
當直接訪問nginx1時,效果為:
當直接訪問nginx2時,效果為:
(3)、在lvs master節點和lvs slave節點配置keepalived資訊:
首先配置lvs master節點:
編輯如下檔案:
vi /etc/keepalived/keepalived.conf
內容為:
! Configuration File for keepalived
global_defs {
# 這裡將這些郵件設定的相關資訊都註釋掉了
# notification_email {
# acassen@firewall.loc
# failover@firewall.loc
# sysadmin@firewall.loc
# }
# notification_email_from Alexandre.Cassen@firewall.loc
# smtp_server 192.168.200.1
# smtp_connect_timeout 30
# router_id是keepalived的一個標識,最好不同的keepalived配置成不一樣
router_id LVS_DEVEL
# vrrp_skip_check_adv_addr
# vrrp_strict
# vrrp_garp_interval 0
# vrrp_gna_interval 0
}
vrrp_instance VI_1 {
# MASTER表示是主節點,備份節點是BACKUP
state MASTER
# 網路卡名稱,這個不同的伺服器,可能有所不同
interface ens33
# 路由標識,MASTER和BACKUP節點的該值要保持一致
virtual_router_id 51
# 優先順序,MASTER節點的值必須大於BACKUP的值
priority 100
# MASTER與BACKUP同步的時間間隔,單位為秒
advert_int 1
# lvs對應的真實IP
mcast_src_ip=192.168.208.154
authentication {
auth_type PASS
auth_pass 1111
}
# 虛擬IP的址
virtual_ipaddress {
192.168.208.100
}
}
virtual_server 192.168.208.100 80 {
# 健康檢查的時間,單位為秒
delay_loop 6
# 負載排程演算法,這裡設定為rr,即輪詢演算法
lb_algo rr
# 設定DR模式
lb_kind DR
# 虛擬地址的子網掩碼
nat_mask 255.255.255.0
# 會話保持時間,單位為秒
persistence_timeout 50
protocol TCP
# 配置真實伺服器資訊
real_server 192.168.208.150 80 {
# 節點的權值
weight 1
TCP_CHECK {
# 超時時間
connect_timeout 3
# 重試次數
nb_get_retry 3
# 重試間隔
delay_before_retry 3
}
}
real_server 192.168.208.151 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
基於上述的配置,那麼lvs slave的配置如下:
! Configuration File for keepalived
global_defs {
# notification_email {
# acassen@firewall.loc
# failover@firewall.loc
# sysadmin@firewall.loc
# }
# notification_email_from Alexandre.Cassen@firewall.loc
# smtp_server 192.168.200.1
# smtp_connect_timeout 30
router_id LVS_DEVEL_SLAVE
# vrrp_skip_check_adv_addr
# vrrp_strict
# vrrp_garp_interval 0
# vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 99
advert_int 1
mcast_src_ip=192.168.208.155
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.208.100
}
}
virtual_server 192.168.208.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP
real_server 192.168.208.150 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.208.151 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
分別啟動lvs master和slave的keepalived,並且設定為開機自啟動:
systemctl start keepalived
systemctl enable keepalived
此時在lvs master節點檢視IP地址情況:
ip a
結果為:
說明此時VIP在master節點上的ens33網路卡上生成好了。
在lvs master節點檢視路由轉發情況:
ipvsadm -Ln
結果為:
這個結果跟預期的是一樣的。
(4)、關閉lvs master和slave節點上的訪火牆:
systemctl stop firewalld
systemctl disable firewalld
(5)、在nginx伺服器上設定迴環IP:
由於伺服器重啟後設定的迴環IP會失效,所以將設定的內容放在指令碼lvs-rs.sh中,內容如下:
#!/bin/bash
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
sysctl -w net.ipv4.ip_forward=1
ifconfig lo:0 192.168.208.100 broadcast 192.168.208.100 netmask 255.255.255.255 up
route add -host 192.168.208.100 dev lo:0
執行後,檢視IP資訊,可以在lo網路卡中看到VIP的資訊,即:
4、測試
分別開啟Chrome、IE瀏覽器,同時輸入http://192.168.208.100,結果如下:
結果也達到預期的效果的。
現在測試將lvs master節點關閉掉,然後檢視lvs slave節點的IP路由情況:
ip a
結果為:
此時VIP漂移到了lvs slave節點上了。
ipvsadm -Ln
結果為:
此時lvs slave已經可以做路由地址轉發了。
關注我
以你最方便的方式關注我:
微信公眾號: