在大型網站中通常服務端會作集羣,同時利用負載均衡器作負載均衡。這樣有利於將大量的請求分散到各個服務器上,提高網站的響應速度。固然爲了解決單點故障的問題,還會作熱備份方案。這裏演示利用LVS作負載均衡器,同時利用Keepalived保證其高可用,基於LVS的DR模式構建Nginx集羣。html
各個軟件及其版本信息以下:nginx
軟件 | 版本 |
---|---|
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地址。centos
基於上述的環境,部署的架構以下:
瀏覽器
特別注意:bash
因爲是採用DR模式,也即當用戶請求發送到VIP時,LVS會根據所設置的負載均衡算法將請求轉發到具體的Nginx服務器(Real Server)上,而當具體的Nginx服務器處理完後是直接將結果返回給用戶。因此在具體的Nginx服務器是要設置迴環的IP,即在lo網卡上設置VIP的地址。服務器
(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的信息,即:
分別打開Chrome、IE瀏覽器,同時輸入http://192.168.208.100,結果以下:
結果也達到預期的效果的。
如今測試將lvs master節點關閉掉,而後查看lvs slave節點的IP路由狀況:
ip a
結果爲:
此時VIP漂移到了lvs slave節點上了。
ipvsadm -Ln
結果爲:
此時lvs slave已經能夠作路由地址轉發了。
以你最方便的方式關注我:
微信公衆號: