架構環境:
RedHat Linux Enterprise 5.8 keepalive LVS-DR
注意:1、事先配置好yum源,利用yum進行相關的軟件安裝,其可以很好的解決依賴關係
yum利用DVD光盤配置即可!其詳細配置可以參考我的博文“Linux系統常用的軟件管理工具rpm、yum及軟件源碼編譯安裝”
2、事先關閉掉相關的iptables規則和selinux
1
2
3
4
|
[root@node1
~]# getenforce #查看selinux的設置permissive|
[root@node1
~]# setenforce 0 | 1 #關閉或開啓selinux功能
[root@node1
~]# vim /etc/selinux/config #selinux的配置文件
SELINUX=disabled|permissive|enforcing
#禁止|禁用|啓用selinux
|
相關服務和名字的定義:
1
2
3
4
5
|
Director:負載調度集羣的主機,也簡稱DR
VIP:Virtual
IP,向外提供服務的IP
RIP:Real
Server IP,內部真正提供服務的
DIP:與內部主機通信的IP,在DR主機上
CIP:客戶端IP
|
一、架構設計
利用keepalive來實現lvs的Directory Server的高可用集羣,然後在利用keepalive和lvs的高可用來實現web服務的負載均衡!其架構圖如下:
二、keepalive的介紹
⑴、keepalive的基本工作機制和應用場景
keepalive是一個可以提供vrrp已經health-check功能的服務軟件,可以只用它提供雙機浮動的vip(vrrp虛擬路由功能),這樣可以簡單實現一個雙機熱備高可用功能。同時我們還可以利用LVS+Keepalived基於完整開源軟件的架構可以爲你提供一個負載均衡及高可用的服務器。
在本博文中Keepalived的主要用作RealServer的健康狀態檢查以及LoadBalance主機和BackUP主機之間failover的實現。Keepalived的作用是檢測web服務器的狀態,如果有一臺web服務器死機,或工作出現故障,Keepalived將檢測到,並將有故障的web服務器從系統中剔除,當web服務器工作正常後Keepalived自動將web服務器加入到服務器羣中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的web服務器。
Keepalived是一個基於VRRP協議來實現的WEB 服務高可用方案,可以利用其來避免單點故障。一個WEB服務至少會有2臺服務器運行Keepalived,一臺爲主服務器(MASTER),一臺爲備份服務器(BACKUP),但是對外表現爲一個虛擬IP,主服務器會發送特定的消息給備份服務器,當備份服務器收不到這個消息的時候,即主服務器宕機的時候,備份服務器就會接管虛擬IP,繼續提供服務,從而保證了高可用性。
⑵、VRRP協議
上面我們提到keepalive利用vrrp來進行health-check功能的,那麼VRRP到底是什麼那?我們下面來說說VRRP協議吧!
VRRP:Virtual Router Redundancy Protocol,是虛擬路由冗餘協議,通過此協議我們可以把多個路由器做成一個虛擬路由器,從而來保證其中某個路由宕掉的時候不會造成我們內部外出網絡的全部中斷。
VRRP中的各個路由器都有一個唯一的標識VRID,其範圍爲0-255,路由器對外表現爲唯一的虛擬MAC地址,地址的格式爲00-00-5E-00-01-[VRID]。主控路由器負責對ARP請求用該MAC地址做應答。這樣,無論如何切換,保證給終端設備的是唯一一致的IP和MAC地址,減少了切換對終端設備的影響。其中的VRID中的0和255是保留的,0用於IP地址所有者主動放棄主控者角色時使用,255用於VRRP路由器的IP地址和虛擬路由器的接口IP地址相同時所擁有!
由於VRRP協議比較複雜,這裏一兩句也介紹不清楚,而我理解的也不深,只是一點點而已,但是這並不影響我們下面的使用,所有還望各位諒解不能在此詳細介紹,如果有意深入瞭解可以下載附件內的“h3c_vrrp介紹.pdf”。
三、RS上相關軟件的安裝和配置
⑴、web服務的安裝和配置
1
2
3
|
web1和web2上分別配置相應的ip地址
RIP1: 172.16 . 7.3 / 16
RIP2: 172.16 . 7.4 / 16
|
1、在web1上安裝httpd服務並配置RIP和VIP,注意由於是基於LVS的DR模型,我們需要設置本機VIP不能響應外部主機的arp請求。
安裝httpd
1
2
|
yum
install httpd –y #安裝httpd
echo "web1.chris.com" >
/ var /www/html/index.html
#添加主頁內容
|
配置RIP和設置arp不能被外部主機解析此處使用腳本vipset.sh進行設置,腳本如下:
###########################################################
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
#!/bin/bash
#
#
Script to start LVS DR real server.
#
description: LVS DR real server
#
.
/etc/rc.d/init.d/functions
VIP= 172.16 . 7.5 #VIP地址
host=`/bin/hostname`
#定義host變量
case "$1" in
start)
#start的時候設置本機arp不被外部主機解析
#
Start LVS-DR real server on this machine.
/sbin/ifconfig
lo down
/sbin/ifconfig
lo up
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
/sbin/ifconfig
lo: 0 $VIP
broadcast $VIP netmask 255.255 . 255.255 up
#配置vip在lo: 0 ,並且設置廣播地址和子網掩碼,此處使用 32 位是保證此vip不能與其他地址通信。
/sbin/route
add -host $VIP dev lo: 0 #增加路由
;;
stop)
#stop的時候恢復到系統的初始化arp參數
#
Stop LVS-DR real server loopback device(s).
/sbin/ifconfig
lo: 0 down
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
;;
status)
#
Status of LVS-DR real server.
islothere=`/sbin/ifconfig
lo: 0 |
grep $VIP`
isrothere=`netstat
-rn | grep "lo:0" |
grep $VIP`
if [
! "$islothere" -o
! "isrothere" ];then
#
Either the route or the lo: 0 device
#
not found.
echo "LVS-DR
real server Stopped."
else
echo "LVS-DR
real server Running."
fi
;;
*)
#
Invalid entry.
echo "$0:
Usage: $0 {start|status|stop}"
exit 1
;;
esac
|
############################################################
在web1上執行此腳本,來完成vip和arp參數的設置
sh vipset.sh
然後查看相關IP參數信息
ifconfig
2、在web2上安裝httpd服務並配置RIP和VIP,注意由於是基於LVS的DR模型,我們需要設置本機VIP不能響應外部主機的arp請求。
安裝httpd
1
2
|
yum
install httpd –y #安裝httpd
echo "web2.chris.com" >
/ var /www/html/index.html
#添加主頁內容
|
配置RIP和設置arp不能被外部主機解析此處使用腳本vipset.sh進行設置,基本內容與web1上使用的腳本相同!
四、DR上相關軟件的安裝和配置
⑴、ipvsadm軟件安裝,用於後面的ipvs規則的查看。
1
2
|
yum
–y install ipvsadm #安裝用戶空間工具ipvsadm
ipvsadm
–L –n #查看系統ipvs規則
|
⑵、安裝keepalive軟件和設置相關配置
1、安裝keepalive軟件,這裏使用的是已經製作好的rpm包進行安裝,如需要請在博文附件內下載。
1
2
3
4
5
6
7
8
9
|
DS1和DS2上都進行keepalive的安裝:
兩種方法:
源碼編譯安裝:
configure
[--enable-vrrp] [--disable-snmp|--enable-snmp]
make
make
install
rpm包安裝:
我這裏利用以及編譯製作好的rpm包進行安裝
yum
-y --nogpgcheck localinstall keepalived- 1.2 . 7 - 5 .el5.i386.rpm
#不校驗並自動安裝
|
至此我們的keepalive軟件就安裝完畢了,簡單吧~下面來看看keepalive的配置文件吧
⑵、keepalive配置文件的詳解
keepalive的配置文件是/etc/keepalived/keepalived.conf,其文件內分爲:全局配置、vrrp配置、lvs配置、服務程序監控檢查
------------------------------------------------------------------------------
全局配置:
1
2
3
4
5
6
7
8
9
10
11
12
|
!
Configuration File for keepalived
#註釋
global_defs
{ #全局配置,配置參數爲{}內的內容
notification_email
{ #keepalive服務服務信息通知郵箱,可以爲多個
}
smtp_server 192.168 . 200.1 #smtp服務器
smtp_connect_timeout 30 #連接smtp超時時間
router_id
LVS_DEVEL #keepalive服務器的ID標識,注意每個服務 要有一個獨立的標識
}
|
-----------------------------------------------------------------------------
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
vrrp的配置:
vrrp_instance
VI_1 { # 定義vrrp組,VI_1代表第一個組
state
MASTER #角色,master|backup,當state指定的instance的初始化狀態,在兩臺DS都啓動以後,馬上發生競選,優先級高的成爲MASTER,所以這裏的MASTER並不是表示此臺服務器一直是MASTER
interface eth0
#綁定網卡
virtual_router_id 51 #VRID標記( 1 - 244 )
priority 100 #優先級
advert_int 1 #檢查時間間隔,默認爲1s
authentication
{ # 認證
auth_type
PASS #認證機制,PASS代表字符串
auth_pass 1111 #字符串
}
virtual_ipaddress
{ #指定漂移地址,此處既VIP,可以指定多個。
192.168 . 200.16
192.168 . 200.17
192.168 . 200.18
}
}
|
-------------------------------------------------------------------------------------
LVS的配置:lvs的配置包括兩部分,虛擬主機組和虛擬主機,這些配置都會在傳遞給ipvsadm作爲參數的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
virtual_server 192.168 . 200.100 443 {
#設置VIP port
delay_loop 6 #多少秒檢查一次real
server的健康狀態
lb_algo
rr #調度算法
lb_kind
NAT #lvs模型
nat_mask 255.255 . 255.0 #虛擬VIP的掩碼
persistence_timeout 50 #長連接時間
protocol
TCP #協議類型
real_server 192.168 . 201.100 443 {
#定義real server
weight 1 #定義權重
SSL_GET
{ #檢查web服務的SSL狀況
url
{
path
/
digest
ff20ad2481f97b1754ef3e12ecd3a9cc
}
url
{ #檢查服務器的web服務狀況
path
/mrtg/
digest
9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout 3 #連接超時時間
nb_get_retry 3 #重試次數
delay_before_retry 3 #重試連接時間間隔
}
}
}
⑶、keepalive在DS1和DS2上進行相關配置,並實現VIP的高可用和web集羣的負載均衡:
!
Configuration File for keepalived
global_defs
{
notification_email
{
chris@localhost
}
notification_email_from
root@localhsot
smtp_server 127.0 . 0.1
smtp_connect_timeout 30
router_id
LVS_DEVEL
}
vrrp_instance
VI_1 {
state
MASTER
interface eth0
virtual_router_id 51
priority 101
advert_int 1
authentication
{
auth_type
PASS
auth_pass
chris
}
virtual_ipaddress
{
172.16 . 7.5
}
}
virtual_server 172.16 . 7.5 80 {
delay_loop 6
lb_algo
rr
lb_kind
DR
protocol
TCP
real_server 172.16 . 7.3 80 {
weight 2
TCP_CHECK
{
connect_timeout 3
nb_get_retry 3
delay_before_retry 1
connect_port 80
}
}
real_server 172.16 . 7.4 80 {
weight 2
TCP_CHECK
{
connect_timeout 3
nb_get_retry 3
delay_before_retry 1
connect_port 80
}
}
}
|
然後把DS1上的keepalive.conf複製到DS2上,並把其中的stata改成BACKUP,priority修改爲100,其他的保存不變
至此我們的DS高可用已經設置完了,啓動keepalive測試下效果吧
DS1和DS2上分別開啓keepalive服務
service keepalived start
此時利用vip訪問一下我們的web服務,看看能否正常不吧
下面模擬一下DS1宕掉吧~看看其vip能否否自動漂移
在DS1上停止keepalive服務
service keepalived stop
DS2上查看下地址是否漂移過來了吧!
此時的vip進行web訪問
五、web服務的高可用集羣
通過上面的相關配置,我們利用keepalive實現了DS的高可用,然後利用LVS的DR模型實現了web服務的負載均衡,那下面我們就通過keepalive的相關功能來實現web服務的高可用!這裏keepalive通過調用相關的腳本進行對服務器的相關操作!其架構圖如下
⑴在DS1和DS2上分別安裝httpd服務,並設設置主頁內容
yum –y install httpd
echo "DS1.chris.com" > /var/www/html/index.html
啓動服務進行測試
service httpd start
⑵、配置keepalive服務
1、利用上面實驗已經安裝好的keepalive進行設置,這裏不再重新安裝,所以配置之前先把keepalive服務關掉:service keepalived stop
相關配置如下:(配置腳本在附件內-keepalive.conf-webha)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
!
Configuration File for keepalived
global_defs
{
notification_email
{
chrinux@ 126 .com
}
smtp_connect_timeout 3
smtp_server 127.0 . 0.1
router_id
LVS_DEVEL
}
vrrp_script
chk_httpd {
script "killall
-0 httpd" #kill
- 0 是模擬kill
httpd服務,並不是真的kill,只是檢查其服務是否存在
interval 2
#
check every 2 seconds
weight
- 2
# if failed,
decrease 2 of
the priority
fall 2
#
require 2 failures for failures
rise 1
#
require 1 sucesses for ok
}
vrrp_script
chk_schedown {
script "[[
-f /etc/keepalived/down ]] && exit 1 || exit 0" #利用/etc/keepalive/下的down文件是否存在來進行服務的關閉
interval 2 #每 2 秒檢查一次
weight
– 2 #如果存在,權重- 2
}
vrrp_instance
VI_1 {
interface eth0
state
MASTER
priority 101
virtual_router_id 51
garp_master_delay 1
authentication
{
auth_type
PASS
auth_pass
password
}
track_interface
{
eth0
}
#
optional, monitor these as well.
#
go to FAULT state if any
of these go down.
virtual_ipaddress
{
172.16 . 7.5 / 16 dev
eth0 label eth0: 0 #配置虛擬VIP,並指定端口和別名
}
#addresses
add|del on change to MASTER, to BACKUP.
#With
the same entries on other machines,
#the
opposite transition will be occuring.
#<IPADDR>/<MASK>
brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
track_script
{
chk_httpd
chk_schedown
}
notify_master "/etc/keepalived/httpd.sh
master"
notify_backup "/etc/keepalived/httpd.sh
backup"
notify_fault "/etc/keepalived/httpd.sh
fault"
}
|
然後把此配置文件複製到DS2 上,並修改其中的
state BACKUP #修改其爲從服務器
priority 100 #修改優先權低於主服務器的
2、增加服務控制腳本—httpd.sh,把其到到配置文件內定義的目錄/etc/keepalived/內,其腳本內容如下:(腳本在附件內-httpd.sh)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
#!/bin/bash
#
description: An example of notify script
#
ifalias=${ 2 :-eth0: 0 }
interface =$(echo
$ifalias | awk -F: '{print
$1}' )
vip=$(ip
addr show $ interface |
grep $ifalias | awk '{print
$2}' )
contact= 'root@localhost'
workspace=$(dirname
$ 0 )
notify()
{
subject= "$ip
change to $1"
body= "$ip
change to $1 $(date '+%F %H:%M:%S')"
echo
$body | mail -s "$1
transition" $contact
}
case "$1" in
master)
notify
master
exit 0
;;
backup)
notify
backup
/etc/rc.d/init.d/httpd
restart
exit 0
;;
fault)
notify
fault
exit 0
;;
*)
echo 'Usage:
$(basename $0) {master|backup|fault}'
exit 1
;;
esac
|
⑶、在DS1和DS2上開啓keepalive服務,並進行查看相關信息
下面我們訪問一下web服務吧~使用vip地址!
下面假設DS1服務器宕掉了,看看vip是否能自動漂移並啓動DS2上的web服務,我們在腳本內定義了利用在/etc/keepalived/目錄下down文件是否存在來實現測試吧
看下DS2上和web服務
此此,我們的web服務的高可用集羣已經建立完成,當然這只是比較簡單的實驗測試,在實際的工作需要中我們可以把web服務的主頁放到一個共享存儲上,來保證web內容的一致性!
六、雙主模型
我們通過定義不同的vrrp_instance來實現兩個DS互爲雙主的架構:
vrrp_instance 1內:
DS1爲主
DS2爲從
vrrp_instance 2內:
DS1爲從
DS2爲主
其設置只需要在前面配置文件下增加如下內容即可:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
vrrp_instance
VI_2 {
interface eth0
state
BACKUP # BACKUP for slave
routers
priority 100 # 100 for BACKUP
virtual_router_id 52
garp_master_delay 1
authentication
{
auth_type
PASS
auth_pass
password
}
track_interface
{
eth0
}
virtual_ipaddress
{
172.16 . 7.6 / 16 dev
eth0 label eth0: 1
}
track_script
{
chk_httpd
chk_mantaince_down
}
notify_master "/etc/keepalived/httpd.sh
master eth0:1"
notify_backup "/etc/keepalived/httpd.sh
backup eth0:1"
notify_fault "/etc/keepalived/httpd.sh
fault eth0:1"
}
|
然後配置DS2上的配置文件內增加如下內容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
vrrp_instance
VI_2 {
interface eth0
state
MASTER # BACKUP for slave
routers
priority 101 # 100 for BACKUP
virtual_router_id 52
garp_master_delay 1
authentication
{
auth_type
PASS
auth_pass
password
}
track_interface
{
eth0
}
virtual_ipaddress
{
172.16 . 7.6 / 16 dev
eth0 label eth0: 1
}
track_script
{
chk_httpd
chk_mantaince_down
}
notify_master "/etc/keepalived/httpd.sh
master eth0:1"
notify_backup "/etc/keepalived/httpd.sh
backup eth0:1"
notify_fault "/etc/keepalived/httpd.sh
fault eth0:1"
}
|
然後重啓keepalive服務,查看DS1和DS2
測試web
此時可以把DS1宕掉,測試
此時測試web服務,其都是DS2上的了
至此我們實現了基於keepalive的web雙主高可用集羣!
總結:通過以上實驗我們瞭解了keepalive實現高可用,並利用lVS實現web負載均衡的架構全部過程,最後利用keepalive的雙主模型實現了web服務的高可用架構!
內容比較多,寫的比較亂,還望各位見諒,其中錯誤望各位指正~~謝謝
chrinux—chris linux
本文出自 “Chris On the way” 博客,請務必保留此出處http://chrinux.blog.51cto.com/6466723/1201652