一、概述
本實驗基於CentOS7.6 操作系統,總共5台設備,兩台做后端web服務器,兩台做lvs和keepalived,一台做客戶機,實驗以LVS(DR)+Keepalived和LVS(NAT)+Keepalived兩種模式來做雙機熱備份,實驗環境拓撲如下圖所示:
從架構可以看出來,從用戶的角度來說,會直接訪問192.168.31.200,也就是說不管系統如何設計要保證此ip的可用性,
從架構師的角度考慮:
用戶訪問192.168.31.200,這是一個虛擬iP,用戶不關心內部如何協調。
我們使用 192.168.31.54 作為主機 Master機器,然后使用keepalived 技術配置 HA(high avilable)配置高可用行,也就是說如果 分發的機器Master宕機了,keepalive會自動轉到 backup機器,
這就是HA配置,保證master即使宕機了,也不影響轉發;
master機器負責把用戶的請求轉發到 真實的機器, web1和web2,他們會按照一定的輪訓機制,訪問,如果web1宕機,master會自動轉發到web2;
我們在兩台負載均衡的機器上面,配置keepalived保證分發機器的高可用行HA;
環境說明
系統的 IP配置如下:
服務器名 | 主機名 | IP地址 | 虛擬設備名 | 虛擬IP |
Director Server | lvs1 | 192.168.31.54 | enp0s3:0 | 192.168.31.200 |
Backup Server | lvs2 | 192.168.31.51 | enp0s3:0 | 192.168.31.200 |
Real Server1 | web1 | 192.168.31.113 | lo:0 | 192.168.31.200 |
Real Server2 | web2 | 192.168.31.150 | lo:0 | 192.168.31.200 |
請確保4台服務器關閉了防火牆
systemctl stop firewalld setenforce 0
二、web服務器配置
安裝nginx
登錄主機web1和web2
安裝nginx
# 安裝Nginx源 yum -y install epel-release # 安裝Nginx yum -y install nginx # 啟動Nginx服務 systemctl start nginx # 加入開機自啟 systemctl enable nginx # 備份原有默認頁面 mv /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html_bak
登錄主機web1,修改默認頁面
vi /usr/share/nginx/html/index.html
清空內容,完整內容如下:
This is Server 111
登錄主機web2,修改默認頁面
vi /usr/share/nginx/html/index.html
清空內容,完整內容如下:
This is Server 222
訪問頁面
訪問web1
訪問web2
三、LVS+Keepalive
安裝
登錄主機lvs1和lvs2
安裝keepalived和lvs管理工具
yum -y install keepalived* ipvsadm
加載內核模塊
modprobe ip_vs
備份配置文件
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf_bak
配置
登錄主機lvs1
vi /etc/keepalived/keepalived.conf
內容如下:
global_defs { router_id LVS_TEST #服務器名字 } vrrp_instance VI_1 { state MASTER #配置主備,備用機此配置項為BACKUP interface enp0s3 #指定接口 virtual_router_id 51 #指定路由ID,主備必須一樣 priority 101 #設置優先級,主略高於備份 advert_int 1 #設置檢查時間 authentication { auth_type PASS #設置驗證加密方式 auth_type 1234 #設置驗證密碼 } virtual_ipaddress { 192.168.31.200 } } virtual_server 192.168.31.200 80 { delay_loop 3 #健康檢查時間 lb_algo rr #LVS調度算法 lb_kind DR #LVS工作模式 !persistence 60 #是否保持連接,!不保持 protocol TCP #服務采用TCP協議 real_server 192.168.31.113 80 { weight 1 #權重 TCP_CHECK { #TCP檢查 connect_port 80 #檢查端口80 connect_timeout 3 #超時時間3秒 nb_get_retry 3 #重試次數3次 delay_before_retry 4 #重試間隔4秒 } } real_server 192.168.31.150 80 { weight 1 TCP_CHECK { connect_port 80 connect_timeout 3 nb_get_retry 3 delay_before_retry 4 } } }
請根據實際情況修改紅色部分
說明:
interface enp0s3 表示本地網卡為enp0s3
192.168.31.200 表示虛擬ip
重啟keepalived服務
systemctl restart keepalived
systemctl enable keepalived
驗證虛擬IP是否生效
# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 08:00:27:04:34:88 brd ff:ff:ff:ff:ff:ff inet 192.168.31.54/24 brd 192.168.31.255 scope global noprefixroute dynamic enp0s3 valid_lft 31218sec preferred_lft 31218sec inet 192.168.31.200/32 scope global enp0s3 valid_lft forever preferred_lft forever inet6 fe80::a66d:efde:f19f:9882/64 scope link noprefixroute valid_lft forever preferred_lft forever
可以發現虛擬ip已經有了
登錄主機lvs2
vi /etc/keepalived/keepalived.conf
LVS2的配置同LVS1,只需將配置文件中下面兩處修改即可
內容如下:
global_defs { router_id LVS_TEST #服務器名字 } vrrp_instance VI_1 { state BACKUP #配置主備,備用機此配置項為BACKUP interface enp0s3 #指定接口 virtual_router_id 51 #指定路由ID,主備必須一樣 priority 100 #設置優先級,主略高於備份 advert_int 1 #設置檢查時間 authentication { auth_type PASS #設置驗證加密方式 auth_type 1234 #設置驗證密碼 } virtual_ipaddress { 192.168.31.200 } } virtual_server 192.168.31.200 80 { delay_loop 3 #健康檢查時間 lb_algo rr #LVS調度算法 lb_kind DR #LVS工作模式 !persistence 60 #是否保持連接,!不保持 protocol TCP #服務采用TCP協議 real_server 192.168.31.113 80 { weight 1 #權重 TCP_CHECK { #TCP檢查 connect_port 80 #檢查端口80 connect_timeout 3 #超時時間3秒 nb_get_retry 3 #重試次數3次 delay_before_retry 4 #重試間隔4秒 } } real_server 192.168.31.150 80 { weight 1 TCP_CHECK { connect_port 80 connect_timeout 3 nb_get_retry 3 delay_before_retry 4 } } }
重啟keepalived服務
systemctl restart keepalived
systemctl enable keepalived
查看虛擬IP
# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 08:00:27:d4:0e:fb brd ff:ff:ff:ff:ff:ff inet 192.168.31.51/24 brd 192.168.31.255 scope global noprefixroute dynamic enp0s3 valid_lft 31079sec preferred_lft 31079sec inet6 fe80::8cdb:32f0:4bbd:9294/64 scope link noprefixroute valid_lft forever preferred_lft forever inet6 fe80::a66d:efde:f19f:9882/64 scope link tentative noprefixroute dadfailed valid_lft forever preferred_lft forever
注意:此時是沒有的。因為master和bakcup只能同時存在一個。只有當master異常時,bakcup才會出現虛擬ip。
登錄主機lvs1,關掉主服務器的keepalived服務
systemctl stop keepalived
登錄主機lvs2,驗證備份的keepalived是否生效
# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 08:00:27:d4:0e:fb brd ff:ff:ff:ff:ff:ff inet 192.168.31.51/24 brd 192.168.31.255 scope global noprefixroute dynamic enp0s3 valid_lft 30713sec preferred_lft 30713sec inet 192.168.31.200/32 scope global enp0s3 valid_lft forever preferred_lft forever inet6 fe80::8cdb:32f0:4bbd:9294/64 scope link noprefixroute valid_lft forever preferred_lft forever inet6 fe80::a66d:efde:f19f:9882/64 scope link tentative noprefixroute dadfailed valid_lft forever preferred_lft forever
四、web服務器綁定VIP
2台web服務器為lo:0綁定VIP地址、抑制ARP廣播
登錄主機web1,web2,編寫以下腳本文件realserver.sh
vi /etc/init.d/realserver.sh
內容如下:
#!/bin/bash #description: Config realserver VIP=192.168.31.200 #/etc/rc.d/init.d/functions case "$1" in start) /sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP /sbin/route add -host $VIP dev lo:0 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 -p >/dev/null 2>&1 echo "RealServer Start OK" ;; stop) /sbin/ifconfig lo:0 down /sbin/route del $VIP >/dev/null 2>&1 echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce echo "RealServer Stoped" ;; *) echo "Usage: $0 {start|stop}" exit 1 esac exit 0
請根據實際情況,修改VIP地址。
登錄主機web1,web2,分別執行腳本
bash /etc/init.d/realserver.sh
執行完了之后,驗證一下 使用ifconfig 你會發現 回環地址的網卡會多出一個lo:0的 網卡;
# ifconfig lo:0 lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 192.168.31.200 netmask 255.255.255.255 loop txqueuelen 1000 (Local Loopback)
登錄lvs1,查看VIP是否成功映射
# ipvsadm -L IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP MiWiFi-R3P-srv:http rr -> 192.168.31.113:http Route 1 0 0 -> 192.168.31.150:http Route 1 0 0
五、測試可用性
測試keepalived的監控檢測
訪問虛擬ip
可以看到,現在是訪問的web1
登錄主機web1,關閉nginx進程。
nginx -s stop
刷新頁面
可以發現切換到web2了。
登錄主機web1,啟動Nginx
nginx
刷新頁面
發現切換到web1了。
測試 keepalived 的HA特性
登錄主機lvs1,此時的vip是在master節點上的。關閉keepalived服務
systemctl stop keepalived
查看vip,發現已經沒有了
# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 08:00:27:04:34:88 brd ff:ff:ff:ff:ff:ff inet 192.168.31.54/24 brd 192.168.31.255 scope global noprefixroute dynamic enp0s3 valid_lft 42290sec preferred_lft 42290sec inet6 fe80::a66d:efde:f19f:9882/64 scope link noprefixroute valid_lft forever preferred_lft forever
登錄主機lvs2,查看vip,發現已經出現了。
# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 08:00:27:d4:0e:fb brd ff:ff:ff:ff:ff:ff inet 192.168.31.51/24 brd 192.168.31.255 scope global noprefixroute dynamic enp0s3 valid_lft 42248sec preferred_lft 42248sec inet 192.168.31.200/32 scope global enp0s3 valid_lft forever preferred_lft forever inet6 fe80::8cdb:32f0:4bbd:9294/64 scope link noprefixroute valid_lft forever preferred_lft forever inet6 fe80::a66d:efde:f19f:9882/64 scope link tentative noprefixroute dadfailed valid_lft forever preferred_lft forever
此時,刷新頁面,依然訪問正常。
說明keepalived的HA特性是正常的。
本文參考鏈接:
https://blog.csdn.net/weixin_42342456/article/details/86100090