Linux集羣服務知識點總結及通過案例介紹如何實現高性能web服務

一:集羣相關概念及知識點介紹:

LVS(Linux Virtual System)

   本項目在19985月由章文嵩博士成立,是中國國內最早出現的Free Software項目之一。linux虛擬服務器(LVS)項目在linux操作系統上提供了最常見的負載均衡軟件。

集羣定義

   集羣(cluster)技術是一種較新的技術,通過集羣技術,可以在付出較低成本的情況下獲得在性能、可靠性、靈活性方面的相對較高的收益,其任務調度則是集羣系統中

的核心技術。本文就集羣系統的定義、發展趨勢、任務調度等問題進行了簡要論述。集羣是一組相互獨立的、通過高速網絡互聯的計算機,它們構成了一個組,並以單一系統的模式加以管理。一個客戶與集羣相互作用時,集羣像是一個獨立的服務器。集羣配置是用於提高可用性和可縮放性。

集羣系統的主要優點:(高可擴展性、高可用性、高性能、高性價比)

目前運行在LINUX最主流的三種集羣:

負載集羣之一:LB(Load Balancing)

      負載均衡集羣運行時,一般通過一個或者多個前端負載均衡器(Director Server),將用戶發來的請求資源信息,通過一種調度算法發送至到後端的一組應用服務器(Real Server)上,從而達到整個系統的高性能和高可用性。這樣的計算機集羣有時也被稱爲服務器羣(Server Farm)

一般高可用性集羣和負載均衡集羣會使用類似的技術,或同時具有高可用性與負載均衡的特點。

負載集羣之二:HA(High-Availability)

       一般是指當集羣中有某個節點失效的情況下,其上的任務會自動轉移到其他正常的節點上。並且還可以將集羣中的某節點進行離線維護再上線,該過程並不影響

整個集羣的運行。

高可用集羣:爲了保證服務一直在線的高可用能力的集羣

衡量標準:可用性=在線時間/(在線時間+故障處理時間)

負載集羣之三:HP

        高性能計算集羣採用將計算任務分配到集羣的不同計算節點從而提高計算能力,因而主要應用在科學計算領域。比較流行的HPC採用Linux操作系統和其它一些免費軟

件來完成並行運算。這一集羣配置通常被稱爲Beowulf集羣。這類集羣通常運行特定的程序以發揮HPC cluster的並行能力。這類程序一般應用特定的運行庫, 比如專爲科學計算設計的MPI庫。

HPC集羣特別適合於在計算中各計算節點之間發生大量數據通訊的計算作業,比如一個節點的中間結果或影響到其它節點計算結果的情況。

高性能處理集羣:

        利用的是分佈式存儲:分佈式文件系統,分佈式文件系統把一個大任務切割爲小任務、分別進行處理

LVS系統結構:

  負載均衡器(Load Balancer)、服務器羣組(Server Aarry)、共享存儲(Shared Storage)

負載均衡層

         整個集羣服務最前端設備,它有一個或多個調度器(Director Server)組成,LVS軟件運行在調度服務器上。

調度服務器的功能

將用戶的請求,根據調度算法進行IP分流,將數據包發送到後端應用服務器上(Real Server),如果調度服務器安裝了監控模塊Ldirectord,那麼調度服務器會將出現故障的應用服務器標記爲不可用,知道此應用服務器恢復正常。

服務器羣組層

          這是由一個或者多個應用程序服務器(Real Server)組成,並且每個應用服務器提供相同的服務,調度服務器會將用戶的請求定向到具體的應用服務器上,然後由後端的應用服務器響應客戶端。

共享存儲層

          功能只要是保證服務器羣組中的應用服務器提供數據的一致性。

共享存儲的實現方式

          磁盤陣列、集羣文件系統(OCFS2)

LVS是linux系統上的一種機制,類似於iptables,其相關屬性也是通過(ipvsadm)與iptables命令類似的方式定義的,

LVS是工作於linux系統內核空間,通過內核來提供工作,其工作空間在iptables的INPUT鏈上,當客戶端請求到達INPUT鏈上以後,通過LVS規則的驗證,如果是內部請求,發送至用戶空間,如果發現是集羣,將此請求發送至POSTROUTING鏈,並交給後端應用程序服務器來響應用戶的請求。

注意:上面所提到LVS其實是工作在iptables的INPUT和postrouting鏈上的,所以在此係統上iptables和LVS不能同時存在。

LVS的組成:

ipvsadm:用於管理集羣服務的命令行工具,工作於Linux系統中的用戶空間

