通過keepalived實作LVS的高可用,實作WEB的高可用
keepalived簡介
keepalived是一個類似于layer3, 4 & 5交換機制的軟體,也就是我們平時說的第3層、第4層和第5層交換。Keepalived的作用是檢測web伺服器的狀态,如果有一台web伺服器當機,或工作出現故障,Keepalived将檢測到,并将有故障的web伺服器從系統中剔除,當web伺服器工作正常後Keepalived自動将web伺服器加入到伺服器群中,這些工作全部自動完成,不需要人工幹涉,需要人工做的隻是修複故障的web伺服器。
keepalived作用
主要用作RealServer的健康狀态檢查以及LoadBalance主機和BackUP主機之間failover的實作。
VRRP
虛拟路由器備援協定(VRRP)是一種選擇協定,它可以把一個虛拟路由器的責任動态配置設定到區域網路上的 VRRP 路由器中的一台。控制虛拟路由器 IP 位址的 VRRP 路由器稱為主路由器,它負責轉發資料資料包到這些虛拟 IP 位址。一旦主路由器不可用,這種選擇過程就提供了動态的故障轉移機制,這就允許虛拟路由器的 IP 位址可以作為終端主機的預設第一跳路由器。使用 VRRP 的好處是有更高的預設路徑的可用性而無需在每個終端主機上配置動态路由或路由發現協定。
簡單的來說:keepalived 是為了實作HA的一個底層的工具,同樣也為ipvs提供了自動定義生效規則,而且能夠基于VRRP協定實作虛拟ip的轉移。
實作LVS的高可用
兩個HA節點:
(基本是相同的設定,做node1的示範)
關掉selinux
1
2
3
4
5
<code># setenforce 0</code>
<code>或者</code>
<code># vim /etc/selinux/config</code>
<code>##修改</code>
<code>SELINUX=permissive</code>
配置主機名,保持主機名一緻
<code># hostname node1.doubao.com</code>
<code># vim /etc/sysconfig/network</code>
<code>##修改如下:</code>
<code>HOSTNAME=node1.doubao.com </code><code>#當然HA2上要改為node2</code>
<code>:wq </code><code>#儲存退出</code>
主機名稱解析:
<code># vim /etc/hosts</code>
<code>##添加如下内容</code>
<code>172.16.111.6node1.doubao.com node1</code>
<code>172.16.111.7node2.doubao.com node2</code>
雙機互信:
<code>#ssh-keygen -t rsa -f ~/.ssh/id_rsa -P '' 生成密鑰</code>
<code>#ssh-copy-id -i .ssh/id_rsa.pub root@node2 ##将公鑰檔案發送到HA2上邊</code>
時間同步:
<code># hwclock –s #由于筆者的實驗環境特殊,暫用此方法,也可以使用ntpdate的方法進行更新</code>
配置好yum
安裝配置HA的keepalived工具及負載均衡管理工具ipvsadm
下載下傳好 keepalived-1.2.7-5.el5.i386.rpm (附件已經上傳)
<code># yum -y --nogpgcheck localinstall keepalived-1.2.7-5.el5.i386.rpm</code>
編輯keepalived的配置檔案:
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
<code>######這裡是個修改過的,我貼出來了,大家可以直接使用</code>
<code>! Configuration File </code><code>for</code> <code>keepalived</code>
<code>global_defs {</code>
<code>notification_email {</code>
<code>[email protected]</code>
<code>[email protected]</code>
<code>}</code>
<code>notification_email_from [email protected]</code>
<code>smtp_connect_timeout 3</code>
<code>smtp_server 127.0.0.1</code>
<code>router_id LVS_DEVEL</code>
<code>vrrp_script chk_schedown {</code>
<code>script </code><code>"[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"</code>
<code>interval 2</code>
<code>weight -2</code>
<code>vrrp_instance VI_1 {</code>
<code>interface eth0</code>
<code>state MASTER</code>
<code>priority 101</code>
<code>virtual_router_id 51</code>
<code>garp_master_delay 1</code>
<code>authentication {</code>
<code>auth_type PASS</code>
<code>auth_pass password</code>
<code>track_interface {</code>
<code>eth0</code>
<code>virtual_ipaddress {</code>
<code>172.16.111.1</code><code>/16</code> <code>dev eth0 label eth0:0</code>
<code>track_script {</code>
<code>chk_schedown</code>
<code>virtual_server 172.16.111.1 80 {</code>
<code>delay_loop 6</code>
<code>lb_algo rr</code>
<code>lb_kind DR</code>
<code>persistence_timeout 50</code>
<code>protocol TCP</code>
<code># sorry_server 127.0.0.1 80</code>
<code>real_server 172.16.111.16 80 {</code>
<code>weight 1</code>
<code>HTTP_GET {</code>
<code>url {</code>
<code>path /</code>
<code>status_code 200</code>
<code>connect_timeout 3</code>
<code>nb_get_retry 3</code>
<code>delay_before_retry 3</code>
<code>real_server 172.16.1111.17 80 {</code>
如果要使用TCP_CHECK檢測各realserver的健康狀态,那麼,上面關于realserver部分的定義也可以替換為如下内容:
<code>virtual_server 172.16.100.1 80 {</code>
<code>persistence_timeout 300</code>
<code>sorry_server 127.0.0.1 80</code>
<code>real_server 172.16.100.11 80 {</code>
<code>TCP_CHECK {</code>
<code>tcp_port 80</code>
<code>real_server 172.16.100.12 80 {</code>
<code>connect_port 80</code>
說明:其中的sorry_server是用于定義所有realserver均出現故障時所用的伺服器。
然後複制到另外個虛拟機中,
<code>##記得改state改為BACKUP</code>
<code>##将priority 改為100</code>
yum裝ipvsadm
<code># yum install ipvsadm -y</code>
<code>然後開啟服務:</code>
<code># service ipvsadm start</code>
RS端的設定:
(同樣兩個在兩個RS分别執行)
<code>關掉selinux</code>
時間同步。
安裝httpd服務
<code># yum install httpd –y</code>
<code># vim /var/www/html/index.html</code>
<code>###添加如下内容</code>
<code>1111111111111111</code><code>#最标示RS1的作用,我們在RS2中添加22222</code>
<code># service httpd start##開啟服務</code>
這個時候可以打開浏覽器輸入下172.16.111.16 和172.16.111.17來測試下界面
設定負載均衡叢集
這裡隻需要在各個RS節點中運作下如下的腳本,就可以了。(當然如果不怕麻煩的同學可以手動添加,内容和腳本start中的内容一緻)
<code># vim start.sh</code>
<code>#!/bin/bash</code>
<code>#</code>
<code># Script to start LVS DR real server.</code>
<code># description: LVS DR real server</code>
<code>.</code><code>/etc/rc</code><code>.d</code><code>/init</code><code>.d</code><code>/functions</code>
<code>VIP=172.16.111.1</code>
<code>host=`</code><code>/bin/hostname</code><code>`</code>
<code>case</code> <code>"$1"</code> <code>in</code>
<code>start)</code><code>##手動添加隻需要進行下邊的操作</code>
<code># Start LVS-DR real server on this machine.</code>
<code>/sbin/ifconfig</code> <code>lo down</code>
<code>/sbin/ifconfig</code> <code>lo up</code>
<code>echo</code> <code>1 > </code><code>/proc/sys/net/ipv4/conf/lo/arp_ignore</code> <code>#定義接收到ARP請求時的響應級别</code>
<code>echo</code> <code>2 > </code><code>/proc/sys/net/ipv4/conf/lo/arp_announce</code> <code>#設定位址向外通告時的級别</code>
<code>echo</code> <code>1 > </code><code>/proc/sys/net/ipv4/conf/all/arp_ignore</code>
<code>echo</code> <code>2 > </code><code>/proc/sys/net/ipv4/conf/all/arp_announce</code>
<code>/sbin/ifconfig</code> <code>lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up定義廣播位址為自播模式</code>
<code>/sbin/route</code> <code>add -host $VIP dev lo:0</code><code>##定義主機為172.16.111.1的位址使用lo:0為源位址##手動添加操作到此</code>
<code>;;</code>
<code>stop)</code>
<code># Stop LVS-DR real server loopback device(s).</code>
<code>/sbin/ifconfig</code> <code>lo:0 down</code>
<code>echo</code> <code>0 > </code><code>/proc/sys/net/ipv4/conf/lo/arp_ignore</code>
<code>echo</code> <code>0 > </code><code>/proc/sys/net/ipv4/conf/lo/arp_announce</code>
<code>echo</code> <code>0 > </code><code>/proc/sys/net/ipv4/conf/all/arp_ignore</code>
<code>echo</code> <code>0 > </code><code>/proc/sys/net/ipv4/conf/all/arp_announce</code>
<code>status)</code>
<code># Status of LVS-DR real server.</code>
<code>islothere=`</code><code>/sbin/ifconfig</code> <code>lo:0 | </code><code>grep</code> <code>$VIP`</code>
<code>isrothere=`</code><code>netstat</code> <code>-rn | </code><code>grep</code> <code>"lo:0"</code> <code>| </code><code>grep</code> <code>$VIP`</code>
<code>if</code> <code>[ ! </code><code>"$islothere"</code> <code>-o ! </code><code>"isrothere"</code> <code>];</code><code>then</code>
<code># Either the route or the lo:0 device</code>
<code># not found.</code>
<code>echo</code> <code>"LVS-DR real server Stopped."</code>
<code>else</code>
<code>echo</code> <code>"LVS-DR real server Running."</code>
<code>fi</code>
<code>*)</code>
<code># Invalid entry.</code>
<code>echo</code> <code>"$0: Usage: $0 {start|status|stop}"</code>
<code>exit</code> <code>1</code>
<code>esac</code>
<code>:wq</code><code>#儲存退出</code>
<code># chmod +x start.sh</code>
<code># ./start.sh start #執行腳本</code>
通過keepalived實作LVS的高可用
到HA的兩個節點上分别開啟keepalived服務
<code># service keepalived start</code>
等到兩個HA服務都開啟時
可以使用 ip addr show 檢視下其網卡狀态
檢視ipvsadm規則:
<code>[root@node1 keepalived]</code><code># ipvsadm -L -n</code>
<code>IP Virtual Server version 1.2.1 (size=4096)</code>
<code>Prot LocalAddress:Port Scheduler Flags</code>
<code>-> RemoteAddress:PortForward Weight ActiveConn InActConn</code>
<code>TCP172.16.111.1:80 rr</code><code>##輪詢排程算法</code>
<code>-> 172.16.111.17:80Masq100</code>
<code>-> 172.16.111.16:80Route101</code>
這個時候打開浏覽器,輸入172.16.111.1
重新整理下浏覽器
這樣正好對照了rr輪詢規則。這個實驗到此為止,當然你可以進行一些别的測試,這裡我們就不在進行。
實作WEB的高可用
做這個實驗。上邊用到的兩個RS已經沒有用處了。這裡我們直接在上邊實驗過程中的兩個HA上做修改。
先關掉keepalived服務
<code># service keepalived stop</code>
<code>安裝httpd 服務</code>
<code># yum install httpd -y</code>
<code>##添加測試頁面</code>
<code><h1>node1<</code><code>/h1</code><code>></code><code># HA2為node2</code>
<code>##開始服務</code>
<code># service httpd start</code>
打開網頁測試下兩個頁面
這個時候我們需要去配置keepalived的配置檔案
主從節點的配置
配置keepalived配置檔案
70
<code># cd /etc/keepalived/</code>
<code># vim keepalived.conf</code>
<code>vrrp_script chk_httpd {</code>
<code>script </code><code>"killall -0 httpd"</code>
<code># check every 2 seconds</code>
<code># if failed, decrease 2 of the priority</code>
<code>fall 2</code>
<code># require 2 failures for failures</code>
<code>rise 1</code>
<code># require 1 sucesses for ok</code>
<code># interface for inside_network, bound by vrrp</code>
<code># Initial state, MASTER|BACKUP</code>
<code># As soon as the other machine(s) come up,</code>
<code># an election will be held and the machine</code>
<code># with the highest "priority" will become MASTER.</code>
<code># So the entry here doesn't matter a whole lot.</code>
<code># for electing MASTER, highest priority wins.</code>
<code># to be MASTER, make 50 more than other machines.</code>
<code># arbitary unique number 0..255</code>
<code># used to differentiate multiple instances of vrrpd</code>
<code># running on the same NIC (and hence same socket).</code>
<code>auth_typePASS</code>
<code># optional, monitor these as well.</code>
<code># go to FAULT state if any of these go down.</code>
<code>#addresses add|del on change to MASTER, to BACKUP.</code>
<code>#With the same entries on other machines,</code>
<code>#the opposite transition will be occuring.</code>
<code>#<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL></code>
<code>chk_httpd</code>
<code>notify_master </code><code>"/etc/keepalived/notify.sh master"</code>
<code>notify_backup </code><code>"/etc/keepalived/notify.sh backup"</code>
<code>notify_fault </code><code>"/etc/keepalived/notify.sh fault"</code>
然後将其複制到節點HA2中
<code># scp keepalived.conf notify.sh node2:/etc/keepalived/</code>
然後在HA2中對配置檔案坐下進一步修改 2處:
<code>state MASTER</code><code>##改為BUCKUP (從節點)</code>
<code>priority 101</code><code>##優先級改為100</code>
分别在兩邊開啟服務開啟服務。
<code>這時候檢視一下網卡資訊</code>
<code># ip addr show</code>
可以看出來網卡172.16.111.1已經在網卡eth0:0上了
打開網頁輸入172.16.111.1檢視
可以發現确實在節點HA1上
這個時候我們可以仿照HA1服務故障:(配置檔案中可以留意在其檔案中建立一個down檔案可以模拟其服務故障)
然後打開網頁測試下:
顯然已經變成了HA2的http頁面
大家可以繼續做測試,删掉dwon檔案
雙主模型
繼續在上邊實驗的基礎上,
分别在兩個配置檔案後邊加上如下内容
<code>#######HA1</code>
<code>vrrp_instance VI_2 {</code>
<code>state BACKUP</code><code># BACKUP for slave routers ##這個地方HA1做從</code>
<code>priority 100</code><code># 100 for BACKUP## 優先級低于HA2的此處</code>
<code>virtual_router_id 52</code>
<code>172.16.111.2</code><code>/16</code> <code>dev eth0 label eth0:1</code><code>#172.16.111.2</code>
<code>notify_master </code><code>"/etc/keepalived/notify.sh master eth0:1"</code>
<code>notify_backup </code><code>"/etc/keepalived/notify.sh backup eth0:1"</code>
<code>notify_fault </code><code>"/etc/keepalived/notify.sh fault eth0:1"</code>
然後重新開機服務做測試:
然後打開網頁做測試
這個時候我們繼續來仿照做下HA1的故障測試:
這個時候可以重新整理下兩個web頁面,可以看出來頁面都是node2的頁面,這裡就不在做測試,大家可以自行測試
本文轉自 陳延宗 51CTO部落格,原文連結:http://blog.51cto.com/407711169/1201228,如需轉載請自行聯系原作者