天天看點

keepalived+lvs實作高可用的負載均衡

###############################################

keepalived

keepalived+lvs實作高可用的負載均衡

測試

keepalived一款輕量級高可用軟體,工作于layer3, 4 & 5,不同于前幾篇博文中的Heartbeat、Corosync等軟體的實作機制不同,它采用虛拟路由備援協定(Virual Router Redundancy Protocal)來實作并且完美的與lvs結合,由于底層使用虛拟路由備援協定,是以Keepalived具有切換速度快的特點,工作在layer3的keepalived定期向伺服器群組中發送ICMP資料包宣告自己存活與否,工作在layer3的keepalived支援以檢測TCP端口狀态的方式來判定背景Realserver故障與否,自動并将那些判定為故障的背景Realserver從ipvs規則中踢出,工作在layer5可以支援使用者自動以腳本來實作相應的智能操作。此lvs也可以結合ldirectord來實作對背景realserver的動态監測,相對于keepalived來說ldirectord屬于重量級别的,部署和使用的靈活程度沒有前者友善,本文将介紹keepalived。

<a href="http://blog.51cto.com/attachment/201310/143521638.jpg" target="_blank"></a>

架構圖:

<a href="http://blog.51cto.com/attachment/201310/170740188.png" target="_blank"></a>

realserver端腳本

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

<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=192.168.1.33</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>        </code><code>/sbin/ifconfig</code> <code>lo down</code>

<code>        </code><code>/sbin/ifconfig</code> <code>lo up</code>

<code>        </code><code>echo</code> <code>1 &gt; </code><code>/proc/sys/net/ipv4/conf/lo/arp_ignore</code>

<code>        </code><code>echo</code> <code>2 &gt; </code><code>/proc/sys/net/ipv4/conf/lo/arp_announce</code>

<code>        </code><code>echo</code> <code>1 &gt; </code><code>/proc/sys/net/ipv4/conf/all/arp_ignore</code>

<code>        </code><code>echo</code> <code>2 &gt; </code><code>/proc/sys/net/ipv4/conf/all/arp_announce</code>

<code>        </code><code>/sbin/ifconfig</code> <code>lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up</code>

<code>        </code><code>/sbin/route</code> <code>add -host $VIP dev lo:0</code>

<code>;;</code>

<code>stop)</code>

<code>        </code><code># Stop LVS-DR real server loopback device(s).</code>

<code>        </code><code>/sbin/ifconfig</code> <code>lo:0 down</code>

<code>        </code><code>echo</code> <code>0 &gt; </code><code>/proc/sys/net/ipv4/conf/lo/arp_ignore</code>

<code>        </code><code>echo</code> <code>0 &gt; </code><code>/proc/sys/net/ipv4/conf/lo/arp_announce</code>

<code>        </code><code>echo</code> <code>0 &gt; </code><code>/proc/sys/net/ipv4/conf/all/arp_ignore</code>

<code>        </code><code>echo</code> <code>0 &gt; </code><code>/proc/sys/net/ipv4/conf/all/arp_announce</code>

<code>status)</code>

<code>        </code><code># Status of LVS-DR real server.</code>

<code>        </code><code>islothere=`</code><code>/sbin/ifconfig</code> <code>lo:0 | </code><code>grep</code> <code>$VIP`</code>

<code>        </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>        </code><code>if</code> <code>[ ! </code><code>"$islothere"</code> <code>-o ! </code><code>"isrothere"</code> <code>];</code><code>then</code>

<code>            </code><code># Either the route or the lo:0 device</code>

<code>            </code><code># not found.</code>

<code>            </code><code>echo</code> <code>"LVS-DR real server Stopped."</code>

<code>        </code><code>else</code>

<code>            </code><code>echo</code> <code>"LVS-DR real server Running."</code>

<code>        </code><code>fi</code>

<code>*)</code>

<code>            </code><code># Invalid entry.</code>

<code>            </code><code>echo</code> <code>"$0: Usage: $0 {start|status|stop}"</code>

<code>            </code><code>exit</code> <code>1</code>

<code>esac</code>

安裝httpd并建立測試頁面如下:

<a href="http://blog.51cto.com/attachment/201310/171816369.png" target="_blank"></a>

安裝ipvsadm和keepalived

<code>yum </code><code>install</code> <code>ipvsadm</code>

<code>rpm -ivh  keepalived-1.2.7-5.el5.i386.rpm</code>

director_master的配置vim /etc/keepalived/keepalived.conf

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