ipvs:爲lvs提供服務的內核模塊,工作於內核空間 (相對於是框架,通過ipvsadm添加規則,來實現ipvs功能)

注:在linux內核2.4.23之前的內核中模塊默認是不存在的,需要自己手動打補丁,然後把此模塊編譯進內核纔可以使用此功能

LVS類型:

               LVS-NAT模式、LVS-DR模式、LVS-TUN模式

NAT:(Network address translation)

230842187.png\"

          原理:把用戶的請求發來的IP包的IP報頭目的地址,通過LVS服務器轉換至後端提供服務的Real Server的地址並將用戶的請求報文發送至應用服務器。而應用服務器打開報文並響應用戶請求發送並經過LVS服務器,LVS服務器將源地址修改爲LVS服務器接口上的VIP地址。

NAT模式特點:

1
2
3
4
5
6
7
8
9
用戶發來的請求和響應,都必須經過LVS服務器。
集羣節點跟Director必須在同一個IP網絡中;
RIP通常是私有地址,僅用於各集羣節點間的通信;
Director位於Client和Real Server之間,並負責處理進出的所有通信;
Realserver必須將網關指向DIP地址;
支持端口映射;
Realserver可以使用任意OS;
LVS服務器必須有兩塊網卡
較大規模應該場景中,Director易成爲系統瓶頸;


DR:(Direct routing)

231505205.png\"

          DR模式工作在數據鏈路層,其原理,LVS服務器和應用服務器使用同一個IP地址對外服務,但只有LVS服務器對ARP請求進行響應,所有應用服務器對本身這個IP地址的ARP請求保持靜默。網關會把所有的ARP請求定向至LVS服務器,而LVS服務器收到用戶請求數據報文,根據調度算法進行IP分流,然後相應的MAC地址的修改,發送至後端對應的應用服務器。

注:由於LVS服務器對二層數據包進行修改,所以LVS服務器和應用服務器必須在同一個廣播域。

DR模式特點

1
2
3
4
5
集羣節點跟director必須在同一個物理網絡中;
RIP可以使用公網地址,實現便捷的遠程管理和監控;
Director僅負責處理入站請求,響應報文則由Real Server直接發往客戶端;
Real Server不能將網關指向DIP;
不支持端口映射;


注:在DR模式中,LVS服務器只負責接收用戶請求,根據調度算法及IP分流,直接路由轉發,其響應報文交給Real Server自行處理。

          DR模式是三種模式當中性能最好的,唯一的缺陷是LVS服務器和後端的應用服務器必須在同一個廣播域中,因此不能實現集羣的跨網端應用。

TUN (IP Tunnel模式)

180054206.png\"

          TUN模式,LVS將TCP/IP請求進行重新封裝並轉發給目標應用服務器,有目標應用程序服務器對用戶請求做出相應。LVS Router和Real Server通過Tp Tunnel通過隧道技術

進行轉發,因此兩者可以存在不同的網絡當中。

注:由於應用服務器需要對LVS發送的報文進行還原,也就是說應用服務器也要支持Ip Tunnel協議。(Network options)

TUN模式特點:

1
2
3
4
5
6
集羣節點可以跨越Internet;
RIP必須是公網地址;
Director僅負責處理入站請求,響應報文則由Real Server直接發往客戶端;
Real Server網關不能指向director;
只有支持隧道功能的OS才能用於Real Server;
不支持端口映射;


LVS負載均衡八種調度算法:

                                          rr-->wrr-->lc-->wlc-->lblc-->lblcr-->dh-->sh

輪叫(Round Robin):

          該算法將用戶請求有次序地分發到後端的應用服務器,均等看待所有Real Server,而並不計算具體服務器上的鏈接和負載。

加權輪叫(Weighted Round Robin):

          該調度算法根據各個應用服務器的不同負載能力,給服務器設置不同的權值,處理能力強的應用服務器的權值設置大點,來響應更多的用戶請求。

最少連接(Least Connections):

          該算法將用戶發送的請求分配到連接做少的應用服務器上。

加權最少連接(Weighted Least Connections):

          該算法根據應用服務器的不同負載能力,設置不同大小不同的權值,權值較大並且連接請求數少的應用服務器則優先分配用戶請求信息。

基於局部性最少連接:(Locality-Based Least Connections):

          該算法針對目標IP地址的負載均衡算法,主要用於緩存集羣系統。此算法會根據用戶請求的目標IP地址找出與目標地址最近的應用服務器,如果服務器沒有超載,則請求被分發到該應用服務器,如果服務器不可用或者負載較大,則使用最少連接算法,選擇目標應用服務器

