一、安装Haproxy

Haproxy的安装非常简单,从以下网址下载源码文件进行编译安装即可:

http://haproxy.1wt.eu/

然后解压缩源码包,我下载的是1.4.9的版本:

  1. tar -zxvf haproxy-1.49.tar.gz  
  2. cd haproxy-1.4.9
  3. make TARGET=linux26 PREFIX=/haproxy 
  4. make install PREFIX=/haproxy

这样就安装好了。
我的Haproxy的配置文件haproxy.cfg的内容为:

1   global  
 2        log 127.0.0.1   local3  
 3        #log 127.0.0.1  local1 notice  
 4        #log loghost    local0 info  
 5        maxconn 4096
 6        #chroot /usr/local/haproxy
 7        #chroot /home/haproxy  
 8        uid 502 
 9        gid 502
10        daemon  
11    nbproc 1  
12    pidfile /home/haproxy/logs/haproxy.pid  
13        #debug  
14        #quiet  
15
16   defaults  
17        log     global 
18        mode    http  
19        option  httplog  
20        option  dontlognull  
21        option  forwardfor  
22        option  redispatch 
23        log     127.0.0.1 local3
24        retries 3  
25        maxconn 32000  
26        balance roundrobin  
27        stats   uri     /haproxy-stats  
28        contimeout      5000  
29        clitimeout      50000  
30        srvtimeout      50000  
31     
32   listen   web_proxy *:80
33        appsession JSESSIONID len 52 timeout 3h
34        cookie SRV insert indirect nocache
35        mode http
36        stats enable
37        stats hide-version
38        stats uri /haproxy-stats
39        stats refresh 10s
40        monitor-uri /haproxy_test
41        balance roundrobin
42        option httpclose
43        option forwardfor
44        option httpchk HEAD /index.html HTTP/1.0
45        #option  httpchk GET /ping.jsp  
46        #server  webA 10.1.29.1:80 cookie A check  
48        #server  webB 10.1.29.3:80 cookie B check  
49        server   webC 10.1.29.1:80 cookie C  check 
50   listen   web_proxy_2 *:1080
51        balance roundrobin
52        option forwardfor
53        option ssl-hello-chk
54        stats enable
55        stats hide-version
56        stats uri /haproxy-stats
57        stats refresh 10s
58        monitor-uri /haproxy_test
59        option httpchk HEAD /index.html HTTP/1.0
60        server   webD 10.1.29.25:1080 cookie D check

 

启动 haproxy:

sbin/haproxy -f haproxy.cfg

可以打开 stats 看,http://10.1.29.3/haproxy-stats, 如:

haproxy 主被切换机制 haproxy 主备模式_解压缩

如果修改 haproxy.cfg 配置,想重启 haproxy 用 kill -HUP `cat logs/haproxy.pid` 是不行的。必须使用 -sf 或 -st 参数,如:

sbin/haproxy -f haproxy.cfg -st `cat /home/haproxy/logs/haproxy.pid`

另外网上的一些设置log的方法基本都不行。

二、安装heartbeat

heartbeat依赖于一系列软件包,安装heartbeat前要先安装这些软件包:

  • A C compiler (typically gcc) and associated C development libraries;
  • the flex scanner generator and the bison parser compiler;
  • net-snmp development headers, to enable SNMP related functionality;
  • OpenIPMI development headers, to enable IPMI related functionality;
  • Python (just the language interpreter, not library headers)
  • the cluster-glue development headers.

其中cluster-glue是从源码编译的,下载地址为:http://linux-ha.org/wiki/Downloads

解压缩后执行以下命令进行编译和安装:

$ ./autogen.sh

$ ./configure

$  make

$  make install

在编译时会遇到一个警告式的错误:函数声明不是一个原型。定位后会发现version()函数的参数为空,自己加一个void参数,再编译就好了。

 

安装好cluster-glue后,编译heartbeat,下载地址同上。编译方法为:

$ ./bootstrap

$ ./ConfigureMe configure

$  make

$  make install

这两个过程写doc文件夹中的文件的时间都很长,不知道在写什么。

编译heartbeat时,make最后阶段写doc时报错,但我直接make install了,出现了两个可以忽略的错误(glue中也出现了一个这样的错误)。其原因是要创建haclient用户组和haserver用户,再进行编译安装,一切正常。

安装好后进行启动,问题又来了,就是shellfunc文件没有创建,我对比了ubuntu上直接安装的heartbeat,此文件是创建好了的。cp过来修改了一下启动还是有问题,索性决定直接用rpm包安装。搜了一下,找到了一个地址:

http://www.clusterlabs.org/rpm/epel-5/x86_64/

两台机器下载安装都很正常。然后编辑/etc/sysctl.conf,加入如下选项:

#Allow Haproxy shared IP

net.ipv4.ip_nonlocal_bind = 1

运行sysctl -p

接下来就是配置各个文件了,切换到/etc/ha.d目录。首先在lb1和lb2(lb即load blance的缩写)上都创建authkeys文件:

 

1 auth 3
2  3 md5 password

其中password需要自己设置,是两台机器之间进行认证的密码。创建完成后利用chmod 600 authkeys命令修改文件访问权限,保证只有root用户可以读写。

 

然后在lb1和lb2上创建haresources文件:

 

1 lm 10.1.29.9

其中lm是运行uname -n命令得到的主机名,这个主机名可以在/etc/sysconfig/network中修改,修改后需要重启。而主机名后面的ip地址为虚拟ip,是lb1和lb2共享的ip地址。

 

最后在lb1和lb2上创建ha.cf文件:

 

1 #
 2 #       keepalive: how many seconds between heartbeats
 3 #
 4  keepalive 2
 5  #
 6 #       deadtime: seconds-to-declare-host-dead
 7 #
 8  deadtime 10
 9  #
10 #       What UDP port to use for udp or ppp-udp communication?
11 #
12  udpport        694
13 bcast  br0
14 mcast br0 225.0.0.1 694 1 0
15 ucast br0 10.1.29.3
16  #       What interfaces to heartbeat over?
17 udp     eth0
18 #
19 #       Facility to use for syslog()/logger (alternative to log/debugfile)
20 #
21 logfacility     local3
22 #
23 #       Tell what machines are in the cluster
24 #       node    nodename ...    -- must match uname -n
25 node    cc
26 node    lm

其中我们要修改的就是接口和ip以及主机名。因为我的环境用的是桥接,所以设置是br0,ip为自己的ip(某些文章介绍是对方lb的ip),node后面的名称为uname -a得到的host name。

这样两台主备haproxy就配置好了。首先启动两台机器上的heartbeat:

/etc/init.d/heartbeat start

然后在lb1运行ip addr sh br0可以看到的显示内容如下:

 

[root@cc ha.d]# ip addr sh br0
5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue 
    link/ether d8:5d:4c:74:ee:e8 brd ff:ff:ff:ff:ff:ff
    inet 10.1.29.3/16 brd 10.1.255.255 scope global br0
    inet6 fe80::da5d:4cff:fe74:eee8/64 scope link 
       valid_lft forever preferred_lft forever

同样在lb2上运行ip addr sh br0:

 

[root@lm haproxy]# ip addr sh br0
4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue 
    link/ether e0:cb:4e:b8:19:16 brd ff:ff:ff:ff:ff:ff
    inet 10.1.29.1/16 brd 10.1.255.255 scope global br0
    inet 10.1.29.9/16 brd 10.1.255.255 scope global secondary br0:0
    inet6 fe80::e2cb:4eff:feb8:1916/64 scope link 
       valid_lft forever preferred_lft forever

这说明主机lb2进行代理工作,而备机lb1处于监听状态。然后拔掉主机lb1的网线,此时备机接替主机的工作成为服在均衡代理服务器,运行以上命令:

 

[root@cc ha.d]# ip addr sh br0
5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue 
    link/ether d8:5d:4c:74:ee:e8 brd ff:ff:ff:ff:ff:ff
    inet 10.1.29.3/16 brd 10.1.255.255 scope global br0
    inet 10.1.29.9/16 brd 10.1.255.255 scope global secondary br0:0
    inet6 fe80::da5d:4cff:fe74:eee8/64 scope link 
       valid_lft forever preferred_lft forever

 

 

 

这说明备机lb2已经接替了主机lb1的工作。我们再将主机lb1的网线插上,运行以上命令:

 

 

[root@lm haproxy]# ip addr sh br0
4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue 
    link/ether e0:cb:4e:b8:19:16 brd ff:ff:ff:ff:ff:ff
    inet 10.1.29.1/16 brd 10.1.255.255 scope global br0
    inet 10.1.29.9/16 brd 10.1.255.255 scope global secondary br0:0
    inet6 fe80::e2cb:4eff:feb8:1916/64 scope link 
       valid_lft forever preferred_lft forever
[root@cc ha.d]# ip addr sh br0
5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue 
    link/ether d8:5d:4c:74:ee:e8 brd ff:ff:ff:ff:ff:ff
    inet 10.1.29.3/16 brd 10.1.255.255 scope global br0
    inet6 fe80::da5d:4cff:fe74:eee8/64 scope link 
       valid_lft forever preferred_lft forever

说明主机和备机已经各自恢复。以上说明heartbeat运行正常。

 

然后在两台机器上运行haproxy,这样带有ha功能的haproxy就配置好了。