apache+Keepalived集群實戰
- 2019 年 10 月 6 日
- 筆記
keepalived 是一個類似於layer3, 4 & 5 交換機制的軟體,也就是我們平時說的第3 層、第4 層和第5層交換。Keepalived 的作用是檢測web 伺服器的狀態,如果有一台web 伺服器死機,或工作出現故障,Keepalived 將檢測到,並將有故障的web 伺服器從系統中剔除,當web 伺服器工作正常後Keepalived 自動將web 伺服器加入到伺服器群中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的web 伺服器。
拓展:OSI七層

拓展:OSI七層相關協議

Keepalived工作原理
Layer3,4&5 工作在IP/TCP 協議棧的IP 層,TCP 層,及應用層,。
Layer3:Keepalived 使用Layer3 的方式工作式時,Keepalived 會定期向伺服器群中的伺服器發送一個ICMP 的數據包(既我們平時用的Ping 程式), 如果發現某台服務的IP 地址沒有激活,Keepalived 便報告這台伺服器失效,並將它從伺服器群中剔除,這種情況的典型例子是某台伺服器被非法關機。Layer3 的方式是以伺服器的IP 地址是否有效作為伺服器工作正常與否的標準。
Layer4:主要以TCP 埠的狀態來決定伺服器工作正常與否。如web server 的服務埠一般是80,如果Keepalived 檢測到80 埠沒有啟動,則Keepalived 將把這台伺服器從伺服器群中刪除。
Layer5:Layer5 就是工作在具體的應用層了,比Layer3,Layer4 要複雜一點,在網路上佔用的頻寬也要大一些。Keepalived 將根據用戶的設定檢查伺服器程式的運行是否正常,如果與用戶的設定不相符,則Keepalived 將把伺服器從伺服器群中剔除。
Keepalived的作用與構建
1.管理VIP VIP 會在LVS 之間漂移
2.監控LVS分發器
運行在主分發的Keepalived 會以組播的形式向網路中宣告自己,即主分發器還活著,備用節點能收到。當備用節點,在一個時間單位中收不到組播,備用節點會認為主LVS 掛了,開始接手主分發器工作,把VIP 配給自己。
3.管理RS
Keepalived 會每隔一個時間段去做一次類似於訪問的操作如:
探針:elinks http://172.17.0.34 –dump
經典高可用web架構: LVS+keepalived+nginx+apache+php+eaccelerator(+nfs可選)
http://www.keepalived.org/

下載:http://www.keepalived.org/download.html

使用Keepalived構建LVS-DR模式的高可用集群

安裝ipvsadm
yum install ipvsadm
安裝完成不需要做任何配置,啟動方式由keepalived控制
安裝keepalived
第一種安裝方法:
yum install –y keepalived
查看安裝路徑:
rpm -ql keepalived-1.3.5-1.el7.x86_64

拓展:VRRP/HSRP
虛擬路由冗餘協議(Virtual Router Redundancy Protocol,簡稱VRRP)是由IETF提出的解決區域網中配置靜態網關出現單點失效現象的路由協議。使用組播方式通訊。
VRRP是一種路由容錯協議,也可以叫做備份路由協議。一個區域網絡內的所有主機都設置預設路由(默認網關),當網內主機發出的目的地址不在本網段時,報文將被通過預設路由發往外部路由器,從而實現了主機與外部網路的通訊。當預設路由器down掉(即埠關閉)之後,內部主機將無法與外部通訊,如果路由器設置了VRRP時,那麼這時,虛擬路由將啟用備份路由器,從而實現全網通訊。
工作流程如圖:

