使用keepalived搭建高可用的LVS-DR集羣

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/

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


spacer.gif實例:使用 keepalived 實現 LVS-DR 模式高可用

wKioL1W5AxyB3x_CAAIMuYg4myc327.jpg

配置主 LVS_keepalived        silence80

安裝 ipvsadm 件:

[root@silence80 ~]rp-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 時,那舉這時,虛擬路由將啓用備份路由器,從而實現全網通信。

工作流程如圖:

wKiom1W5BAPzfT62AAFsbl9Y0XA408.jpg

注:所有局域網中的 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 {

5 [email protected]

6 [email protected]

7 [email protected]

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

wKiom1W5C3TR1qZ3AAJcISu8F-U058.jpg

到此實驗配置完畢。


排錯:

報錯信息:

[root@silence80 keepalived-1.2.16]# ./configure

wKioL1W5DePyBj6ZAAG7BD1JIhI606.jpg

解決辦法:

由提示可以看到,沒有發現 gcc cc 編譯工具,只需要安裝即可。 解決方法:

[root@silence80 keepalived-1.2.16]#yum install gcc gcc-C++


報錯信息:

wKiom1W5DCqjaf5EAAGLhCZrjQE226.jpg

解決方法: 內核源碼做軟鏈接,查看是否有內核源碼

[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 最後輸出說明

wKiom1W5DFewkSieAAGYBRkj5ms649.jpg


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章