Keepalived 概述:
keepalived 是一個類似於 layer3, 4 & 5 交換機制的軟件,也就是我們平時說的第 3 層、第 4 層和第
5 層交換。 Keepalived 的作用是檢測 web 服務器的狀態,如果有一臺 web 服務器死機,或工作出現 故障,Keepalived 將檢測到,並將有故障的 web 服務器從系統中剔除,當 web 服務器工作正常後 Keepalived 自動將 web 服務器加入到服務器羣中,這些工作全部自動完成,不需要人工干涉,需要人 工做的只是修復故障的 web 服務器。
keepalived 理論工作原理
Layer3,4&7 工作在 IP/TCP 協議棧的 IP 層, TCP 層,及應用層,。 原理分別如下:
Layer3: Keepalived 使用 Layer3 的方式工作式時, Keepalived 會定期向服務器羣中的服務器發送 一個 ICMP 的數據包(既我們平時用的 Ping 程序) , 如果發現某臺服務的 IP 地址沒有激活, Keepalived 便報告這臺服務器失效,並將它從服務器羣中剔除,這種情況的典型例子是某臺服務器被非 法關機。 Layer3 的方式是以服務器的 IP 地址是否有效作爲服務器工作正常不否的標準。
Layer4: 主要以 TCP 端口的狀態來決定服務器工作正常不否。如 web server 的服務端口一般是
80,如果 Keepalived 檢測到 80 端口沒有啓勱,則 Keepalived 將把這臺服務器從服務器羣中刪除。 Layer7: Layer5 就是工作在具體的應用層了,比 Layer3,Layer4 要複雜一點,在網絡上佔用的帶寬也 要大一些。 Keepalived 將根據用戶的設定檢查服務器程序的運行是否正常,如果不用戶的設定不相符, 則 Keepalived 將把服務器從服務器羣中剔除。
keepalived 作用:
1.管理 VIP VIP 會在 LVS 乀間漂移
2.監控 LVS 分發器
運行在主分發的 Keepalived 會以組播的形式向網絡中宣告自己,即主分發器還活 着,備用節點能收到。當備用節點,在一個時間單位中收不到組播,備用節點會認
爲主 LVS 掛了,開始接手主分發器工作,把 VIP 配給自己。
3.管理 RS
Keepalived 會每隔一個時間段去做一次類似於訪問的操作如: 探針: elinks http://192.168.1.81 -dump
keepalived 官網
下載:http://www.keepalived.org/download.html
實例:使用 keepalived 實現 LVS-DR 模式高可用
配置主 LVS_keepalived silence80
安裝 ipvsadm 軟件:
[root@silence80 ~]# rpm -ivh /mnt/Packages/ipvsadm-1.25-9.el6.x86_64.rpm
安裝 keepalived
[root@silence80 ~]# tar zxvf keepalived-1.2.16.tar.gz
[root@silence80 ~]# cd keepalived-1.2.16
[root@silence80 keepalived-1.1.17]# ./configure --prefix=/usr/local/keepalived
。。。
Keepalived configuration
------------------------
Keepalived version: 1.2.16
Compiler : gcc
Compiler flags : -g -O2
Extra Lib : -lssl -lcrypto -lcrypt
Use IPVS Framework : Yes
IPVS sync daemon support : Yes
IPVS use libnl : No
fwmark socket support : Yes
Use VRRP Framework : Yes
Use VRRP VMAC : Yes
SNMP support : No
SHA1 support : No
Use Debug flags : No
[root@silence84 keepalived-1.1.17]# make && make install
擴展:
虛擬路由冗餘協議(Virtual Router Redundancy Protocol,簡稱 VRRP)是由 IETF 提出的解決局域網中 配置靜態網關出現單點失效現象的路由協議。使用組播方式通信。
VRRP 是一種路由容錯協議,也可以叫做備份路由協議。一個局域網絡內的所有主機都設置缺省路由(默 認網關),當網內主機發出的目的地址不在本網段時,報文將被通過缺省路由發往外部路由器,從而實現了 主機不外部網絡的通信。當缺省路由器 down 掉(即端口關閉)之後,內部主機將無法不外部通信,如果 路由器設置了 VRRP 時,那舉這時,虛擬路由將啓用備份路由器,從而實現全網通信。
工作流程如圖:
注:所有局域網中的 PC 機,默認網關爲 10.1.1.13
安裝後操作
[root@silence80 keepalived-1.1.17]# mkdir /etc/keepalived
[root@silence80 keepalived-1.1.17]# cp
/usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
[root@silence80 keepalived-1.1.17]# cp /usr/local/keepalived/etc/sysconfig/keepalived
/etc/sysconfig/
[root@silence80 keepalived-1.1.17]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived
/etc/init.d
[root@silence80 keepalived-1.1.17]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
測試是否能啓動
[root@xuegod65 keepalived-1.1.17]# service keepalived start
正在啓動 keepalived: [確定]
配置主keepalived silence80
配置文件
[root@silence80 ~]# vim /etc/keepalived/keepalived.conf
改:
3 global_defs {
4 notification_email {
8 }
9 notification_email_from [email protected]
10 smtp_server 192.168.200.1
11 smtp_connect_timeout 30
12 router_id LVS_DEVEL
13 }
爲:
3 global_defs {
4 notification_email {
5 root@localhost
6 }
7 notification_email_from root@localhost
8 smtp_server localhost
9 smtp_connect_timeout 30
10 router_id silence80
11 }
注:
默認的配置文件中,使用第三方 smtp 服務器,但這在現實中幾乎沒有意義,發不出郵件,我們將其指定 爲 localhost, 將通知信息的發送交給本地 sendmail 服務處理。
router_id silence80 #標識當前節點名字,兩個節點的此項需要不相同。
改:
13 vrrp_instance VI_1 {
14 state MASTER
15 interface eth0
16 virtual_router_id 51
17 priority 100
18 advert_int 1
19 authentication {
20 auth_type PASS
21 auth_pass 1111
22 }
23 virtual_ipaddress {
24 192.168.200.16
25 192.168.200.17
26 192.168.200.18
27 }
爲:
13 vrrp_instance apache {
14 state MASTER
15 interface eth0
16 virtual_router_id 51
17 priority 100
18 advert_int 1
19 authentication {
20 auth_type PASS
21 auth_pass 1111
22 }
23 virtual_ipaddress {
24 192.168.1.88
25 }
參數說明:
vrrp_instance apache { #定義一個實例,一個集羣就是一個實例。 VI_1 可以隨意改
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 { #指定虛擬 IP, 兩個節點設置必須一樣
192.168.1.88
}
}
#在 silence80 中的 keepalived 中添加 LVS 相關內容:
改:
28 virtual_server 192.168.200.100 443 {
29 delay_loop 6
30 lb_algo rr
31 lb_kind NAT
32 nat_mask 255.255.255.0
33 persistence_timeout 50
34 protocol TCP
爲:
28 virtual_server 192.168.1.88 80 {
29 delay_loop 6
30 lb_algo rr
31 lb_kind DR
32 nat_mask 255.255.255.0
33# persistence_timeout 50 #開啓這個參數有可能導致不能實現負載均衡
34 protocol TCP
註釋:
##虛擬一個服務 ipvsadm -A -t 192.168.1.88:80 -s rr virtual_server 192.168.1.88 80 {
delay_loop 6 Keepalived 多長時間監測一次 RS
lb_algo rr 分發算法
lb_kind DR DR 模式
32 nat_mask 255.255.255.0
33 persistence_timeout 50 # 同一 IP 50 秒內的請求都發到同個 real server ,這個會影響 LVS
的 rr 調度算法, 同一 IP 超過 50 秒後,再次訪問,纔會被轉發到另一臺 real server 上。
persistence 持久性
改:
36 real_server 192.168.201.100 443 {
37 weight 1
38 SSL_GET {
39 url {
40 path /
41 digest ff20ad2481f97b1754ef3e12ecd3a9cc
42 }
43 url {
44 path /mrtg/
45 digest 9b3a0c85a887a256d6939da88aabd8cd
46 }
47 connect_timeout 3
48 nb_get_retry 3
49 delay_before_retry 3
50 }
51 }
爲:
## ipvsadm -a -t 192.168.1.81:80 -r 192.168.1.81 -g
## ipvsadm -a -t 192.168.1.82:80 -r 192.168.1.82 -g
real_server 192.168.1.81 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.1.82 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
注:
real_server192.168.1.81 80 {#配置服務節點 1,需要指定 realserver 的真實 IP 地址和端口,IP 不端 口之間用空栺隔開
weight 1 #配置服務節點的權值,權值大小用數字表示,數字越大,權值越高,設置權值大小可 以爲不同性能的服務器
connect_timeout 3 #表示 3 秒無響應超時 nb_get_retry 3#表示重試次數 delay_before_retry 3 #表示重試間隔 connect_port 80 #檢測端口
}
默認配置文件中還有兩個 virtual_server 模版,把剩下的都刪除了,就可以。 如:
virtual_server 10.10.10.2 1358 { 。。。 }
virtual_server 10.10.10.3 1358 { 。。。 }
測試:
[root@silence80 etc]# service keepalived restart
Stopping keepalived: [ OK ]
Starting keepalived: [ OK ]
[root@silence80 etc]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.88:80 rr persistent 50
注:沒有看到 realserver,是因爲兩臺 realserver 沒有開啓 httpd 服務。
配置備keepalived silence84
安裝 ipvsadm 軟件:
[root@silence84 ~]# rpm -ivh /mnt/Packages/ipvsadm-1.25-9.el6.x86_64.rpm
在 silence84 上安裝 keepalived
[root@silence84 ~]# tar zxvf keepalived-1.2.16.tar.gz
[root@silence84 ~]# cd keepalived-1.2.16
[root@silence84 keepalived-1.1.17]# ./configure --prefix=/usr/local/keepalived
[root@silence84 keepalived-1.1.17]# make -j 4 && make install
安裝後操作
[root@silence84 keepalived-1.1.17]# mkdir /etc/keepalived
[root@silence84 keepalived-1.1.17]# cp /usr/local/keepalived/etc/sysconfig/keepalived
/etc/sysconfig/
[root@silence84 keepalived-1.1.17]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived
/etc/init.d
[root@silence84 keepalived-1.1.17]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
從 silence80 上直接複製對應的配置文件到 silence84 上:
複製主配置文件
[root@silence80 ~]#scp /etc/keepalived/keepalived.conf 192.168.1.84:/etc/keepalived/
測試是否能啓動
[root@silence84 keepalived-1.1.17]# service keepalived start
正在啓動 keepalived: [確定]
配置 silence84 爲 LVS 從服務器,修改配置文件:
[root@silence84 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from root@localhost
smtp_server localhost
smtp_connect_timeout 30
router_id silence84 #運行 keepalived 的機器標示符
}
vrrp_instance apache {
state BACKUP #當前 LVS 狀態爲從分發器
interface eth0 virtual_router_id 51
priority 90 #當前 LVS 優先級,備的要比主的小
重啓服務
[root@silence84 ~]# /etc/init.d/keepalived restart
測試:高可用
[root@silence80 etc]# /etc/init.d/keepalived stop #停止 silence80 主上 keepalived
[root@silence84 keepalived]# ip addr #在 silence82 上查看
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen
1000
link/ether 00:0c:29:c5:08:33 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.84/24 brd 192.168.1.255 scope global eth0
inet 192.168.1.88/32 scope global eth0
inet6 fe80::20c:29ff:fec5:833/64 scope link
valid_lft forever preferred_lft forever
[root@silence84 keepalived]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.88:80 rr persistent 50
注:可以查看到以上內容說明,正常。
配置 silence81 爲 RS1
編寫腳本把虛擬 IP(VIP)綁定到 silence81 的迴環網卡上。
[root@silence81 ~]# vim /etc/init.d/lvsrsdr #寫入以下內容
#!/bin/bash
#description : start realserver
VIP=192.168.1.88
source /etc/init.d/functions case "$1" in
start)
echo " start LVS of RealServer DR"
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/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
;;
stop)
/sbin/ifconfig lo:0 down
echo "close LVS of RealServer DR"
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@silence81 ~]# chmod +x /etc/init.d/lvsrsdr
[root@silence81 ~]# /etc/init.d/lvsrsdr start
[root@silence81 ~]# ifconfig
。。。
lo:0 Link encap:Local Loopback
inet addr:192.168.1.88 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:16436 Metric:1
安裝 apache:
[root@silence81 ~]# yum install httpd -y
[root@silence81 ~]# echo '192.168.1.81' > /var/www/html/index.html
[root@silence81 ~]# service httpd restart
配置 silence82 爲 RS2
複製一下腳本:
[root@silence81 ~]# scp /etc/init.d/lvsrsdr [email protected]:/etc/init.d/
啓動:
[root@silence82 ~]# chmod +x /etc/init.d/lvsrsdr
[root@silence82 ~]# /etc/init.d/lvsrsdr start
[root@silence82 ~]# ifconfig
。。。
lo:0 Link encap:Local Loopback
inet addr:192.168.1.88 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:16436 Metric:1
安裝 apache:
[root@silence82 ~]# yum install httpd -y
[root@silence82 ~]# echo '192.168.1.82' > /var/www/html/index.html
[root@silence82 ~]# service httpd restart
#在 RS1 和 RS2 上面運行,並添加到/etc/rc.local 下開機自啓
[root@silence81 ~]# echo '/etc/init.d/lvsrsdr start' >> /etc/rc.local
[root@silence82 ~]# echo '/etc/init.d/lvsrsdr start' >> /etc/rc.local
測試RS1和RS2
到此實驗配置完畢。
排錯:
報錯信息:
[root@silence80 keepalived-1.2.16]# ./configure
解決辦法:
由提示可以看到,沒有發現 gcc cc 編譯工具,只需要安裝即可。 解決方法:
[root@silence80 keepalived-1.2.16]#yum install gcc gcc-C++
報錯信息:
解決方法: 內核源碼做軟鏈接,查看是否有內核源碼
[root@silence80 ~]#ls /usr/src/kernels/
[root@silence80 ~]#yum install kernel-devel ipvsadm
[root@silence80 ~]#ln -s /usr/src/kernels/2.6.32-220.el6.x86_64/ /usr/src/linux
注:上面 ln 軟鏈接時源地址根據系統版本的不同,目錄名也不同
Configure 最後輸出說明