<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 root@localhost  </code><code>#報警發件人位址</code>

<code>   </code><code>smtp_server 127.0.0.1                   </code><code>#設定smtp服務位址</code>

<code>   </code><code>smtp_connect_timeout 30                 </code><code>#設定連接配接smtp服務的逾時時間</code>

<code>   </code><code>router_id LVS_DEVEL                     </code><code>#發送郵件的主體資訊</code>

<code>}</code>

<code>vrrp_script chk_schedown {                 </code><code>#自定義腳本</code>

<code>   </code><code>script </code><code>"[ -e /etc/keepalived/down ] &amp;&amp; exit 1 || exit 0"</code>

<code>   </code><code>interval 1    </code><code>#重試時間間隔</code>

<code>   </code><code>weight -5     </code><code>#減權重</code>

<code>   </code><code>fall 2</code>

<code>   </code><code>rise 1</code>

<code>vrrp_instance VI_1 {</code>

<code>    </code><code>state MASTER             </code><code>#制定keepalived角色</code>

<code>    </code><code>interface eth0           </code><code>#制定檢測網絡接口</code>

<code>    </code><code>virtual_router_id 54     </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>auth_type PASS       </code><code>#驗證類型為PASS</code>

<code>        </code><code>auth_pass soulboy    </code><code>#驗證密碼</code>

<code>    </code><code>}</code>

<code>    </code><code>virtual_ipaddress {</code>

<code>        </code><code>192.168.1.33</code><code>/24</code> <code>dev eth0 label eth0:0  </code><code>#設定虛拟IP</code>

<code>     </code><code>track_script {</code>

<code>        </code><code>chk_schedown</code>

<code>    </code><code>notify_master </code><code>"/etc/keepalived/notify.sh -n master -a 192.168.1.33"</code>

<code>    </code><code>notify_backup </code><code>"/etc/keepalived/notify.sh -n backup -a 192.168.1.33"</code>

<code>    </code><code>notify_fault </code><code>"/etc/keepalived/notify.sh -n fault -a 192.168.1.33"</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      </code> 

<code>virtual_server 192.168.1.33 80 {  </code><code>#定義虛拟伺服器</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.255.0</code>

<code>    </code><code>persistence_timeout 50 </code>

<code>    </code><code>protocol TCP                  </code><code>#設定轉發協定的類型</code>

<code>    </code><code>sorry_server 127.0.0.1 80     </code><code>#設定緊急伺服器</code>

<code>    </code><code>real_server 192.168.1.10 80 {</code>

<code>        </code><code>weight 1</code>

<code>        </code><code>HTTP_GET {</code>

<code>            </code><code>url {</code>

<code>              </code><code>path /</code>

<code>                </code><code>status_code 200</code>

<code>            </code><code>}</code>

<code>            </code><code>connect_timeout 2</code>

<code>            </code><code>nb_get_retry 3</code>

<code>            </code><code>delay_before_retry 1</code>

<code>        </code><code>}</code>

<code>    </code><code>real_server 192.168.1.20 80 {</code>

<code>                </code><code>}</code>

director_backup的配置vim /etc/keepalived/keepalived.conf

<code>        </code><code>root@localhost</code>

<code>   </code><code>notification_email_from root@localhost</code>

<code>   </code><code>smtp_server 127.0.0.1</code>

<code>   </code><code>smtp_connect_timeout 30</code>

<code>   </code><code>router_id LVS_DEVEL</code>

<code>vrrp_script chk_schedown {</code>

<code>   </code><code>interval 1</code>

<code>   </code><code>weight -5</code>

<code>    </code><code>state BACKUP</code>

<code>    </code><code>interface eth0</code>

<code>    </code><code>virtual_router_id 54</code>

<code>    </code><code>priority 99</code>

<code>    </code><code>advert_int 1</code>

<code>        </code><code>auth_type PASS</code>

<code>        </code><code>auth_pass soulboy</code>

<code>        </code><code>192.168.1.33</code><code>/24</code> <code>dev eth0 label eth0:0</code>

<code>    </code><code>track_script {</code>

<code>virtual_server 192.168.1.33 80 {</code>

<code>    </code><code>delay_loop 6</code>

<code>    </code><code>lb_algo wrr</code>

<code>    </code><code>lb_kind DR</code>

<code>    </code><code>persistence_timeout 50</code>

<code>    </code><code>protocol TCP</code>

<code>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           </code> 

<code>    </code><code>sorry_server 127.0.0.1 80</code>

通知腳本vim /etc/keepalived/notify.sh

<code>ifalias=${2:-eth0:0}</code>

<code>interface=$(</code><code>echo</code> <code>$ifalias | </code><code>awk</code> <code>-F: </code><code>'{print $1}'</code><code>)</code>

<code>vip=$(ip addr show $interface | </code><code>grep</code> <code>$ifalias | </code><code>awk</code> <code>'{print $2}'</code><code>)</code>

<code>contact=</code><code>'root@localhost'</code>

<code>workspace=$(</code><code>dirname</code> <code>$0)</code>

<code>notify() {</code>

<code>    </code><code>subject=</code><code>"$ip change to $1"</code>

<code>    </code><code>body=</code><code>"$ip change to $1 $(date '+%F %H:%M:%S')"</code>

<code>    </code><code>echo</code> <code>$body | mail -s </code><code>"$1 transition"</code> <code>$contact</code>

<code>    </code><code>master)</code>

<code>        </code><code>notify master</code>

<code>        </code><code>exit</code> <code>0</code>

<code>    </code><code>;;</code>

<code>    </code><code>backup)</code>

<code>        </code><code>notify backup</code>

<code>        </code><code>/etc/rc</code><code>.d</code><code>/init</code><code>.d</code><code>/httpd</code> <code>restart</code>

<code>    </code><code>fault)</code>

<code>        </code><code>notify fault</code>

<code>    </code><code>*)</code>

<code>        </code><code>echo</code> <code>'Usage: $(basename $0) {master|backup|fault}'</code>

<code>        </code><code>exit</code> <code>1</code>

啟動director_master的keepalive服務并檢視ipvs規則

<code>#####檢視ipvs規則</code>

<code>[root@master ~]</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>  </code><code>-&gt; RemoteAddress:Port           Forward Weight ActiveConn InActConn</code>

<code>TCP  192.168.1.33:80 wrr</code>

<code>  </code><code>-&gt; 192.168.1.20:80              Route   1      0          0  </code>

<code>  </code><code>-&gt; 192.168.1.10:80              Route   1      0          0</code>

<code>#####檢視網絡資訊</code>

<code>[root@master ~]</code><code># ifconfig</code>

<code>eth0      Link encap:Ethernet  HWaddr 00:0C:29:C2:5E:01</code>

<code>          </code><code>inet addr:192.168.1.61  Bcast:192.168.1.255  Mask:255.255.255.0</code>

<code>          </code><code>inet6 addr: fe80::20c:29ff:fec2:5e01</code><code>/64</code> <code>Scope:Link</code>

<code>          </code><code>UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1</code>

<code>          </code><code>RX packets:67996 errors:0 dropped:0 overruns:0 frame:0</code>

<code>          </code><code>TX packets:116217 errors:0 dropped:0 overruns:0 carrier:0</code>

<code>          </code><code>collisions:0 txqueuelen:1000</code>

<code>          </code><code>RX bytes:15418633 (14.7 MiB)  TX bytes:8387202 (7.9 MiB)</code>

<code>          </code><code>Interrupt:67 Base address:0x2024</code>

<code>eth0:0    Link encap:Ethernet  HWaddr 00:0C:29:C2:5E:01</code>

<code>          </code><code>inet addr:192.168.1.33  Bcast:0.0.0.0  Mask:255.255.255.0</code>

啟動director_backup的keepalive服務并檢視ipvs規則

<code>[root@backup ~]</code><code># ipvsadm -L -n</code>

<code>[root@backup ~]</code><code># ifconfig</code>

<code>eth0      Link encap:Ethernet  HWaddr 00:0C:29:FA:52:D6</code>

<code>          </code><code>inet addr:192.168.1.62  Bcast:192.168.1.255  Mask:255.255.255.0</code>

<code>          </code><code>inet6 addr: fe80::20c:29ff:fefa:52d6</code><code>/64</code> <code>Scope:Link</code>

<code>          </code><code>RX packets:115068 errors:0 dropped:0 overruns:0 frame:0</code>

<code>          </code><code>TX packets:82940 errors:0 dropped:0 overruns:0 carrier:0</code>

<code>          </code><code>RX bytes:19740061 (18.8 MiB)  TX bytes:6476242 (6.1 MiB)</code>

使用用戶端通路VIP

<a href="http://blog.51cto.com/attachment/201310/173710121.png" target="_blank"></a>

<code>[root@master ~]</code><code># service keepalived stop</code>

<code>Stopping keepalived:                                       [  OK  ]</code>

<code>          </code><code>RX packets:69371 errors:0 dropped:0 overruns:0 frame:0</code>

<code>          </code><code>TX packets:118587 errors:0 dropped:0 overruns:0 carrier:0</code>

<code>          </code><code>RX bytes:15609985 (14.8 MiB)  TX bytes:8588490 (8.1 MiB)</code>

在director_backup檢視網絡資訊,發現VIP已成功轉移

<code>          </code><code>RX packets:116816 errors:0 dropped:0 overruns:0 frame:0</code>

<code>          </code><code>TX packets:84293 errors:0 dropped:0 overruns:0 carrier:0</code>

<code>          </code><code>RX bytes:19932196 (19.0 MiB)  TX bytes:6597535 (6.2 MiB)</code>

<code>eth0:0    Link encap:Ethernet  HWaddr 00:0C:29:FA:52:D6</code>

停止realserver_one的httpd服務

<code>[root@realserver_one ~]</code><code># service httpd stop</code>

<code>Stopping httpd:                                            [  OK  ]</code>

director_backup檢視ipvs規則,發現realserver_one已經被踢出

<code>  </code><code>-&gt; 192.168.1.20:80              Route   1      0          0</code>

用戶端通路VIP發現頁面恒為node2

<code>[root@realserver_two ~]</code><code># service httpd stop</code>

director_backup檢視ipvs規則,發現緊急站點生效

<code>  </code><code>-&gt; 127.0.0.1:80                 Local   1      0          0</code>

用戶端通路VIP發現頁面為自定義警告頁面

<a href="http://blog.51cto.com/attachment/201310/174831697.png" target="_blank"></a>

分别啟動realserver_one和realserver_two的httpd服務

<code>#####realserver_one</code>

<code>[root@realserver_one ~]</code><code># service httpd start</code>

<code>Starting httpd: httpd: apr_sockaddr_info_get() failed </code><code>for</code> <code>realserver_one</code>

<code>httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 </code><code>for</code> <code>ServerName</code>

<code>                                                           </code><code>[  OK  ]</code>

<code>#####realserver_two</code>

<code>[root@realserver_two ~]</code><code># service httpd start</code>

<code>Starting httpd: httpd: apr_sockaddr_info_get() failed </code><code>for</code> <code>realserver_two</code>

再次檢視director_backup發現ipvs規則已經恢複

用戶端通路VIP發現負載正常

<a href="http://blog.51cto.com/attachment/201310/175411246.png" target="_blank"></a>

<a href="http://blog.51cto.com/attachment/201310/175423863.png" target="_blank"></a>

啟動director_master的keepalived服務并檢視網絡資訊發現VIP成功轉移

<code>[root@master ~]</code><code># service keepalived start</code>

<code>Starting keepalived:                                       [  OK  ]</code>

<code>          </code><code>RX packets:70394 errors:0 dropped:0 overruns:0 frame:0</code>

<code>          </code><code>TX packets:118644 errors:0 dropped:0 overruns:0 carrier:0</code>

<code>          </code><code>RX bytes:15679204 (14.9 MiB)  TX bytes:8593207 (8.1 MiB)</code>

在director_backup檢視網絡資訊發現VIP消失

<code>          </code><code>RX packets:118485 errors:0 dropped:0 overruns:0 frame:0</code>

<code>          </code><code>TX packets:87004 errors:0 dropped:0 overruns:0 carrier:0</code>

<code>          </code><code>RX bytes:20112822 (19.1 MiB)  TX bytes:6791097 (6.4 MiB)</code>

<code>lo        Link encap:Local Loopback</code>

<code>          </code><code>inet addr:127.0.0.1  Mask:255.0.0.0</code>

<code>          </code><code>inet6 addr: ::1</code><code>/128</code> <code>Scope:Host</code>

<code>          </code><code>UP LOOPBACK RUNNING  MTU:16436  Metric:1</code>

<code>          </code><code>RX packets:6781 errors:0 dropped:0 overruns:0 frame:0</code>

<code>          </code><code>TX packets:6781 errors:0 dropped:0 overruns:0 carrier:0</code>

<code>          </code><code>collisions:0 txqueuelen:0</code>

<code>          </code><code>RX bytes:2122280 (2.0 MiB)  TX bytes:2122280 (2.0 MiB</code>

本文轉自 ftmoonfans  51CTO部落格,原文連結:http://blog.51cto.com/soulboy/1307009

上一篇: 程序管理