Keepalived簡介
keepalived 是linux下一個輕量級的高可用解決方案,它與HACMP實現功能類似,都可以實現服務或者網絡的高可用,但是又有差別:hacmp是一個專業的、功能完善的高可用軟件,它提供了HA軟件所需的基本功能,比如心跳檢測和資源接管,檢測集羣中的系統服務,在集羣節點間轉移共享ip地址所有者等,hacmp功能強大,但是部署和使用相對麻煩,同時也是商業化軟件,與hacmp相比,keepalived主要是通過虛擬路由冗餘來實現高可用功能,雖然他沒有hacmp功能強大,但是keepalived部署使用相對簡單,所有配置只需要一個配置文件即可完成。
Keepalived是什麼?
Keepalived起初是爲LVS設計的,專門用來監控集羣系統中各個服務節點的狀態,它根據TCP/IP參考模型的第三、第四層、第五層交換機制檢測每個服務節點的狀態,如果某個服務器節點出現異常,或者工作出現故障,Keepalived將檢測到,並將出現的故障的服務器節點從集羣系統中剔除,這些工作全部是自動完成的,不需要人工干涉,需要人工完成的只是修復出現故障的服務節點。後來Keepalived又加入了VRRP的功能,VRRP(VritrualRouterRedundancyProtocol,虛擬路由冗餘協議)出現的目的是解決靜態路由出現的單點故障問題,通過VRRP可以實現網絡不間斷穩定運行,因此Keepalvied一方面具有服務器狀態檢測和故障隔離功能,另外一方面也有HAcluster功能。
健康檢查
和失敗切換
是keepalived的兩大核心功能。所謂的健康檢查,就是採用Tcp三次握手、Icmp請求,Http請求,Udp echo請求等方式對負載均衡器後面的實際的服務器(通常是承載真實業務的服務器)進行保活;而失敗切換主要是應用於配置了主備模式的負載均衡器,利用VRRP維持主備負載均衡器的心跳,當主負載均衡器出現問題時,由備負載均衡器承載對應的業務,從而在最大限度上減少流量損失,並提供服務的穩定性。
Keepalvied的工作原理
Keepalived對服務器運行狀態和故障隔離的工作原理:
Keepalived工作在TCP/IP參考模型的三層、四層、五層(物理層,鏈路層):
網絡層(3):Keepalived通過ICMP協議向服務器集羣中的每一個節點發送一個ICMP數據包(有點類似與Ping的功能),如果某個節點沒有返回響應數據包,那麼認爲該節點發生了故障,Keepalived將報告這個節點失效,並從服務器集羣中剔除故障節點。
傳輸層(4):Keepalived在傳輸層裏利用了TCP協議的端口連接和掃描技術來判斷集羣節點的端口是否正常,比如對於常見的WEB服務器80端口。或者SSH服務22端口,Keepalived一旦在傳輸層探測到這些端口號沒有數據響應和數據返回,就認爲這些端口發生異常,然後強制將這些端口所對應的節點從服務器集羣中剔除掉。
應用層(5):,Keepalived的運行方式也更加全面化和複雜化,用戶可以通過自定義Keepalived工作方式,例如:可以通過編寫程序或者腳本來運行Keepalived,而Keepalived將根據用戶的設定參數檢測各種程序或者服務是否允許正常,如果Keepalived的檢測結果和用戶設定的不一致時,Keepalived將把對應的服務器從服務器集羣中剔除。
VRRP協議與工作原理
在現實的網絡環境中。主機之間的通信都是通過配置靜態路由或者(默認網關)來完成的,而主機之間的路由器一旦發生故障,通信就會失效,因此這種通信模式當中,路由器就成了一個單點瓶頸,爲了解決這個問題,就引入了VRRP協議。
VRRP協議是一種容錯的主備模式的協議,保證當主機的下一跳路由出現故障時,由另一臺路由器來代替出現故障的路由器進行工作,通過VRRP可以在網絡發生故障時透明的進行設備切換而不影響主機之間的數據通信。
虛擬路由器: 虛擬路由器是VRRP備份組中所有路由器的集合,它是一個邏輯概念,並不是正真存在的。從備份組外面看備份組中的路由器,感覺組中的所有路由器就像一個 一樣,可以理解爲在一個組中: 主路由器+所有備份路由器=虛擬路由器。虛擬路由器有一個虛擬的IP地址和MAC地址。主機將虛擬路由器當作默認網關。虛擬MAC地址的格式爲00-00-5E-00-01-{VRID}。通常情況下,虛擬路由器迴應ARP請求使用的是虛擬MAC地址,只有虛擬路由器做特殊配置的時候,纔回應接口的真實MAC地址。
主路由器(MASTER): 虛擬路由器通過虛擬IP對外提供服務,而在虛擬路由器內部同一時間只有一臺物理路由器對外提供服務,這臺提供服務的物理路由器被稱爲主路由器。一般情況下Master是由選舉算法產生,它擁有對外服務的虛擬IP,提供各種網絡功能,如:ARP請求,ICMP數據轉發等。
備份路由器(BACKUP): 虛擬路由器中的其他物理路由器不擁有對外的虛擬IP,也不對外提供網絡功能,僅接受MASTER的VRRP狀態通告信息,這些路由器被稱爲備份路由器。當主路由器失敗時,處於BACKUP角色的備份路由器將重新進行選舉,產生一個新的主路由器進入MASTER角色,繼續提供對外服務,整個切換對用戶來說是完全透明的。
工作過程
路由器使用VRRP 功能後,會根據優先級確定自己在備份組中的角色。優先級高的路由器成爲Master 路由器,優先級低的成爲Backup 路由器。Master 擁有對外服務的虛擬IP,提供各種網絡功能,並定期發送VRRP 報文,通知備份組內的其他設備自己工作正常;Backup 路由器只接收Master 發來的報文信息,用來監控Master 的運行狀態。當Master 失效時,Backup 路由器進行選舉,優先級高的Backup 將成爲新的Master 。
在搶佔方式下,當Backup 路由器收到VRRP 報文後,會將自己的優先級與報文中的優先級進行比較。如果大於通告報文中的優先級,則成爲Master 路由器;否則將保持Backup狀態;
在非搶佔方式下,只要Master 路由器沒有出現故障,備份組中的路由器始終保持Master 或Backup 狀態,Backup 路由器即使隨後被配置了更高的優先級也不會成爲Master 路由器;
如果Backup 路由器的定時器超時後仍未收到Master 路由器發送來的VRRP報文,則認爲Master 路由器已經無法正常工作,此時Backup 路由器會認爲自己是Master 路由器,並對外發送VRRP報文。備份組內的路由器根據優先級選舉出Master 路由器,承擔報文的轉發功能。
LVS-DR負載均衡+Keepalived高可用實戰
使用Keepalived爲LVS調度器提供高可用功能,防止調度器單點故障,爲用戶提供Web服務。
LVS1調度器真實IP地址爲192.168.2.130
LVS2調度器真實IP地址爲192.168.2.132
服務器VIP地址設置爲192.168.2.150/32
真實Web服務器地址分別爲192.168.2.128、192.168.2.129
使用加權輪詢調度算法,真實web服務器權重不同
環境介紹:
LVS調度服務器1:192.168.2.130/24
LVS調度服務器2:192.168.2.132/24
真實服務器1:192.168.2.128/24
lo:0:192.168.2.150/32
真實服務器2:192.168.2.129/24
lo:0:192.168.2.150/32
客戶端:192.168.2.135/24
一、後端真實服務器配置
1.兩臺後端服務器128/129分別安裝Nginx
[root@localhost ~]# wget http://nginx.org/download/nginx-1.16.1.tar.gz
[root@localhost ~]# yum -y install gcc pcre-devel openssl-devel
[root@localhost ~]# useradd -s /sbin/nologin nginx //創建禁止登陸解釋器的用戶(爲了安全)
[root@localhost ~]# id nginx
uid=1001(nginx) gid=1001(nginx) 組=1001(nginx)
[root@localhost ~]# tar -xf nginx-1.16.1.tar.gz
[root@localhost ~]# cd nginx-1.16.1
[root@localhost nginx-1.16.1]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module
--prefix=/usr/local/nginx //指定安裝路徑
--user=nginx //指定用戶
--group=nginx //指定組
--with-http_ssl_module //安裝ssl模塊,開啓其中的SSL加密功能(需要什麼模塊就安裝什麼模塊)
......
......
nginx modules path: "/usr/local/nginx/modules"
nginx configuration prefix: "/usr/local/nginx/conf"
nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
nginx pid file: "/usr/local/nginx/logs/nginx.pid"
nginx error log file: "/usr/local/nginx/logs/error.log"
nginx http access log file: "/usr/local/nginx/logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"
[root@localhost nginx-1.16.1]# make && make install //編譯並且安裝
......
'/usr/local/nginx/conf/scgi_params.default'
test -f '/usr/local/nginx/conf/nginx.conf' \
|| cp conf/nginx.conf '/usr/local/nginx/conf/nginx.conf'
cp conf/nginx.conf '/usr/local/nginx/conf/nginx.conf.default'
test -d '/usr/local/nginx/logs' \
|| mkdir -p '/usr/local/nginx/logs'
test -d '/usr/local/nginx/logs' \
|| mkdir -p '/usr/local/nginx/logs'
test -d '/usr/local/nginx/html' \
|| cp -R html '/usr/local/nginx'
test -d '/usr/local/nginx/logs' \
|| mkdir -p '/usr/local/nginx/logs'
make[1]: 離開目錄“/root/nginx-1.16.1”
[root@localhost ~]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.16.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module
[root@test2 ~]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.16.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module
2.創建測試頁面
[root@localhost ~]# echo "I am 192.168.2.128" > /usr/local/nginx/html/index.html
[root@test2 ~]# echo "I am 192.168.2.129" > /usr/local/nginx/html/index.html
3.啓動Nginx
[root@localhost nginx-1.16.1]# /usr/local/nginx/sbin/nginx
[root@localhost nginx-1.16.1]# netstat -antulp | grep :80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 6079/nginx: master
或者[root@localhost nginx-1.16.1]# netstat -antulp | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 6079/nginx: master
3.關閉防火牆與selinux
兩臺後端服務器都需要操作。
[root@test2 ~]# systmctl stop firewalld
[root@test2 ~]# setenforce 0
[root@test2 ~]# getenforce
Disabled
[root@test2 ~]# vim /etc/sysconfig/selinux //永久關閉selinux
SELINUX=disabled
4.後端服務器配置VIP地址
注意:這裏的子網掩碼必須是32(也就是全255),網絡地址與IP地址一樣,廣播地址與IP地址也一樣。
-後端128服務器
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@localhost network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0 //網卡名稱lo:0
IPADDR=192.168.2.150 //這裏爲VIP地址
NETMASK=255.255.255.255 //必須是32位掩碼(即全255)
NETWORK=192.168.2.150
BROADCAST=192.168.2.150 //爲VIP地址
ONBOOT=yes
NAME=lo:0
[root@localhost ~]# systemctl restart network
[root@localhost ~]# ifconfig lo:0 //查看配置的VIP地址
lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 192.168.2.150 netmask 255.255.255.255
loop txqueuelen 1000 (Local Loopback)
-後端129服務器
[root@test2 ~]# cd /etc/sysconfig/network-scripts/
[root@test2 network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@test2 network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0 //網卡名稱lo:0
IPADDR=192.168.2.150 //這裏爲VIP地址
NETMASK=255.255.255.255 //必須是32位掩碼(即全255)
NETWORK=192.168.2.150
BROADCAST=192.168.2.150 //爲VIP地址
ONBOOT=yes
NAME=lo:0
[root@test2 ~]# systemctl restart network
[root@test2 ~]# ifconfig lo:0 //查看配置的VIP地址
lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 192.168.2.150 netmask 255.255.255.255
loop txqueuelen 1000 (Local Loopback)
以上是防止地址衝突的問題:因爲後端服務器也配置與調度器一樣的VIP地址,默認肯定會出現地址衝突。
5.後端服務器配置sysctl.conf文件
-後端128服務器
[root@localhost network-scripts]# cat >> /etc/sysctl.conf <<EOF
> net.ipv4.conf.all.arp_ignore = 1
> net.ipv4.conf.lo.arp_ignore = 1
> net.ipv4.conf.lo.arp_announce = 2
> net.ipv4.conf.all.arp_announce = 2
> EOF
[root@localhost network-scripts]# sysctl -p
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1
net.ipv4.ip_forward = 1
以下4行配置是新添加的:
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
[root@localhost network-scripts]# systemctl restart NetworkManager
[root@localhost network-scripts]# systemctl restart network
-後端129服務器
[root@test2 network-scripts]# cat >> /etc/sysctl.conf <<EOF
> net.ipv4.conf.all.arp_ignore = 1
> net.ipv4.conf.lo.arp_ignore = 1
> net.ipv4.conf.lo.arp_announce = 2
> net.ipv4.conf.all.arp_announce = 2
> EOF
[root@localhost network-scripts]# sysctl -p
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1
net.ipv4.ip_forward = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
[root@test2 network-scripts]# systemctl restart NetworkManager
[root@test2 network-scripts]# systemctl restart network
以上配置的含義:
當有arp廣播問誰是192.168.2.150(VIP)時,本機忽略該ARP廣播,不做任何迴應,且本機不要向外宣告自己的lo迴環地址是192.168.2.150.
二、LVS負載均衡調度器配置
1.兩臺調度器安裝Ipvsadm與Keepalived軟件
Keepalived運行原理:
- Keepalived檢測每個服務器節點狀態。
- 服務器節點異常或工作出現故障,Keepalived將故障節點從集羣系統中剔除。
- 故障節點恢復後,Keepalived再將其加入到集羣系統中。
- 所有工作自動完成,無需人工干預。
[root@test3 ~]# yum -y install ipvsadm
[root@test3 ~]# ipvsadm -C
[root@test3 ~]# yum -y install keepalived
[root@test3 ~]# systemctl enable keepalived
[root@VOS3000 ~]# yum -y install ipvsadm
[root@VOS3000 ~]# ipvsadm -C
[root@VOS3000 ~]# yum -y install keepalived
[root@VOS3000 ~]# systemctl enable keepalived
2.修改兩臺LVS調度器的Keepalived配置
----LVS1調度器-----
[root@test3 ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak //備份原keepalived配置文件
[root@test3 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc //設置報警收件人郵箱,可以定義多個
}
notification_email_from Alexandre.Cassen@firewall.loc //設置發件人
smtp_server 127.0.0.1 //定義郵件服務器
smtp_connect_timeout 30 //連接超時時間
router_id LVS1 //設置路由ID號(需修改)
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 { //每一個vrrp_instance就定義一個虛擬路由器
state MASTER //由初始狀態狀態轉換爲master狀態(需修改)
interface ens33 //定義網絡接口(根據自己的網卡名稱設置,主備可以不同)
virtual_router_id 51 //虛擬路由的id號,一般不能大於255(主輔VRID號必須一致)(需修改)
priority 100 //服務器優先級(需修改)
advert_int 1 //初始化通告
authentication { //認證機制
auth_type PASS
auth_pass 1111 //密碼(主輔服務器密碼必須一致)
}
virtual_ipaddress { //虛擬地址VIP(需修改)
192.168.2.150
}
}
virtual_server 192.168.2.150 80 { //設置ipvsadm的VIP規則(需修改)
delay_loop 6
lb_algo wrr //設置LVS調度算法爲WRR(需修改)
lb_kind DR //設置LVS的模式爲DR(需修改)
#persistence_timeout 50 //註釋掉的作用是保持連接,開啓後,客戶端在一定時間內始終訪問相同服務器(超時時間)
protocol TCP
real_server 192.168.2.128 80 { //設置後端web服務器真實IP(需修改)
weight 1 //設置權重爲1(需修改)
TCP_CHECK { //對後臺real_server做健康檢查
connect_timeout 3 //等待超時時間(訪問時等待3秒)
nb_get_retry 3 //失敗後嘗試次數(訪問失敗後再嘗試3次訪問)
delay_before_retry 3 //每隔多久執行一次(每隔3秒執行一次)
}
}
real_server 192.168.2.129 80 { //設置後端web服務器真實IP(需修改)
weight 2 //設置權重爲2(需修改)
TCP_CHECK { //對後臺real_server做健康檢查
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
(以下配置刪掉)
[root@test3 ~]# systemctl start keepalived //啓動keepalived服務
[root@test3 ~]# ipvsadm -Ln //查看自動配置的LVS規則
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.2.150:80 wrr
-> 192.168.2.128:80 Route 1 0 0
-> 192.168.2.129:80 Route 2 0 0
[root@test3 ~]# ip a s ens33 //查看主MASTER服務器的VIP地址
//因爲我的主MASTER服務器的網卡名稱是ens33,不是eth0,在keepalived中網卡處配置即可,主備keepalived網卡配置名稱可以不同。
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:53:71:a2 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.130/24 brd 192.168.2.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.2.150/32 scope global ens33 //VIP地址
valid_lft forever preferred_lft forever
inet6 fe80::2c27:a02c:731a:2219/64 scope link noprefixroute
valid_lft forever preferred_lft forever
--》可以看到主MASTER服務器上的VIP地址
[root@test3 ~]# iptables -F //因爲啓動keepalived後會自動配置一條iptables規則,現在清除規則
-------------------------------------------------------
----LVS2調度器-----
[root@VOS3000 ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@VOS3000 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS2 //路由ID(與LVS1調度器不同)
}
vrrp_instance VI_1 {
state BACKUP //從服務器爲BACKUP(與LVS1調度器不同)
interface eth0
virtual_router_id 51 //主輔VRID號必須一致
priority 50 //優先級(與LVS1調度器不同)
advert_int 1
authentication {
auth_type PASS
auth_pass 1111 //主輔服務器密碼必須一致
}
virtual_ipaddress {
192.168.2.150 //設置VIP
}
}
virtual_server 192.168.2.150 80 { //設置ipvsadm的VIP規則(需修改)
delay_loop 6
lb_algo wrr //設置LVS調度算法爲WRR(需修改)
lb_kind DR //設置LVS的模式爲DR(需修改)
#persistence_timeout 50 //註釋掉的作用是保持連接,開啓後,客戶端在一定時間內始終訪問相同服務器(超時時間)
protocol TCP
real_server 192.168.2.128 80 { //設置後端web服務器真實IP(需修改)
weight 1 //設置權重爲1(需修改)
TCP_CHECK { //對後臺real_server做健康檢查
connect_timeout 3 //等待超時時間(訪問時等待3秒)
nb_get_retry 3 //失敗後嘗試次數(訪問失敗後再嘗試3次訪問)
delay_before_retry 3 //每隔多久執行一次(每隔3秒執行一次)
}
}
real_server 192.168.2.129 80 { //設置後端web服務器真實IP(需修改)
weight 2 //設置權重爲2(需修改)
TCP_CHECK { //對後臺real_server做健康檢查
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
[root@VOS3000 ~]# systemctl start keepalived
[root@VOS3000 ~]# ipvsadm -Ln //查看LVS規則
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.2.150:80 wrr
-> 192.168.2.128:80 Route 1 0 0
-> 192.168.2.129:80 Route 2 0 0
[root@VOS3000 ~]# ip a s eth0 //查看VIP配置
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:89:4a:52 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.132/24 brd 192.168.2.255 scope global eth0
inet6 fe80::20c:29ff:fe89:4a52/64 scope link
valid_lft forever preferred_lft forever
--》可以看到備用BACKUP服務器上現在沒有VIP地址
[root@VOS3000 ~]# iptables -F
三、客戶端測試
[root@test5 ~]# ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.2.135 netmask 255.255.255.0 broadcast 192.168.2.255
inet6 fe80::846e:50e9:7d73:abe7 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:58:df:c9 txqueuelen 1000 (Ethernet)
RX packets 890 bytes 82166 (80.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 343 bytes 30282 (29.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.128
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.128
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.128
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.128
可以看到每當我們執行一次curl命令(相當於刷新一次網頁),調度器都會根據權重值輪詢到不同的後端真實服務器。
四、故障模擬
keepalived高可用故障轉移的原理:
Keepalived 高可用服務之間的故障切換轉移,是通過 VRRP (Virtual Router Redundancy Protocol ,虛擬路由器冗餘協議)來實現的。
在 Keepalived 服務正常工作時,主 Master 節點會不斷地向備節點發送(多播的方式)心跳消息,用以告訴備 Backup 節點自己還活看,當主 Master 節點發生故障時,就無法發送心跳消息,備節點也就因此無法繼續檢測到來自主 Master 節點的心跳了,於是調用自身的接管程序,接管主 Master 節點的 IP 資源及服務。而當主 Master 節點恢復時,備 Backup 節點又會釋放主節點故障時自身接管的IP資源及服務,恢復到原來的備用角色。
1.模擬主LVS負載均衡調度器故障
(宕掉)
[root@test3 ~]# ip a s ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:53:71:a2 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.130/24 brd 192.168.2.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.2.150/32 scope global ens33 //VIP地址
valid_lft forever preferred_lft forever
inet6 fe80::2c27:a02c:731a:2219/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@test3 ~]# systemctl stop keepalived
[root@test3 ~]# ip a s ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:53:71:a2 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.130/24 brd 192.168.2.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::2c27:a02c:731a:2219/64 scope link noprefixroute
valid_lft forever preferred_lft forever
--主LVS調度器故障,VIP漂移至備用LVS調度器
2.客戶端測試
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.128
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.128
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129
可以看到在主LVS調度器宕掉之後,VIP地址漂移至備用LVS調度器上,服務器正常工作。
3.查看備LVS調度器上VIP漂移情況
[root@VOS3000 ~]# ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:89:4a:52 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.132/24 brd 192.168.2.255 scope global eth0
inet 192.168.2.150/32 scope global eth0 //VIP地址成功漂移
inet6 fe80::20c:29ff:fe89:4a52/64 scope link
valid_lft forever preferred_lft forever
主 Master 節點發生故障,無法發送心跳消息,備節點無法繼續檢測到來自主 Master 節點的心跳,於是調用自身的接管程序,接管主 Master 節點的 IP 資源及服務。
4.模擬後端真實Web服務器128故障
[root@localhost ~]# /usr/local/nginx/sbin/nginx -s stop
5.查看備LVS調度器上集羣狀態
[root@VOS3000 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.2.150:80 wrr
-> 192.168.2.129:80 Route 2 0 0
可以看到服務器節點異常或工作出現故障,Keepalived將故障節點從集羣系統中剔除。
6.客戶端訪問
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129
在後端真實服務器128宕機後,調度器就只會輪詢到後端服務器129上,服務器正常工作。
7.主負載均衡LVS調度器恢復
工作
[root@test3 ~]# systemctl start keepalived
[root@test3 ~]# ipvsadm -Ln //查看集羣狀態
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.2.150:80 wrr
-> 192.168.2.129:80 Route 2 0 0
[root@test3 ~]# ip a s ens33 //查看VIP
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:53:71:a2 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.130/24 brd 192.168.2.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.2.150/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::2c27:a02c:731a:2219/64 scope link noprefixroute
valid_lft forever preferred_lft forever
可以看到在主LVS調度器恢復工作後,備 Backup 節點又會釋放主節點故障時自身接管的IP資源及服務,恢復到原來的備用角色。
8.備LVS調度器上VIP地址釋放
[root@VOS3000 ~]# ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:89:4a:52 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.132/24 brd 192.168.2.255 scope global eth0
inet6 fe80::20c:29ff:fe89:4a52/64 scope link
valid_lft forever preferred_lft forever
9.後端服務器128恢復
工作
[root@localhost ~]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
[root@localhost ~]# ss -antulp | grep :80
tcp LISTEN 0 128 *:80 *:* users:(("nginx",pid=3016,fd=6),("nginx",pid=3015,fd=6))
10.查看集羣狀態,客戶端測試訪問
[root@test3 ~]# ipvsadm -Ln //查看集羣狀態
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.2.150:80 wrr
-> 192.168.2.128:80 Route 1 0 0
-> 192.168.2.129:80 Route 2 0 0
-客戶端測試
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.128
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.128
[root@test5 ~]# curl http://192.168.2.150:80
I am 192.168.2.129
可以看到在故障節點(後端服務器128)恢復後,Keepalived自動將其加入到集羣系統中,全程無需人工干預。
↓↓↓↓↓↓
最近剛申請了個微信公衆號,上面也會分享一些運維知識,大家點點發財手關注一波,感謝大家。 【原創公衆號】:非著名運維 【福利】:公衆號回覆 “資料” 送運維自學資料大禮包哦!