HSRP:熱備份路由器協議(HSRP)的設計目標是支援特定情況下IP 流量失敗轉移不會引起混亂、並允許主機使用單路由器,以及即使在實際第一跳路由器使用失敗的情形下仍能維護路由器間的連通性。換句話說,當源主機不能動態知道第一跳路由器的IP 地址時,HSRP 協議能夠保護第一跳路由器不出故障,是CISCO的私有協議!該協議中含有多台路由器,對應一個HSRP組。該組中只有一個路由器承擔轉發用戶流量的職責,這就是活動路由器。當活動路由器失效後,備份路由器將承擔該職責,成為新的活動路由器。這就是熱備份的原理。
HSRP和VRRP的區別:HSRP是cisco的專有協議.在Cisco的HSRP之後,internet工程任務小組(internet engineering task force,IETF)也制定一種路由冗餘協議:虛擬路由冗餘協議(Virtual Router Redundancy Protocol,VRRP),目前包括Csico在內的主流廠商均在其產品中支援VRRP協議!VRRP和HSRP也有很多不同。VRRP和HSRP 的一個主要的區別在安全方面:它允許參與VRRP組的設備間建立認證機制。另一個主要區別:VRRP中只有三種狀態----初始狀態(Initialize)、主狀態(Master)、備份狀態(Backup),而HSRP 有六種狀態。其餘在報文類型、報文格式和通過TCP而非UDP發送的報文方面也有所不同
[root@localhost ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 02:00:08:5b:00:76 brd ff:ff:ff:ff:ff:ff
inet 172.17.1.150/20 brd 172.17.15.255 scope global eth0
配置Keepalived+LVS-DR模式
在這種模式下,虛擬IP 在某時刻只能屬於某一個節點,另一個節點作為備用節點存在。當主節點不可用時,備用節點接管虛擬IP,提供正常服務。
配置參數:節點172.17.1.150(主節點);節點172.17.1.151(備用節點) ; 虛擬IP 172.17.1.160對外提供服務的IP。要求默認情況下由節點172.17.1.150提供服務,當節點172.17.1.150 不可用時,由節點172.17.1.151 提供服務(即虛擬IP 漂移至節點172.17.1.151)。
主節點172.17.1.150配置
[root@localhost ~]# cp keepalived.conf keepalived.conf.bak
[root@localhost ~]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
root@localhost #默認三個地址,修改可用地址
}
notification_email_from root@localhost
smtp_server localhost
smtp_connect_timeout 30
router_id LVS_DEVEL #標識當前節點名字,兩個節點的此項需要不相同。
}
vrrp_instance apache {
state MASTER #指定A 節點為主節點備用節點上設置為BACKUP 即可
interface eth0 #綁定虛擬IP 的網路介面
virtual_router_id 51 #VRRP 組名,兩個節點的設置必須一樣,以指明各個節點屬於同一VRRP 組
priority 100 #主節點的優先順序(1-254 之間),備用節點必須比主節點優先順序低
advert_int 1 #組播資訊發送間隔,兩個節點設置必須一樣
authentication { #設置驗證資訊,兩個節點必須一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.17.1.160 #指定虛擬IP, 兩個節點設置必須一樣
}
}
#類似添加虛擬一個服務ipvsadm -A -t 192.168.1.70:80 -s rr
virtual_server 172.17.1.160 80 {
delay_loop 6 #Keepalived 多長時間監測一次RS
lb_algo rr #分發演算法
lb_kind DR #DR 模式
nat_mask 255.255.255.0
# persistence_timeout 50
protocol TCP
real_server 172.17.1.152 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 172.17.1.153 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
[root@localhost ~]# systemctl restart keepalived
[root@localhost ~]# systemctl enable keepalived
[root@localhost ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.17.1.160:80 rr
#註:沒有看到realserver,是因為兩台realserver 還沒有開啟httpd 服務。
備用節點172.17.1.151配置
安裝ipvsadm
yum install –y ipvsadm
安裝keepalived
第一種安裝方法:
yum install –y keepalived
和主節點172.17.1.150配置差不多相同,直接從172.17.1.150上scp拷貝配置文件
[root@localhost ~]# scp /etc/keepalived/keepalived.conf [email protected]:/etc/keepalived/
複製過來之後,還要做一定的修改:
[root@localhost ~]# vim /etc/keepalived/keepalived.conf
註:紅色為改動項值
vrrp_instance apache {
state BACKUP #當前LVS 狀態為備用分發器
interface ens32
virtual_router_id 51
priority 90 #LVS 優先順序,備的要比主的小
……
啟動:
[root@localhost ~]# systemctl restart keepalived
[root@localhost ~]# systemctl enable keepalived
測試LVS IP飄移
[root@localhost ~]# systemctl stop keepalived
去從的機器查看ip是否漂移過來
[root@localhost ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 02:00:25:30:04:01 brd ff:ff:ff:ff:ff:ff
inet 172.17.1.151/20 brd 172.17.15.255 scope global eth0
inet 172.17.1.160/32 scope global eth0
[root@localhost ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.17.1.160:80 rr
-> 172.17.1.152:80 Route 1 0 0
-> 172.17.1.153:80 Route 1 0 0
#看到172.17.1.160飄移過來了,就證明一切正常了
配置RS1
[root@localhost ~]# vim /etc/init.d/lvsrsdr #寫一個配置RS的腳本
#!/bin/bash
#description:start relserver
VIP=172.17.1.160
source /etc/init.d/functions #載入環境變數(可以載入所有的環境變數)
case $1 in
start)
echo ' start LVS of REALServer'
/sbin/ifconfig lo:1 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:1
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
;;
stop)
/sbin/ifconfig lo:1 down
echo 'close LVS Directorserver'
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 "Usage:$0 (start|stop)"
exit 1
esac
[root@localhost ~]#chmod +x /etc/init.d/lvsrsdr
[root@localhost ~]# /etc/init.d/lvsrsdr start
[root@localhost ~]# ifconfig -a
eth0 Link encap:Ethernet HWaddr 02:00:08:5B:00:76
inet addr:172.17.1.152 Bcast:172.17.15.255 Mask:255.255.240.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:16881281353 errors:0 dropped:0 overruns:0 frame:0
TX packets:14227651287 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3628449350074 (3.3 TiB) TX bytes:2081268815287 (1.8 TiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:4307 errors:0 dropped:0 overruns:0 frame:0
TX packets:4307 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:576540 (563.0 KiB) TX bytes:576540 (563.0 KiB)
lo:0 Link encap:Local Loopback
inet addr:172.17.0.9 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:65536 Metric:1
[root@localhost ~]# yum install -y httpd
[root@localhost ~]# echo yunweimao > /var/www/html/index.html
[root@localhost ~]# systemctl restart httpd
配置RS2
從172.17.1.152上拷貝腳本
[root@localhost ~]# scp /etc/init.d/lvsrsdr 172.17.1.153:/etc/init.d/
然後執行
[root@localhost ~]# chmod +x /etc/init.d/lvsrsdr
[root@localhost ~]# /etc/init.d/lvsrsdr start
[root@localhost ~]# ifconfig -a
eth0 Link encap:Ethernet HWaddr 02:00:08:5B:00:76
inet addr:172.17.1.153 Bcast:172.17.15.255 Mask:255.255.240.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:16881281353 errors:0 dropped:0 overruns:0 frame:0
TX packets:14227651287 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3628449350074 (3.3 TiB) TX bytes:2081268815287 (1.8 TiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:4307 errors:0 dropped:0 overruns:0 frame:0
TX packets:4307 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:576540 (563.0 KiB) TX bytes:576540 (563.0 KiB)
lo:0 Link encap:Local Loopback
inet addr:172.17.0.9 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:65536 Metric:1
[root@localhost ~]# yum install -y httpd
[root@localhost ~]# echo maoxiaopu > /var/www/html/index.html
[root@localhost ~]# systemctl restart httpd
測試
http://172.17.1.160


測試主備切換,首選在主上172.17.1.150上查看狀態
[root@localhost ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.17.1.160:80 rr
-> 172.17.1.152:80 Route 1 0 0
-> 172.17.1.153:80 Route 1 0 0
[root@localhost ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 02:00:1e:72:04:04 brd ff:ff:ff:ff:ff:ff
inet 172.17.1.150/20 brd 172.17.15.255 scope global eth0
inet 172.17.1.160/32 scope global eth0
在備上查看172.17.1.151的狀態
[root@localhost ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.17.1.160:80 rr
-> 172.17.1.152:80 Route 1 0 0
-> 172.17.1.153:80 Route 1 0 0
[root@localhost ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 02:00:25:30:04:01 brd ff:ff:ff:ff:ff:ff
inet 172.17.1.151/20 brd 172.17.15.255 scope global eth0