帶複製的基於局部性最少連接(Locality-Based Least Connections wiht Replication)

          該算法也是針對目標IP地址的負載均衡算法,主要用於緩存集羣系統。域LBLC區別在於,前者維護一個IP地址到一組服務器的映射。而後者則是維護一個IP地址到一臺應用服務器的映射。

目標地址散列(Destination Hashing)

          該算法將用戶請求的目標地址作爲散列鍵,並嘗試從靜態分配的散列表中找出對應的應用服務器。如果目標應用服務器沒有超載,那麼將用戶的請求信息分發至該應用服務裏,否則返回空。

源地址散列(Source Hashing)

          該算法將請求的源地址作爲散列鍵,並嘗試從靜態分配的散列表中找出對應的應用服務器。如果目標應用服務器可用並且沒有超載,那麼將用戶請求的信息分發至此應用服務器,否則返回空。

LVS IP Address Name Conventions:(LVS Ip-address 命名規範)

181043708.png\"

1
2
3
4
5
Director's IP (DIP) address :中間層,根據不同模式,來接收並響應用戶的請求。
Virtual IP (VIP) address:向外提供服務的地址。
Real IP (RIP) address :Real Server IP:後端提供應用服務的主機地址。
Director's IP (DIP) address :和內部的IP通信所使用的地址:設置在Director Server上
Client computer's IP (CIP) address:客戶端地址

ipvsadm命令詳細介紹:

pvsadm: 管理集羣服務的命令行工具,而ipvs系統內核中的一個模塊

ipvsadm命令的基本使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-A:在內核的虛擬服務器列表中添加一條VIP記錄
-E:修改內核虛擬服務器列表中的一條VIP記錄
-D:刪除內核虛擬服務器列表中的一條VIP記錄
-C:清空內核虛擬服務器列表中的所有VIP記錄
-S:保存虛擬服務器規則
-R:恢復虛擬服務器策略規則
-a:在內核虛擬服務器列表中添加一個應用服務器的地址。
-e:修改一個虛擬服務器列表中的一條應用服務器地址記錄
-d:刪除一個虛擬服務器列表中的一條應用服務器地址記錄
-L/-l: 查看內核虛擬服務器列表
-Z:將內核中的虛擬服務器計數清爲0
-t service-address:指定虛擬服務器使用TCP服務
-u service-address:指定虛擬服務器使用UDP服務
-s scheduler:指定調度算法:
-p timeout:在應用服務器上的持續服務時間,單位爲秒
-r service-address:指定應用服務器的地址
-g:指定LVS工作模式爲直接路由(DR-defalut)
-I:指定LVS工作模式爲隧道模式(Ip Tunnel)
-m:指定LVS工作模式爲地址轉換模式(NAT)
-w:設定應用服務器的權值


二:項目案例-如圖

LVS/DR+Keepalived 實現lvs高可用,並提供web服務負載均衡

案例環境:版本及相及IP地址的分配


名稱(Name)

Ip_address

LVS-DR-DIP:eth0

LVS-DR-DIP:eth0

172.16.88.88/16

172.16.88.66/16

LVS-DR-VIP:eth0:0

172.16.88.100/16

WEB1-Real-Server:eth0

172.16.88.10/16

WEB2-Real-Server:eth0

172.16.88.20/16

軟件及版本:Vmware  Station-RHEL 5.8(2.6.18


實驗拓撲圖如下:
133002225.png\"

配置過程如下:

Realserver1:172.16.88.10/16配置

第一步:設置主機名、IP地址、hosts文件IP地址和主機名對應關係,及關閉selinux

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost ~]# sed -i 's@\\(HOSTNAME=\\).*@\\1Real1.example.com@g'/etc/sysconfig/network
[root@localhost ~]# hostname Real1.example..com
[root@localhost ~]# vim /etc/hosts
172.16.88.10Real1.example.com   Real1
172.16.88.20Real2.example.com   Real2
[root@Real1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
# Real Service Ip_address Information
DEVICE=eth0
BOOTPROTO=static
IPADDR=172.16.88.10
NETMASK=255.255.0.0
GATEWAY=172.16.0.1
ONBOOT=yes
HWADDR=00:0c:29:4b:88:1f
[root@Real1 ~]# service network restart

第二步:建立Realserver之間建立SSH互信及時間同步:

1
2
3
4
5
[root@Real1 ~]# ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''
[root@Real1 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@172.16.88.20
[root@Real1 ~]# service ntpd stop && chkconfig ntpd off && ntpdate 172.16.0.1
[root@Real1 ~]# crontab -e
*/3* * * * /sbin/ntpdate 172.16.0.1&> /dev/null


第三步:創建Shell_Scripts,在這裏,我們的RealServer提供的是web服務器,所以在這裏我們採用腳本的方式來對Realserver進行配置,腳本內容如下:

[root@Real1 ~]# vim /scripts/realserver.sh              ##創建腳本實現vip地址以和默認路由的設置以及對外網ARP請求的相關設置

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.
# chkconfig: - 9010
# description: LVS DR real server
#
.  /etc/rc.d/init.d/functions
VIP=172.16.88.100
host=`/bin/hostname`
case"$1"in
start)
# Start LVS-DR real server on thismachine.
/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.255up
/sbin/route add -host $VIP dev lo:0
;;
stop)
# Stop LVS-DR real server loopback device(s).
/sbin/ifconfig lo:0down
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:0device
# 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


