首页 > 代码库 > HAProxy双机高可用之HAProxy+Keepalived

HAProxy双机高可用之HAProxy+Keepalived

Haproxy 

HAProxy 提供高可用性、负载均衡以及基于 TCP 和 HTTP 应用的代理,支持虚拟主机, 

它是免费、快速并且可靠的一种解决方案。HAProxy 特别适用于那些负载特大的 web 站 

点, 这些站点通常又需要会话保持或七层处理。HAProxy 运行在当前的硬件上,完全可 

以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前 

的架构中, 同时可以保护你的 web 服务器不被暴露到网络上。

wKiom1PmNt3xVWAfAAFdGIiIK8M855.jpg


 实验环境:rhel6.5 selinux and iptables disabled 

实验主机: 192.168.2.36  haproxy 

192.168.2.38  web1 

192.168.2.39  web2 

软件下载:http://haproxy.1wt.eu/ 

rpm 包方式: 

rpmbuild -tb haproxy-1.4.24.tar.gz

rpm -ivh /root/rpmbuild/RPMS/x86_64/haproxy-1.4.24x86_64.rpm 

源码方式: 

tar zxf haproxy-1.4.24.tar.gz 

cd haproxy-1.4.24

make TARGET=linux26 ARCH=x86_64 USE_PCRE=1 PREFIX=/usr/local/haproxy install 

在安装过程中可能需要一些依赖包

yum install pcre-devel  make gcc -y

#mkdir -p /usr/share/haproxy 

配置

vi /etc/haproxy/haproxy.cfg 

global 

log 127.0.0.1 local0 #指定日志设备 

log 127.0.0.1 local1 notice 

#log loghost local0 info #指定日志类型,还有 err warning debug 

maxconn 65535 #并发最大连接数量 

chroot /usr/share/haproxy #jail 目录 

uid 99 #用户 

gid 99 #组 

daemon #后台运行 

#debug 

#quiet 

defaults 

log 

global 

mode http #默认使用 http 的 7 层模式 tcp: 4 层 

option httplog #http 日志格式 

option dontlognull #禁用空链接日志 

retries 3 #重试 3 次失败认为服务器不可用 

option redispatch #当 client 连接到挂掉的机器时,重新分配到健康的主机 

maxconn 65535 

contimeout 5000  

#连接超时 

clitimeout 50000 #客户端超时 

srvtimeout 50000 #服务器端超时 

stats uri /status #haproxy 监控页面  

listen www.example.com *:80 #监听的实例名称,地址和端口

balance roundrobin #负载均衡算法

 server web1 192.168.2.38:80 cookie app1inst1 check inter 2000 rise 2 fall 5 

server web2 192.168.2.39:80 cookie app1inst2 check inter 2000 rise 2 fall 5 

#cookie app1inst1:表示 serverid 为 app1inst1 

#check inter 2000:检测心跳频率 

#rise 2:表示 2 次正确认为服务器可用 

#fall 5:表示 5 次失败认为服务器不可用 

# /etc/init.d/haproxy start 

访问 http://www.example.com 测试负载 网页在两个web上切换表示成功

访问 haproxy 监控页面:http://192.168.2.136/status 


wKioL1PmOBTQ8DBYAAHskXbGHHI069.jpgKeepalived+lvs 

系统负载均衡架构:

wKioL1PmOCngh8S9AAFM-NATRTs233.jpg


主机环境:RHEL6 系列 selinux and iptables disabled 

实验主机: 

LVS‐ACTIVE: 192.168.2.136 

LVS‐BACKUP:192.168.2.146 

LVS‐VIP:192.168.2.111

Realsever:192.168.2.38 192.168.2.39

主备机上的软件包安装与配置 

yum install ipvsadm kernel-devel openssl-devel popt-devel libnl-devel gcc make -y 

wget http://www.keepalived.org/software/keepalived-1.2.12.tar.gz 

tar zxf keepalived-1.2.5.tar.gz 

