keepalived+lvs實作lvs的高可用
keepalived的介紹:
keepalived是借用VRRP協定來實作高可用性的,VRRP協定是解決單點故障,使路由器和層三交換機實作備援功能。
<a href="http://blog.51cto.com/attachment/201309/142244757.png" target="_blank"></a>
keepalived啟動後會有三個程序
父程序:記憶體管理,子程序管理等等
子程序:VRRP子程序
子程序:healthchecker子程序
從圖上可以看出,兩個子程序都被系統WatchDog看管,兩個子程序各自操作自己的事,healthchecker子程序負責檢查各自伺服器的健康程度,例如HTTP,LVS等等,如果healthchecker子程序檢查到MASTER上服務不可用了,就會通知本機上的VRRP子程序,讓他删除通告,并且去掉虛拟IP,轉換為BACKUP狀态
為什麼要用keepalived+lvs?
lvs是一個在四層上實作後端realserver的負載均衡的叢集,lvs遺留下兩個問題,一個是lvs的單點故障;第二個是lvs不能檢測後端realserver的健康狀态檢查。
解決lvs的單點故障就用到了高可用叢集:
①、可以是heartbeat+ldirectord這種重量級的;
②、可以是keepalived+lvs這種輕量級的解決方案。(本部落客要寫keepalived+lvs輕量級的解決方案),
解決lvs不能檢測後端realserver的健康狀态也後很多種方法:
①、可以在lvs上寫腳本ping後端realserver的ip位址,ping幾次發現ip位址ping不通則在ipvs規則裡面删除,當後端伺服器可以ping了,則把後端realserver添加到ipvs規則裡面。
②、可以在lvs上寫腳本請求後端realserver的測試幾次網頁檔案,檢視狀态碼是否為200,不是則在ipvs規則裡面清楚,當測試網頁傳回的狀态嗎是200之後,則把後端realserver添加到ipvs規則裡面
③、以上兩種方法都是依賴于腳本,keepalived的出現解決了不依賴于腳本,也可以對後端realserver的健康狀态檢查,keepalived的配置檔案裡面可以自行生成ipvs的規則,并且自行檢測後端realserver的狀态,當後端realserver不能提供服務了,keepalived會自行将其在ipvs規則裡面删除,當後端realserver可以提供服務了,又自行的在ipvs規則裡面添加。
實驗環境:
OS:Centos 6.4(redhat 6.4)
yum源:
1
2
3
4
5
6
7
8
9
10
11
<code>[centos]</code>
<code>name=sohu-centos</code>
<code>baseurl=http:</code><code>//mirrors</code><code>.sohu.com</code><code>/centos/</code><code>$releasever</code><code>/os/</code><code>$basearch</code>
<code>gpgcheck=1</code>
<code>enable</code><code>=0</code>
<code>gpgkey=http:</code><code>//mirrors</code><code>.sohu.com</code><code>/centos/RPM-GPG-KEY-CentOS-6</code>
<code>[epel]</code>
<code>name=sohu-epel</code>
<code>baseurl=http:</code><code>//mirrors</code><code>.sohu.com</code><code>/fedora-epel/</code><code>$releasever/$basearch/</code>
<code>enable</code><code>=1</code>
<code>gpgcheck=0</code>
實驗拓撲圖:
<a href="http://blog.51cto.com/attachment/201309/123622331.png" target="_blank"></a>
拓撲圖的規劃:
IP位址
軟體
Master
172.16.22.1(VIP:172.16.22.100)
keepalived+ipvsadm
Backup
172.16.22.2(VIP:172.16.22.100)
apache1
172.16.22.3(VIP:172.16.22.100)
httpd
apache2
172.16.22.4(VIP:172.16.22.100)
注:Master和Backup上面安裝ipvsadm主要是為了檢視ipvs的規則
一、安裝配置操作
Master:
1、安裝(部落客這裡用rpm包安裝,各位朋友可以用源碼編譯安裝keepalived)
<code>[root@jie1 ~]</code><code># yum -y install keepalived ipvsadm</code>
2、修改配置檔案
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
<code>[root@jie1 ~]</code><code># cd /etc/keepalived/</code>
<code>[root@jie1 keepalived]</code><code># vim keepalived.conf</code>
<code>! Configuration File </code><code>for</code> <code>keepalived</code>
<code>global_defs {</code>
<code> </code><code>notification_email {</code>
<code> </code><code>root@localhost </code><code>#設定報警郵件位址,即收件人位址</code>
<code> </code><code>}</code>
<code> </code><code>notification_email_from admin@localhost </code><code>#設定郵件的發送位址</code>
<code> </code><code>smtp_server 127.0.0.1 </code><code>#設定smtp server的ip位址</code>
<code> </code><code>smtp_connect_timeout 30 </code><code>#設定連接配接smtp server的逾時時間</code>
<code> </code><code>router_id LTT </code><code>#表示運作keepalived伺服器的一個辨別,名字可以随便取,名字會顯示在發郵件時郵件的主題資訊</code>
<code>}</code>
<code>vrrp_instance IN_1 {</code>
<code> </code><code>state MASTER </code><code>#指定keepalived的角色,此服務為master</code>
<code> </code><code>interface eth0 </code><code>#指定監測網絡的接口</code>
<code> </code><code>virtual_router_id 22 </code><code>#虛拟路由的辨別</code>
<code> </code><code>priority 100 </code><code>#定義優先級,數字越大優先級越高,1-255之間</code>
<code> </code><code>advert_int 1 </code><code>#設定同步檢查的時間間隔,機關是秒</code>
<code> </code><code>authentication { </code><code>#設定驗證類型</code>
<code> </code><code>auth_type PASS </code><code>#驗證類型為PASS</code>
<code> </code><code>auth_pass aaaa </code><code>#驗證的密碼</code>
<code> </code><code>}</code>
<code> </code><code>virtual_ipaddress {</code>
<code> </code><code>172.16.22.100 </code><code>#設定虛拟IP</code>
<code>virtual_server 172.16.22.100 80 { </code><code>#定義虛拟伺服器,需指定虛拟ip和端口</code>
<code> </code><code>delay_loop 6 </code><code>#設定健康檢查時間,機關為秒</code>
<code> </code><code>lb_algo wrr </code><code>#設定負載排程算法,此處為權重輪叫算法</code>
<code> </code><code>lb_kind DR </code><code>#設定LVS實作負載均衡的模式</code>
<code> </code><code>nat_mask 255.255.0.0 </code><code>#設定子網路遮罩</code>
<code> </code><code>protocol TCP </code><code>#設定轉發協定的類型</code>
<code> </code><code>real_server 172.16.22.1 80 { </code><code>#定義realserver,需指定ip和端口</code>
<code> </code><code>weight 1 </code><code>#指定權重</code>
<code> </code><code>HTTP_GET { </code><code>#設定檢測後端realserver的方式為擷取http協定封包</code>
<code> </code><code>url {</code>
<code> </code><code>path /</code>
<code> </code><code>status_code 200 </code><code>#狀态碼為200則證明後端伺服器是線上的</code>
<code> </code><code>}</code>
<code> </code><code>connect_timeout 3 </code><code>#設定逾時時間</code>
<code> </code><code>nb_get_retry 3 </code><code>#設定逾時時候重試幾次</code>
<code> </code><code>delay_before_retry 3 </code><code>#在重試的時候的時間間隔</code>
<code> </code><code>}</code>
<code> </code><code>real_server 172.16.22.2 80 {</code>
<code> </code><code>weight 1</code>
<code> </code><code>HTTP_GET {</code>
<code> </code><code>status_code 200</code>
<code> </code><code>connect_timeout 3</code>
<code> </code><code>nb_get_retry 3</code>
<code> </code><code>delay_before_retry 3</code>
<code>[root@jie1 keepalived]</code><code># scp keepalived.conf 172.16.22.2:/etc/keepalived/</code>
<code> </code><code>#把配置檔案copy到backup伺服器上</code>
3、開啟服務
<code>[root@jie1 keepalived]</code><code># service keepalived start</code>
<code>Starting keepalived: [ OK ]</code>
<code>[root@jie1 keepalived]</code><code># chkconfig --add keepalived</code>
<code>[root@jie1 keepalived]</code><code># chkconfig keepalived on</code>
Backup:
1、安裝
<code>[root@jie2 ~]</code><code># yum -y install keepalived ipvsadm</code>
<code>[root@jie2 ~]</code><code># cd /etc/keepalived/</code>
<code>[root@jie2 keepalived]</code><code># vim keepalived.conf #此配置檔案是從Master伺服器上copy過來,隻需小小改動</code>
<code> </code><code>state BACKUP </code><code>#把這裡原先的MASTER改成BACKUP</code>
<code> </code><code>priority 99 </code><code>#把這裡原先的100改成99</code>
<code>[root@jie2 keepalived]</code><code># service keepalived start</code>
<code>[root@jie2 keepalived]</code><code># chkconfig --add keepalived</code>
<code>[root@jie2 keepalived]</code><code># chkconfig keepalived on</code>
apache1:
1、安裝(部落客這裡用rpm包安裝,各位朋友可以用源碼編譯安裝)
<code>[root@jie3 ~]# yum -y install httpd</code>
2、建立測試網頁檔案
<code>[root@jie3 ~]# cd /</code><code>var</code><code>/www/html/</code>
<code>[root@jie3 html]# cat index.html #建一個測試網頁</code>
<code><h1></code><code>this</code> <code>is</code> <code>apache1</h1></code>
<code>[root@jie3 html]# service httpd start</code>
<code>Starting httpd: [ OK ]</code>
<code>[root@jie3 html]# chkconfig --add httpd</code>
<code>[root@jie3 html]# chkconfig httpd on</code>
4、修改核心參數和配置vip
<code>[root@jie3 html]</code><code># echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore</code>
<code>[root@jie3 html]</code><code># echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce</code>
<code>[root@jie3 html]</code><code># echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore</code>
<code>[root@jie3 html]</code><code># echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce</code>
<code>[root@jie3 html]</code><code># ifconfig lo:1 172.16.22.100 broadcast 172.16.22.100 netmask 255.255.255.255 up</code>
<code>[root@jie3 html]</code><code># route add -host 172.16.22.100 dev lo:1</code>
apache2:
<code>[root@jie4 ~]# yum -y install httpd</code>
<code>[root@jie4 ~]# cd /</code><code>var</code><code>/www/html/</code>
<code>[root@jie4 html]# cat index.html #建一個測試網頁</code>
<code><h1></code><code>this</code> <code>is</code> <code>apache2</h1></code>
<code>[root@jie4 html]# service httpd start</code>
<code>[root@jie4 html]# chkconfig --add httpd</code>
<code>[root@jie4 html]# chkconfig httpd on</code>
<code>[root@jie4 html]</code><code># echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore</code>
<code>[root@jie4 html]</code><code># echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce</code>
<code>[root@jie4 html]</code><code># echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore</code>
<code>[root@jie4 html]</code><code># echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce</code>
<code>[root@jie4 html]</code><code># ifconfig lo:1 172.16.22.100 broadcast 172.16.22.100 netmask 255.255.255.255 up</code>
<code>[root@jie4 html]</code><code># route add -host 172.16.22.100 dev lo:1</code>
此緻所有安裝已經完成。
二、相關的測試:
檢視相關的vip和ipvs規則
<a href="http://blog.51cto.com/attachment/201309/134019409.png" target="_blank"></a>
測試後端realserver是否可以通路:
apache1可以通路
<a href="http://blog.51cto.com/attachment/201309/134134155.png" target="_blank"></a>
apache2可以通路
<a href="http://blog.51cto.com/attachment/201309/134220170.png" target="_blank"></a>
而且是根據wrr算法,平均負載到realserver上
停掉Master的keepalived服務,vip和ipvs規則切換到Backup伺服器上
<a href="http://blog.51cto.com/attachment/201309/135046248.png" target="_blank"></a>
停掉apache1的服務,看ipvs的規則是否清除,顯示已經清楚規則
<code>[root@jie3 html]# service httpd stop</code>
<code>Stopping httpd: [ OK ]</code>
<code>[root@jie2 ~]# ipvsadm -L -n</code>
<code>IP Virtual Server version </code><code>1.2</code><code>.</code><code>1</code> <code>(size=</code><code>4096</code><code>)</code>
<code>Prot LocalAddress:Port Scheduler Flags</code>
<code> </code><code>-> RemoteAddress:Port Forward Weight ActiveConn InActConn</code>
<code>TCP </code><code>172.16</code><code>.</code><code>22.100</code><code>:</code><code>80</code> <code>wrr</code>
<code> </code><code>-> </code><code>172.16</code><code>.</code><code>22.4</code><code>:</code><code>80</code> <code>Route </code><code>1</code> <code>0</code> <code>0</code>
開啟apache1的服務,ipvs自動将其又添加上
<code> </code><code>-> </code><code>172.16</code><code>.</code><code>22.3</code><code>:</code><code>80</code> <code>Route </code><code>1</code> <code>0</code> <code>0</code>
此緻,keepalived實作lvs的高可用已經完成,可以自動的故障轉移,還可以根據後端realserver的狀态,自動的修改其規則
本文轉自 jie783213507 51CTO部落格,原文連結:http://blog.51cto.com/litaotao/1301509,如需轉載請自行聯系原作者