天天看点

基于keepalived对HAproxy做高可用集群

一、Keepalived简介

Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。

Layer3,4&7工作在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别如下:

Layer4:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的状态来决定服务器工作正常与否。如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。

   Layer7:Layer7就是工作在具体的应用层了,比Layer3,Layer4要复杂一点,在网络上占用的带宽也要大一些。Keepalived将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则Keepalived将把服务器从服务器群中剔除。

二、安装配置

1.拓扑图

<a href="http://s3.51cto.com/wyfs02/M00/25/90/wKioL1Nkn6eyMZ4OAAChbkfDbog261.jpg" target="_blank"></a>

   说明:1.两个代理服务器通过VIP向外提供数据

         2.两个代理服务器都可以代理后端的服务器

         3.为测试方便,后端服务器至提供静态页面

2.ip规划

功用

ip地址

安装软件

VIP

192.168.1.99

反向代理1

192.168.1.201

keepalived、haproxy

反向代理2

192.168.1.204

web服务器1

192.168.1.202

httpd

web服务器2

192.168.1.203

3.安装配置haproxy

   关于haproxy的详细配置,请参照http://wangfeng7399.blog.51cto.com/3518031/1405758      

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

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

<code>[root@node1 ~]# cat /etc/haproxy/haproxy.cfg</code>

<code>#---------------------------------------------------------------------</code>

<code># Example configuration </code><code>for</code> <code>a possible web application.  See the</code>

<code># full configuration options online.</code>

<code>#</code>

<code>#   http:</code><code>//haproxy.1wt.eu/download/1.4/doc/configuration.txt</code>

<code># Global settings</code>

<code>global</code>

<code>    </code><code># to have these messages end up </code><code>in</code> <code>/</code><code>var</code><code>/log/haproxy.log you will</code>

<code>    </code><code># need to:</code>

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

<code>    </code><code># </code><code>1</code><code>) configure syslog to accept network log events.  This </code><code>is</code> <code>done</code>

<code>    </code><code>#    by adding the </code><code>'-r'</code> <code>option to the SYSLOGD_OPTIONS </code><code>in</code>

<code>    </code><code>#    /etc/sysconfig/syslog</code>

<code>    </code><code># </code><code>2</code><code>) configure local2 events to go to the /</code><code>var</code><code>/log/haproxy.log</code>

<code>    </code><code>#   file. A line like the following can be added to</code>

<code>    </code><code>#   /etc/sysconfig/syslog</code>

<code>    </code><code>#    local2.*                       /</code><code>var</code><code>/log/haproxy.log</code>

<code>    </code><code>log         </code><code>127.0</code><code>.</code><code>0.1</code> <code>local2</code>

<code>    </code><code>chroot      /</code><code>var</code><code>/lib/haproxy</code>

<code>    </code><code>pidfile     /</code><code>var</code><code>/run/haproxy.pid</code>

<code>    </code><code>maxconn     </code><code>4000</code>

<code>    </code><code>user        haproxy</code>

<code>    </code><code>group       haproxy</code>

<code>    </code><code>daemon</code>

<code>    </code><code># turn on stats unix socket</code>

<code>    </code><code>stats socket /</code><code>var</code><code>/lib/haproxy/stats</code>

<code># common defaults that all the </code><code>'listen'</code> <code>and </code><code>'backend'</code> <code>sections will</code>

<code># </code><code>use</code> <code>if</code> <code>not designated </code><code>in</code> <code>their block</code>

<code>defaults</code>

<code>    </code><code>mode                    http</code>

<code>    </code><code>log                     global</code>

<code>    </code><code>option                  httplog</code>

<code>    </code><code>option                  dontlognull</code>

<code>    </code><code>option http-server-close</code>

<code>    </code><code>option forwardfor       except </code><code>127.0</code><code>.</code><code>0.0</code><code>/</code><code>8</code>

<code>    </code><code>option                  redispatch</code>

<code>    </code><code>retries                 </code><code>3</code>

<code>    </code><code>timeout http-request    10s</code>

<code>    </code><code>timeout queue           1m</code>

<code>    </code><code>timeout connect         10s</code>