cd keepalived-1.2.5 

./configure --prefix=/usr/local/keepalived 

... 

Keepalived configuration 

------------------------ 

Keepalived version: 1.2.5 

Compiler: gcc 

Compiler flags: -g -O2 

Extra Lib: -lpopt -lssl -lcrypto -lnl 

Use IPVS Framework: Yes 

IPVS sync daemon support : Yes 

IPVS use libnl: Yes 

Use VRRP Framework: Yes 

Use VRRP VMAC: Yes 

SNMP support: No 

Use Debug flags: No 

#make 

#make install 

ln -s /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ 

ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ 

ln -s /usr/local/keepalived/etc/keepalived /etc/ 

ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin 

#vi /etc/keepalived/keepalived.conf 

! Configuration File for keepalived 

global_defs { 

notification_email { 

 root@localhost #接收警报的 email 地址,可以添加多个 

notification_email_from keepalived@desktop36.example.com #设置邮件的发送地址

smtp_server 127.0.0.1 #设置 smtp server 地址 

smtp_connect_timeout 30 #设置连接 smtp 服务器超时时间 

router_id LVS_DEVEL #load balancer 的标识 ID,用于 email 警报

vrrp_instance VI_1 { 

state MASTER #备机改为 BACKUP,此状态是由 priority 的值来决定的,当前 

priority 的值小于备机的值,那么将会失去 MASTER 状态 

interface eth0 #HA 监测网络接口 

virtual_router_id 51 #主、备机的 virtual_router_id 必须相同,取值 0-255 

priority 100 #主机的优先级,备份机改为 50,主机优先级一定要大于备机 

advert_int 1 #主备之间的通告间隔秒数 

authentication {            #主备切换时的验证 

auth_type PASS           #设置验证类型,主要有 PASS 和 AH 两种 

auth_pass 1111             #设置验证密码,在一个 vrrp_instance 下,MASTER 与 BACKUP 必 

                                        须使用相同的密码才能正常通信 

virtual_ipaddress { 

192.168.2.111 #设置虚拟 IP 地址,可以设置多个虚拟 IP 地址,每行一个

}  

virtual_server 192.168.2.111 80 {  #定义虚拟服务器 

delay_loop 6                                 #每隔 6 秒查询 realserver 状态 

lb_algo rr                                      #lvs 调度算法,这里使用轮叫 

lb_kind DR  #LVS 是用 DR 模式

#persistence_timeout 50           #会话保持时间,单位是秒,这个选项对于动态网页是非常有 

用的,为集群系统中 session 共享提供了一个很好的解决方案。有了这个会话保持功能,用户的 

请求会被一直分发到某个服务节点,直到超过这个会话保持时间。需要注意的是,这个会话保 

持时间,是最大无响应超时时间,也就是说用户在操作动态页面时,如果在 50 秒内没有执行任 

何操作,那么接下来的操作会被分发到另外节点,但是如果一直在操作动态页面,则不受 50 秒 

的时间限制。 

protocol TCP #指定转发协议类型,有 tcp 和 udp 两种

real_server 192.168.2.38 80 { #配置服务节点

weight 1 #配置服务节点的权值,权值大小用数字表示,数字越大,权 

值越高,设置权值的大小可以为不同性能的服务器分配不同的负载,可以对性能高的服务器设 

置较高的权值,而对性能较低的服务器设置相对较低的权值,这样就合理的利用和分配了系统 

资源 

 TCP_CHECK {  #realserve 的状态检测设置部分,单位是秒

connect_timeout 10 #10 秒无响应超时 

nb_get_retry 3 #重试次数 

delay_before_retry 3 #重试间隔 

real_server 192.168.2.39 80 { 

weight 1 

TCP_CHECK { 

connect_timeout 3 

nb_get_retry 3 

delay_before_retry 3 

virtual_server 192.168.2.111 21{   

delay_loop 6                                  

lb_algo rr                                      

lb_kind DR  

persistence_timeout 50             

protocol TCP 

real_server 192.168.2.38 21 {  

 TCP_CHECK {  

connect_timeout 10  

nb_get_retry 3  

delay_before_retry 3  

real_server 192.168.2.39 21 { 

weight 1 

TCP_CHECK { 

connect_timeout 3 

nb_get_retry 3 

delay_before_retry 3 

注:备机的 keepalived 配置文件只改动红色字体部分! 

分别在 realserver 上执行以下命令 

#ifconfig eth0:1 192.168.0.163 netmask 255.255.255.255  up

 #vim /etc/sysconfig/arptables  

 # Generated by arptables-save v0.0.8 on Fri Aug  8 06:12:56 2014 

*filter 

:IN ACCEPT [497:13916] 

:OUT ACCEPT [0:0] 

:FORWARD ACCEPT [0:0] 

[0:0] -A IN -d 192.168.2.111 -j DROP 

[0:0] -A OUT -s 192.168.2.111 -j mangle --mangle-ip-s 192.168.2.38 

COMMIT 

# Completed on Fri Aug  8 06:12:56 2014 

#/etc/init.d/arptables_jf restart 

#/etc/init.d/httpd stop 

#/etc/init.d/httpd start 

然后启动keepalived

#/etc/init.d/keepalived start

用ipvsadm -l查看连接状况

wKioL1PmOEbRlURTAAGkB-o-sWk885.jpg


测试

1. 高可用测试:停止 master 上的 keepalived 服务,看 backup 是否接管。 

2. 负载均衡测试:访问 http://192.168.2.111,看到页面在两个 realserver 上切换表示成功! 

你也可以通过 ipvsadm -l 查看详细连接情况! 

3. 故障切换测试:任意关闭 realserver 上的 httpd 服务,Keepalived 监控模块是否能及时发现, 

然后屏蔽故障节点,同时将服务转移到正常节点来执行。 

haproxy+keepalived (解决haproxy的单点故障)

MASTER: 

# vim keepalived.conf 

! Configuration File for keepalived 

  

vrrp_script check_haproxy { 

script "/etc/keepalived/check_haproxy" 

  

global_defs { 

   notification_email { 

        root@localhost 

   } 

   notification_email_from keepalived@desktop36.example.com 

   smtp_server 127.0.0.1 

   smtp_connect_timeout 30 

   router_id LVS_DEVEL 

  

vrrp_instance VI_1 { 

    state MASTER 

    interface eth0 

    virtual_router_id 51 

    priority 100 

    advert_int 1 

    authentication { 

 auth_type PASS 

        auth_pass 1111 

    } 

    virtual_ipaddress { 

        192.168.2.111 

    } 

        track_script { 

        check_haproxy 

   } 

BACKUP: 

# vim keepalived.conf 

 ! Configuration File for keepalived 

  

global_defs { 

   notification_email { 

        root@localhost 

   } 

   notification_email_from keepalived@desktop46.example.com 

   smtp_server 127.0.0.1 

   smtp_connect_timeout 30 

   router_id LVS_DEVEL 

  

vrrp_instance VI_1 { 

    state BACKUP 

    interface eth0 

    virtual_router_id 51 

    priority 50 

    advert_int 1 

    authentication { 

        auth_type PASS 

        auth_pass 1111 

    } 

    virtual_ipaddress { 

      192.168.2.111 

    } 

track_script { 

        check_haproxy 

   } 

检测脚本: 

# vim /etc/keepalived/check_haproxy.sh 

#!/bin/bash 

/etc/init.d/haproxy status &> /dev/null || /etc/init.d/haproxy restart &> /dev/null 

if [ $? -ne 0 ];then 

/etc/init.d/keepalived stop &> /dev/null 

fi 

假如说haproxy挂掉了,那keepalived就会停掉,而把haproxy转接到备机上,这样就解决了haproxy的单点故障问题。


本文出自 “9244137” 博客,请务必保留此出处http://9254137.blog.51cto.com/9244137/1537999