第四步:給此腳本執行權限並安裝httpd二進制軟件包,提供web服務

1
2
3
4
5
6
7
8
[root@Real1 ~]#  chmod +x /scripts/realserver.sh
[root@Real1 ~]# .realserver.sh start      ##運行此腳本,傳遞一個參數爲start,即可設置vip地址、默認路由、對與外網arp請求參數
[root@Real1 ~]# service ntpd stop && ntpdate 172.16.0.1##這裏實現時間同步,使用的ntpdate+crontab來實現,也可以通過system-config-date來做相關設置即可。
[root@Real1 ~]# crontab -e
*/3*   *   *   *   /sbin/ntpdate 172.16.0.1&>/dev/null
[root@Real1 ~]# yum install httpd -y
[root@Real1 ~]# echo "Real1 Server-1"> /var/www/html/index.txt      ##提供網頁內容,用於測試
[root@Real1 ~]# service httpd restart

[root@Real1 ~]# netstat -ntupl | grep 80   &&   curl httpd://172.16.88.10

210706998.png\"

這樣Realserver1的基本設置就完成了,Realserver2的設置和Realserver1完全相同,所以筆者在這裏就不再演示。

[root@Real2 ~]# curl http://172.16.88.20

211812909.png\"


Director1 Server Configure

Keepalived在這裏主要用作RealServer的健康狀態檢查以及LoadBalance主機(172.16.88.88/16)和Backup主機(172.16.88.66/16)之間failover的實現

下面爲二臺lvs調度服務器,安裝lvs+keepalived軟件包。安裝lvs軟件包,因爲keepalived是運行在lvs之上的,因此lvs及keepalived必須裝在一個系統裏面。

第一步:設置主機名和/etc/hosts對照關係及兩臺Director調度器之間建立SSH互信:

Director Router1操作步驟

1
2
3
4
5
6
7
8
9
[root@localhost ~]# setup    ##設置IP地址爲172.16.88.88/16
[root@localhost ~]# sed -i 's@\\(HOSTNAME=\\).*@\\1Director1.example.com@g'/etc/sysconfig/network    ##修改主機名
[root@localhost ~]# hostname Director1.example.com
[root@localhost ~]# logout     ##可以選擇註銷和重啓來使配置文件生效
[root@Director1 ~]# vim /etc/hosts    ##添加IP地址和主機名的映射關係
172.16.88.88Director1.example.com        Director1
172.16.88.66Director2.example.com        Director2
[root@Director1 ~]# ssh-keygen -t rsa -f ~/.ssl/id_rsa -P ''##建立兩臺調度服務器之間的SSH互信,用於Director服務之間複製文件,也可以使用跳板級來實現部署。
[root@Director1 ~]# ssh-copy-id -i ./.ssl/id_rsa.pub Director2

第二步:IP地址信息及開路由轉發功能:

191512348.png\"

192231335.png\"

[root@Director ~]# sysctl -p     ##重新加載/etc/sysctl.conf配置文件


Director Router2操作步驟:

第一步:配置IP、主機名、hosts 、SSH互信