<code>    </code><code>timeout client          1m</code>

<code>    </code><code>timeout server          1m</code>

<code>    </code><code>timeout http-keep-alive 10s</code>

<code>    </code><code>timeout check           10s</code>

<code>    </code><code>maxconn                 </code><code>3000</code>

<code># main frontend which proxys to the backends</code>

<code>frontend  main *:</code><code>80</code>

<code>    </code><code>default_backend </code><code>static</code>   

<code># </code><code>static</code> <code>backend </code><code>for</code> <code>serving up images, stylesheets and such</code>

<code>backend </code><code>static</code>

<code>    </code><code>balance     roundrobin</code>

<code>    </code><code>server      node2 </code><code>192.168</code><code>.</code><code>1.202</code><code>:</code><code>80</code> <code>check maxconn </code><code>2000</code>

<code>    </code><code>server      node3 </code><code>192.168</code><code>.</code><code>1.203</code><code>:</code><code>80</code> <code>check maxconn </code><code>2000</code>

<code># round robin balancing between the </code><code>var</code><code>ious backends</code>

   说明:两个节点的HAproxy的配置文件应该保持一样

4.测试haproxy的配置

<a href="http://s3.51cto.com/wyfs02/M01/25/90/wKiom1NkqEjjye6UAAB5vROjfcc126.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M00/25/90/wKioL1NkqB7yeQdHAAByUqYSatI357.jpg" target="_blank"></a>

5.安装配置keepalived

       ①、安装keepalived

           keepalived的安装可以通过yum源来安装,也可以通过编译源码来安装,本处通过yum源赖安装

       ②、配置keepalived主节点

<code>[root@node1 ~]# cat /etc/keepalived/keepalived.conf</code>

<code>! Configuration File </code><code>for</code> <code>keepalived</code>