1
2
3
4
5
6
7
8
9
[root@localhost ~]# setup   ##設置IP地址爲172.16.88.66/16
[root@localhost ~]# sed -i 's@\\(HOSTNAME=\\).*@\\1Director2.example.com@g'/etc/sysconfig/network
[root@localhost ~]# hostname Director2.example.com
[root@localhost ~]# logout    ##重新登錄,讀取配置文件(/etc/sysconfig/network)
[root@Director2 ~]# vim /etc/hosts   ##添加如下兩行,完成IP地址和主機名對應關係,然後保存退出即可。
172.16.88.88Director1.example.comDirector1
172.16.88.66Director2.example.comDirector2
[root@Director2 ~]# ssh-keygen -t rsa -f ~/.ssl/id_rsa -P ''
[root@Director2 ~]# ssh-copy-id -i ./.ssl/id_rsa.pub Director2 ##以上的操作步驟,就完成了兩臺調度器之間建立SSH互信工作

第二步:安裝ipvsadm和keepalived軟件包

1
2
[root@Director1 ~]# yum install ipvsadm -y
[root@Director1 ~]# yum --nogpgcheck localinstall keepalived-1.2.7-5.el5.i386.rpm -y

第三步:keepalived主配置文件格式及對每一個參數做詳細的解釋:

keepalived分爲三個部分:

                                      全局配置、VRRP定義配置、虛擬服務器定義

全局配置格式:

1
2
3
4
5
6
7
8
9
global_defs {
notification_email {
root@localhost  ##接收郵件的用戶
}
notification_email_from keepalived@localhost   ##發件用戶爲keepalived
smtp_server 127.0.0.1##郵件服務器
smtp_connect_timeout 30##連接請求超時時常
router_id LVS_DEVEL     ##路由ID
}


VRRP定義配置格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vrrp_instance VI_1 {    ##定義虛擬路由
state MASTER        ##兩種狀態分別是{MASTER|BACKUP}
interfaceeth0      ##對外提供服務及通告所使用的接口
virtual_router_id 51##虛擬路由標識ID
priority 101##{MASTER|BACKUP}的優先級,MASTER的優先級比BACKUP的優先級大
advert_int 1##同步通知間隔,MASTER與BACKUP負載均衡器之間同步檢查的時間間隔,單位爲秒
authentication {          ##驗證類型和驗證密碼,目前類型主要有PASS、AH兩種,通常使用的類型爲PASS。
auth_type PASS
auth_pass keepalived
}
virtual_ipaddress {    ##虛擬ip(VIP)地址,可以有多個地址,每個地址佔一行,不需要指定子網掩碼。
172.16.88.100/16dev eth0 labeleth0:0
}
}