<code>global_defs {  </code><code>//全局参数</code>

<code>   </code><code>notification_email { </code><code>//邮件</code>

<code>     </code><code>[email protected] </code><code>//收件人地址</code>

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

<code>   </code><code>notification_email_from [email protected] </code><code>//发件人地址</code>

<code>   </code><code>smtp_server </code><code>127.0</code><code>.</code><code>0.1</code>  <code>//邮件服务器的地址</code>

<code>   </code><code>smtp_connect_timeout </code><code>30</code>  <code>//间隔时间</code>

<code>   </code><code>router_id LVS_DEVEL  </code><code>//邮件服务器的组的id</code>

<code>}</code>

<code>vrrp_script chk_haproxy {</code>

<code>    </code><code>script </code><code>"killall -0 haproxy"</code>  <code>//检查haproxy是否在线</code>

<code>    </code><code>interval </code><code>1</code>    <code>//检查间隔时间</code>

<code>    </code><code>weight -</code><code>5</code>     <code>//如果检查失败,则权重-5</code>

<code>vrrp_instance VI_1 {   </code><code>//定义第一个集群</code>

<code>    </code><code>state MASTER      </code><code>//初始状态为主节点,从节点应该为BACKUP</code>

<code>    </code><code>interface</code> <code>eth0    </code><code>//配置ip的端口</code>

<code>    </code><code>virtual_router_id </code><code>51</code>  <code>//本组集群的id号,主从节点必须一样</code>

<code>    </code><code>priority </code><code>100</code>   <code>//主节点的优先级,备用节点的优先级必须低于主节点</code>

<code>    </code><code>advert_int </code><code>1</code>   <code>//心跳检查间隔时间</code>

<code>    </code><code>authentication {</code>

<code>        </code><code>auth_type PASS   </code><code>//通信为明文密码通信</code>

<code>        </code><code>auth_pass </code><code>1111</code>   <code>//通信的密码,主从节点必须一样</code>

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

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

<code>        </code><code>192.168</code><code>.</code><code>1.99</code>    <code>//定义一个VIP</code>

<code>track_script {   </code><code>//调用上面的命令</code>

<code>    </code><code>chk_haproxy</code>

   ③、配置keepalived从节点

<code>[root@node4 ~]# cat /etc/keepalived/keepalived.conf</code>

<code>global_defs {</code>

<code>   </code><code>notification_email {</code>

<code>     </code><code>[email protected]</code>

<code>   </code><code>notification_email_from [email protected]</code>

<code>   </code><code>smtp_server </code><code>127.0</code><code>.</code><code>0.1</code>

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

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

<code>    </code><code>script </code><code>"killall -0 haproxy"</code>

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

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

<code>vrrp_instance VI_1 {</code>

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

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

<code>    </code><code>virtual_router_id </code><code>51</code>

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

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

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

<code>        </code><code>auth_pass </code><code>1111</code>

<code>        </code><code>192.168</code><code>.</code><code>1.99</code>

<code>track_script {</code>

6.测试 

<code>2</code><code>: eth0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu </code><code>1500</code> <code>qdisc pfifo_fast state UP qlen </code><code>1000</code>

<code>    </code><code>link/ether </code><code>00</code><code>:0c:</code><code>29</code><code>:</code><code>56</code><code>:</code><code>78</code><code>:cd brd ff:ff:ff:ff:ff:ff</code>

<code>    </code><code>inet </code><code>192.168</code><code>.</code><code>1.204</code><code>/</code><code>24</code> <code>brd </code><code>192.168</code><code>.</code><code>1.255</code> <code>scope global eth0</code>

<code>    </code><code>inet </code><code>192.168</code><code>.</code><code>1.99</code><code>/</code><code>32</code> <code>scope global eth0</code>

<code>    </code><code>inet6 fe80::20c:29ff:fe56:78cd/</code><code>64</code> <code>scope link tentative dadfailed</code>

<code>       </code><code>valid_lft forever preferred_lft forever</code>

      可以看到ip地址已经配置上去了

<a href="http://s3.51cto.com/wyfs02/M02/25/91/wKioL1Nkr17zGRQ-AACGBxHygoA656.jpg" target="_blank"></a>

   我们可以看到网页访问正常

   下面,我们模拟服务器损坏,将node1上的haproxy关掉,看看ip地址是否会转移到node4上

<code>[root@node4 ~]# ip add</code>

<code>1</code><code>: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu </code><code>16436</code> <code>qdisc noqueue state UNKNOWN</code>

<code>    </code><code>link/loopback </code><code>00</code><code>:</code><code>00</code><code>:</code><code>00</code><code>:</code><code>00</code><code>:</code><code>00</code><code>:</code><code>00</code> <code>brd </code><code>00</code><code>:</code><code>00</code><code>:</code><code>00</code><code>:</code><code>00</code><code>:</code><code>00</code><code>:</code><code>00</code>

<code>    </code><code>inet </code><code>127.0</code><code>.</code><code>0.1</code><code>/</code><code>8</code> <code>scope host lo</code>

<code>    </code><code>inet6 ::</code><code>1</code><code>/</code><code>128</code> <code>scope host</code>

    OK!!可以看到我们的页面访问正常,这就可以实现当前段的一个反向代理服务器宕机或者后端的一个web服务宕机,服务都可以正常对外提供

     7.扩展

         我们还可以自定义通知机制

<code>#!/bin/bash</code>

<code># Author: wangfeng7399&lt;wangfeng17399@</code><code>163</code><code>.com&gt;</code>

<code># description: An example of notify script</code>

<code>vip=</code><code>192.168</code><code>.</code><code>1.99</code>

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

<code>notify() {</code>

<code>    </code><code>mailsubject=</code><code>"`hostname` to be $1: $vip floating"</code>

<code>    </code><code>mailbody=</code><code>"`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1"</code>

<code>    </code><code>echo $mailbody | mail -s </code><code>"$mailsubject"</code> <code>$contact</code>

<code>case</code> <code>"$1"</code> <code>in</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>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>

<code>esac</code>

       在keepalived的配置文件中通过notify来调用,如下所示

<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>

       大功告成,由于本人水平有限,可能有逻辑上的错误,请各位大神匹配指正

本文转自wangfeng7399 51CTO博客,原文链接:http://blog.51cto.com/wangfeng7399/1405785,如需转载请自行联系原作者

继续阅读