虛擬服務器配置格式:

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
virtual_server 172.16.88.180{  ##虛擬服務器(virtual_server)所使用的VIP地址及端口,實現負責均衡。
delay_loop 6##健康狀態檢查時間間隔,單位是秒。
lb_algo rr    ##負載均衡調度算法,LVS總共有八種調度算法,互聯網應用常使用wlc或rr作爲調度算法。
lb_kind DR   ##負載均衡模型,LVS包括三種模型,分別爲DR、NAT、TUN。
nat_mask 255.255.0.0
persistence_timeout 50##會話保持時間(持久連接),默認爲50秒。
protocol TCP     ##轉發所使用的協議(protocol),{TCP|UPD}
real_server 172.16.88.1080{    ##後端應用服務器(real_server),用於提供用戶的請求,有時也稱爲應用服務器羣組。
weight 1##設定權值,對rr沒有意義,一般應用服務器性能好的,可以將其權值設置大寫,這樣此應用服務器就能分擔分擔更多的用戶請求資源並響應。
HTTP_GET {      ##健康狀態檢測{HTTP_GET|SSL_GET(https)|TCP_CHECK|SMTP_CHECK|MISC_CHECK            權值小的,根據不同的調度算法分擔的請求量會少些。
url {
path /
status_code 200##頁面返回代碼值
}
connect_timeout 3##連接超時時常
nb_get_retry 3##連接重試的次數
delay_before_retry 3##延遲所使用的時間
}
}
real_server 172.16.88.1080{
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.16.88.2080{
weight 1
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}

第四步:將此Director1上的keepalived主配置文件複製到Director2上,並將其狀態以及優先級修改爲BACKUP和100,然後保存並退出即可。

1
2
3
4
[root@Director2 ~]#
[root@Director2 ~]# yum install ipvsadm -y
[root@Director2 ~]# yum --nogpgcheck localinstall keepalived-1.2.7-5.el5.i386.rpm -y
[root@Director1 ~]# scp /etc/keepalived/keepalived.conf Direcotr2:/etc/keepalived/keepalived.conf

第五步啓動keepalived服務器並查看vip配置在哪臺Director上。

1
2
3
[root@Director1 ~]# service keepalived restart     ##兩臺lvs同時啓動keepalived服務
[root@Director2 ~]# service keepalived restart
[root@Director1 ~]# ifconfig    ##查看VIP地址是否配置在Director1調度服務器上


193746243.png\"

查看ipvsadm的虛擬服務器真實存在的Realserver主機記錄

1
[root@Director1 ~]# ipvsadm -L -n

194431212.png\"

第六步:如何在維護模式下,模擬LVS服務器發生故障

只需在keepalived配置文件中,添加如下內容(vrrp實例之外添加如下內容):

1
2
3
4
5
6
7
vrrp_script chk_schedown {
script "[ -e /etc/keepalived/down ] && exit1 || exit 0 "
inerval 1
weight -5
fall 2
rise 1
}

當vrrps事務發生改變時,運行此腳本:只需要在vrrp實例內添加如下內容即可

1
2
3
track_script {
chk_schedown
}

在兩臺調度服務器上,重啓keepalived進程,加載主配置文件

195516535.png\"

當手動在/etc/keepalived目錄中創建down文件時,主服務就會變成backup服務器,則從backup模式轉換爲master模式

1
2
手動創建down文件,查看主從是否切換
[root@Director1 ~]# touch /etc/keepalived/down

1、查看日誌信息

201131932.png\"

日誌分析:

1
2
3
通過日誌信息,不難發現兩臺調度服務器重新選舉主服務來提供服務,因爲在Director1相關目錄上手動創建了down文件,觸發了chk_schedown腳本,
所以Director1的優先級從101變爲了96,所以從主服務器變爲了從服務器(BACKUP)移除vip地址,因此Director2變爲主(MASTER)服務器,添加vip地址,
以及自主發起arp請求及響應arp請求,來更新記錄。

2、查看vip地址相關信息

201215491.png\"

第七步:如果提供的兩臺應用服務裏(web),由於其他原因出現故障,該如何解決呢:

1
2
3
4
5
只需要在/etc/keepalived/keepalived.conf,在virtual_server中添加如下內容:
[root@Director1 ~]# vim /etc/keepalived/keepalived.conf
sorry_service 127.0.0.1:80
然後分別重啓keepalived服務進程
注:前提兩臺調度服務器都提供httpd服務,並且提供web錯誤頁面信息


第八步:模擬兩臺應用程序服務出現故障

1
2
3
4
[root@Real1 ~]# /etc/init.d/httpd stop
Stopping httpd:                                            [  OK  ]
[root@Real1 ~]# ssh Real2 'service httpd stop'
Stopping httpd: [  OK  ]

第九步:到調度服務器上利用ipvsadm工具查看ipvs規則

202933366.png\"

測試一:利用windows客戶端訪問172.16.88.100看是否發生變化:

203306699.png\"

測試二:到其中一臺應用程序服務器從新啓動httpd進程,並查看ipvsadm規則

1
2
[root@Real1 ~]# service httpd restart
[root@Director2 ~]# ipvsadm -L -n

203855448.png\"

再次通過windows客戶端訪問網頁,看是否提供正常web服務

204525761.png\"


三:通過corosync+pacemaker實現web服務高可用,主要實現步驟:

既然給web應用服務器做高可用,那麼httpd進程就不能開機自動運行,而且當前httpd服務屬於停止狀態,有corosync來自動啓動某臺的httpd進程

1
2
[root@Real1 ~]# service httpd stop  &&  chkconfig httpd off
[root@Real2 ~]# service httpd stop  &&  chkconfig httpd off

注:在安裝corosync+pacemaker軟件包之前,使用yum來安裝它們所依賴的軟件包:

1
[root@Real1 ~]# yum install libibverbs librdmacm lm_sensors libtool-ltdl openhpi-libs openhpi perl-TimeDate -y

第一步:在兩臺Realserver應用服務器上安裝corosync+pacemaker軟件包,相應軟件包列表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cluster-glue
cluster-glue-libs
heartbeat
openaislib
resource-agents
corosync
heartbeat-libs
pacemaker
corosynclib
libesmtp
pacemaker-libs
注:軟件包下載地址:http://clusterlabs.org/rpm/。
請根據硬件平臺及操作系統類型選擇對應的軟件包;這裏建議每個軟件包都使用目前最新的版本。
使用如下命令安裝:
# yum -y --nogpgcheck localinstall *.rpm   略過驗證碼檢測,使用本地安裝


第二步:配置corosync和authkeys文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@Real1 ~]# cp /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf
[root@Real1 ~]# vim /etc/corosync/corosync.conf   ##編輯corosync主配置文件,並添加如下內容
aisexec {
user: root
group: root
}
service {
name: pacemaker
ver: 0
use_mgmtd: yes
}
並設定此配置文件中 bindnetaddr後面的IP地址爲你的網卡所在網絡的網絡地址
bindnetaddr 172.16.0.0
生成節點間通信時用到的認證密鑰文件:
[root@Real1 ~]# corosync-keygen

注:Real2上也做同樣的操作,例如安裝包依賴關係及安裝corosync+pacemaker軟件包。

第三步:將Realserver1上的corosync和authkey複製至Realserver2上即可:

1
[root@Real1 ~]# scp -p corosync authkey  Real2:/etc/corosync/     ##使用-p選項可以保留原來的屬性信息

第四步:分別爲兩個節點創建corosync,生成的日誌所在的目錄:

1
2
[root@Real1 ~]# mkdir /var/log/cluster
[root@Real1 ~]# ssh Real2  'mkdir /var/log/cluster'

第五步:分別在每個節點上啓動corosync進程服務

1
2
3
[root@Real1 ~]# service corosync restart
[root@Real1 ~]# ssh Real2 'service corosync restart'
[root@Real1 ~]# crm status

192956510.png\"

◆ 查看corosync啓動的相關進程

1
[root@Real1 ~]# ps auxf

193140206.png\"

第六步:檢查corosync相關日誌信息:

1:查看corosync引擎是否正常啓動

1
2
3
4
5
6
7
# grep -e "Corosync Cluster Engine"-e "configuration file"/var/log/cluster/corosync.log
May 1915:46:30corosync [MAIN  ] Corosync Cluster Engine ('1.2.7'): started and ready to provide service.
May 1915:46:30corosync [MAIN  ] Successfully read main configuration file '/etc/corosync/corosync.conf'.
May 1915:46:51corosync [MAIN  ] Corosync Cluster Engine exiting withstatus 0at main.c:170.
May 1915:46:54corosync [MAIN  ] Corosync Cluster Engine ('1.2.7'): started and ready to provide service.
May 1915:46:54corosync [MAIN  ] Successfully read main configuration file '/etc/corosync/corosync.conf'.
May 1915:48:00corosync [MAIN  ] Corosync Cluster Engine exiting withstatus 0at main.c:170.

2、查看初始化成員節點通知是否正常發出:

1
2
3
4
5
# grep  TOTEM  /var/log/cluster/corosync.log
May 1915:46:54corosync [TOTEM ] Initializing transport (UDP/IP).
May 1915:46:54corosync [TOTEM ] Initializing transmit/receive security: libtomcrypt SOBER128/SHA1HMAC (mode 0).
May 1915:46:56corosync [TOTEM ] The network interface[172.16.88.10] isnow up.
May 1915:46:57corosync [TOTEM ] A processor joined or left the membership and a newmembership was formed.

3、查看pacemaker是否正常啓動:

1
2
3
4
5
6
# grep pcmk_startup /var/log/cluster/corosync.log
May 1915:46:33corosync [pcmk  ] info: pcmk_startup: CRM: Initialized
May 1915:46:33corosync [pcmk  ] Logging: Initialized pcmk_startup
May 1915:46:33corosync [pcmk  ] info: pcmk_startup: Maximum core file size is: 4294967295
May 1915:46:33corosync [pcmk  ] info: pcmk_startup: Service: 9
May 1915:46:33corosync [pcmk  ] info: pcmk_startup: Local hostname: Real1.example.com

第七步:使用如下命令查看集羣節點的啓動狀態:

190420704.png\"

第八步:配置集羣工作屬性及集羣資源:

◆ 禁用stonith設備和關閉法定票數的默認策略爲ingore

190611603.png\"

191601469.png\"

◆ 添加集羣資源(vip、httpd):

213905392.png\"

第九步:查看資源的啓用狀態(crm stauts)

214314860.png\"

◆ 如果想讓兩個資源運行在一個Realserver中的話,需要定義組資源,然後將vip和webservice加入到組中即可。

220057935.png\"

220058961.png\"

◆ 用windows客戶端測試:

220354272.png\"

第十步:如果其中一個節點發生故障,另一個節點就會取代發生故障的節點,然後對外提供服務。

1
2
[root@Real1 ~]# crm node standby
[root@Real1 ~]# crm status

221218976.png\"

再次使用windows客戶端測試:

221256566.png\"

◆ 我們知道限制資源運行在同一個節點上,有兩種方法(定義資源組和設置排列約束),下面來如何使用排列約束來限制兩個資源在同一個節點上,在設置前,我們將資源組web收到刪除。

1
2
3
4
5
6
7
8
[root@Real1 ~]# crm resource
crm(live)resource# stop web
crm(live)resource# cleanup web
crm(live)resource# cd
crm(live)# configure
crm(live)configure# deleteweb
crm(live)configure# verify
crm(live)configure# commit

下面就可以使用排列約束來限制兩個資源運行在同一個節點上:

201351347.png\"

◆ 使用crm status命令查看資源運行節點狀態並使用netstat

201759940.png\"


202009220.png\"

◆ 設置資源啓動順序

202821636.png\"

210144554.png\"

◆ 手動遷移資源到另一個節點:

205215368.png\"

◆ 用windows客戶端測試

205539818.png\"

◆ 定義資源的黏貼性(傾向性),vip資源更傾向運行在Real1主機上:

220847306.png\"

◆ 使用crm status命令查看當前資源運行在那個節點上,並手動遷移資源,然後手動在上線,看是否vip資源更傾向於節點一上。

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
[root@Real1 ~]# crm status     ##查看當前資源運行在那個節點上
============
Last updated: Sun May 2622:17:022013
Stack: openais
Current DC: Real1.example.com - partition withquorum
Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f
2Nodes configured, 2expected votes
2Resources configured.
============
Online: [ Real1.example.com Real2.example.com ]
httpd  (lsb:httpd):    Started Real1.example.com
vip    (ocf::heartbeat:IPaddr):    Started Real1.example.com
[root@Real1 ~]# crm node standby  ##手動遷移資源,併成爲被動節點
[root@Real1 ~]# crm status
============
Last updated: Sun May 2622:17:262013
Stack: openais
Current DC: Real1.example.com - partition withquorum
Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f
2Nodes configured, 2expected votes
2Resources configured.
============
Node Real1.example.com: standby
Online: [ Real2.example.com ]
httpd  (lsb:httpd):    Started Real2.example.com
vip    (ocf::heartbeat:IPaddr):    Started Real2.example.com
[root@Real1 ~]# crm node online    ##將節點變爲主節點
[root@Real1 ~]# crm status   ##再次查看資源,因爲默認黏貼值爲0,所以發現vip更傾向運行在節點Real1節點上
============
Last updated: Sun May 2622:17:482013
Stack: openais
Current DC: Real1.example.com - partition withquorum
Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f
2Nodes configured, 2expected votes
2Resources configured.
============
Online: [ Real1.example.com Real2.example.com ]
httpd  (lsb:httpd):    Started Real1.example.com
vip    (ocf::heartbeat:IPaddr):    Started Real1.example.com


◆ 設定默認黏貼值爲200,然後再手動遷移資源,看vip資源是否更傾向於運行在哪個節點上。

222707197.png\"

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
[root@Real1 ~]# crm status
============
Last updated: Sun May 2622:29:502013
Stack: openais
Current DC: Real1.example.com - partition withquorum
Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f
2Nodes configured, 2expected votes
2Resources configured.
============
Online: [ Real1.example.com Real2.example.com ]
httpd  (lsb:httpd):    Started Real1.example.com
vip    (ocf::heartbeat:IPaddr):    Started Real1.example.com
[root@Real1 ~]# crm node standby
[root@Real1 ~]# crm status
============
Last updated: Sun May 2622:30:052013
Stack: openais
Current DC: Real1.example.com - partition withquorum
Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f
2Nodes configured, 2expected votes
2Resources configured.
============
Node Real1.example.com: standby
Online: [ Real2.example.com ]
httpd  (lsb:httpd):    Started Real2.example.com
vip    (ocf::heartbeat:IPaddr):    Started Real2.example.com
[root@Real1 ~]# crm node online
[root@Real1 ~]# crm status    ##因爲資源的默認粘性爲200,大於Real1節點上的粘性值,所以vip資源更傾向運行在節點2上。
============
Last updated: Sun May 2622:30:362013
Stack: openais
Current DC: Real1.example.com - partition withquorum
Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f
2Nodes configured, 2expected votes
2Resources configured.
============
Online: [ Real1.example.com Real2.example.com ]
httpd  (lsb:httpd):    Started Real2.example.com
vip    (ocf::heartbeat:IPaddr):    Started Real2.example.com




本文出自 “See you next year CA” 博客,請務必保留此出處

http://guodayong.blog.51cto.com/263451/1201101


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