HAProxy安装与配置()

一、HAProxy概念


    HAProxy功能丰富,提供高可用性、负载均衡以及基于TCPHTTP应用的代理,易于扩展,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。根据官方数据,其最高极限支持10G的并发。

    HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上,HAProxy 甚至还支持 Mysql 的均衡负载。在4层模式下,HAProxy仅在客户端和服务器之间转发双向流量。7层模式下,HAProxy会分析协议,并且能通过允许、拒绝、交换、增加、修改或者删除请求(request)或者回应(response)里指定内容来控制协议,这种操作要基于特定规则。

    详情可以在HAProxy官方网站(http://haproxy.1wt.eu)可以下载配置说明文档(configuration.txt)和架构文件(architecture.txt)作为参考,目前HAProxy官网域名会跳转到http://www.haproxy.org/,已更换域名,最近发现网站和google一样不能访问,需要×××才可以,下载一个***fg742×××软件,我的网盘里有http://pan.baidu.com/s/1pNHqY ,直接在linux里×××,在另外一篇文章我会介绍。

    HAProxy有着成熟的状态监控,包括一个漂亮的web GUI界面。你可以通过浏览器看到所有服务器池的状态和统计信息,包括错误数、连接、请求率、健康检查信息等等。我们可以用它来做实时监控,通过API将相应数据返回给监控系统。它拥有非常不错的服务器健康检查功能,当其代理的后端服务器出现故障, HAProxy会自动将该服务器摘除,故障恢复后再自动将该服务器加入。自1.3版本开始还引入了frontend,backend,frontend根据任意HTTP请求头内容做规则匹配,然后把请求定向到相关的backend

2014619 HAProxy1.5.0发布了

相对于 1.4 版本来说,1.5 版本包括了许多新特性和性能改进:

支持 SNI/NPN/ALPN OCSPstapling 的原生 SSL

支持 IPv6 UNIXsockets

fullHTTP keep-alive for better support of NTLM and improved efficiency in staticfarms

HTTP/1.1compression (deflate, gzip) to save bandwidth

PROXYprotocol versions 1 and 2 on both sides

datasampling on everything in request or response, including payload

ACLs canuse any matching method with any input sample maps and dynamic ACLs updatablefrom the CLI stick-tables support counters to track activity on any inputsample custom format for logs, unique-id, header rewriting, and redirects

improvedhealth checks (SSL, scripted TCP, check agent, ...)

muchmore scalable configuration supports hundreds of thousands of backends andcertificates    without sweating.

dev26 开始,修复了一些 bug,对一些重要的东西进行了集成。

 

二、安装配置过程

    从官方网站:http://www.haproxy.org下载1.5.1最新版本,修复了一些严重bug,官方建议升级这个版本,把软件传到linux/usr/local/src/目录下,开始安装。操作系统为Centos-6.4-x86_64,内核版本为2.6.32-358.el6.x86_64

 

1、编译安装

[root@www~]# cd /usr/local/src/

[root@www~]# tar xf haproxy-1.5.1.tar.gz

[root@www~]# cd haproxy-1.5.1

[root@www~]# make TARGET=linux26 ARCH=x86_64 USE_LINUX_TPROXY=1

#TARGET是指定内核版本,ARCH指定CPU架构,我使用的是64bit系统,这里就是x86_64USE_LINUX_TPROXY是透明代理模块,如不需要,可以不加

[root@www~]# make install PREFIX=/usr/local/haproxy

 

2、安装完毕后,创建配置文件和启动文件。

[root@www~]# mkdir /etc/haproxy

[root@www~]# cp examples/haproxy.cfg /etc/haproxy

[root@www~]# cp examples/haproxy.init /etc/init.d/haproxy

[root@www~]# chmod +x /etc/init.d/haproxy

[root@www~]# ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/

[root@www~]# mkdir /usr/share/haproxy

 

3、编辑配置文件(两台Haproxy配置文件相同)

    HAProxy配置文件中分成五部分内容,当然这些组件不是必选的,可以根据需要选择作为配置。

    global:参数是进程级的,通常和操作系统(OS)相关。这些参数一般只设置一次,如果配置无误,就不需要再次配置进行修改;

    default:配置默认参数的,这些参数可以被利用配置到frontendbackendlisten组件;

    frontend:接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用后端的backend(可动态选择)

    backend:后端服务集群的配置,是真实的服务器,一个Backend对应一个或者多个实体服务器;

    listenFrontendBackend的组合体。

 

####################全局配置信息########################

global

         log 127.0.0.1 local0                    #日志级别[err warninginfo debug]

#         log 127.0.0.1 local3 err               #日志级别,随便设一个就可以

         maxconn 30000                           #最大连接数

         chroot /usr/share/haproxy               #运行的根目录

         uid 99                                  #所属运行用户的uid,也可使用"user+用户名“

         gid 99                                  #所属运行组的gid,也可使用"group+用户组“

         daemon                                  #守护进程运行

         nbproc 1                                #开启的进程数

         pidfile /usr/local/haproxy/haproxy.pid  #haproxy pid

         ulimit-n 65535                          #文件描述符的数量限制

        

         #turn on stats unix socket

         stats socket /usr/local/haproxy/stats   #单进程时有效

         stats timeout 10s

         stats maxconn 10

 

#####################默认参数设置######################

defaults

         log    global                           #应用全局的日志配置

         mode        http                        #http7层模式( 如果四层和七层混用,这里不要设置,否则tcp模式会报错)

         retries      3                          #三次连接失败就认为是服务器不可用,也可以通过后面设置

         option       redispatch                 #serverId对应的服务器挂掉后,强制定向到其他健康的服务器

         option       abortonclose               #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接

         option       dontlognull                #保证HAProxy不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包

         maxconn  40000                          #默认的最大连接数

         timeout    connect    10000             #连接超时(毫秒)一般10秒就可以了,根据情况设定,时间太短,可能会有408错误

         timeout    http-request    30s          #请求超时时间

         timeout    queue       1m               #队列超时间

         timeout    connect    30s               #连接超时时间,一般10s就可以,但有的网站偶尔10s不能完成请求,会有408错误

         timeout    client  1m                   #客户端超时

         timeout    server 1m                    #服务器超时

         timeout    http-keep-alive10s           #存活请求时间为超时时间

         timeout    check        30s             #心跳检测超时

#        contimeout 5000                         # 设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,新版本的haproxy使用timeout connect替代,该参数向后兼容

#        clitimeout 50000                        #设置连接客户端发送数据时的成功连接最长等待时间,默认单位是毫秒,新版本haproxy使用timeout client替代。该参数向后兼容

#        srvtimeout 50000                        #设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒,新版本haproxy使用timeout server替代。该参数向后兼容

 

####################监控页面的设置#######################

listenhaproxy_stats

         bind 0.0.0.0:8080                       #监听端口

         mode        http                        #http7层模式

         option      httplog                     #采用http日志格式

         maxconn 10                              #最大连接数

         stats  uri       /haproxy-stats         #统计页面url

         stats  realm     Statistics\ Report     #统计页面密码框上提示文本

         stats  refresh 10s                      #统计页面自动刷新时间

         stats  auth    admin:123456             #统计页面用户名和密码设置

         stats  hide-version                     #隐藏统计页面上HAProxy的版本信息

         stats  admin if TRUE                    #手工启用/禁用,后端服务器(haproxy-1.4.9以后版本)

        

         errorfile 400/etc/haproxy/errorfiles/400badreq.http    #错误页面设置

         errorfile 408 /dev/null          # workaround Chrome pre-connect bug

         errorfile 403 /etc/haproxy/errorfiles/403forbid.http

         errorfile 503/etc/haproxy/errorfiles/503sorry.http

 

#################HAProxy的日志记录内容设置###################

         # log the name of the virtual server

         capture request  header Host len 20

         # log the amount of data uploadedduring a POST

         capture request  header Content-Length len 10

         # log the beginning of the referrer

         capture request  header Referer len 20

         # server name (useful for outgoingproxies only)

         capture response header Server len 20

         # logging the content-length is usefulwith "option logasap"

         capture response header Content-Lengthlen 10

         # log the expected cache behaviour onthe response

         capture response header Cache-Controllen 8

         # the Via header will report the nextproxy's name

         capture response header Via len 20

         # log the URL location during aredirection

         capture response header Location len 20

 

#######################网站监测listen配置#####################

#可以使用listen形式,也可以使用FrontendBackend形式,建议使用以下形式,易于服务器的扩展

frontendhttp_80_in

         bind 0.0.0.0:80         #监听是所有ip80端口,如果要使用虚ip自动切换故障,不要指定某一个ip,服务会无法启动的

         mode http

         log    global

         option       httplog

         option       http-server-close     #对于某些server端不支持http长连接的情况,利用这个参数可以使用客户端到haproxy是长连接,而haproxyserver端是短连接

         option       forwardfor  except 127.0.0.0/8 header X-Forwarded-For     #后端服务器需要获得客户端的真实IP,将从Http Header中获得客户端IP

######################ACL策略定义###################

#如果请求的域名满足正则表达式返回true -i是忽略大小写

#       acl  ali_web  hdr_reg(host) -i ^(www.test.cn|ww1.test.cn)$

#如果请求域名满足blog.test.cn返回 true -i是忽略大小写

#       acl  ali_blog  hdr_dom(host) -i blog.test.cn

#       use_backend  server_web if  ali_web

#       use_backend  server_blog  if  ali_blog

        default_backend web_cluters                   #指定默认的后端服务器


backend  web_cluters              #webserver作用域

         mode http                #上边设置了,可以不设

#       source 0.0.0.0 usesrc clientip #全透明代理传递客户端真实ip,需将后端服务器网关指向自己,要内核支持

#       balance leastconn         #最少连接者先处理

         balance  roundrobin      #轮询

#       balance  source           #NginxIP_hash机制类似,作为解决session问题的一种方法

#       balance  static-rr        #权重

#       balance  ri               #根据请求的URI

#       balance  rl_param         #根据请求的URl参数'balanceurl_param' requires an URL parameter name

#       balance  hdr(name)        #根据HTTP请求头来锁定每一次HTTP请求

#       balance  rdp-cookie(name) #表示根据据cookie(name)来锁定并哈希每一次TCP请求

#       option   httpchk          #URi健康检查

#       option httpchk HEAD /test.php HTTP/1.0

#       option httpchk GET /test.php

         cookie SERVERID

         server iask50 192.168.200.50:80 cookieask50 weight 1 check inter 2s rise 2 fall 3 maxconn 30000

         server iask51 192.168.200.51:80 cookieask51 weight 1 check inter 2s rise 2 fall 3 maxconn 30000

         server iask52 192.168.200.52:80 cookieask52 weight 1 check inter 2s rise 2 fall 3 maxconn 30000

#       server iask50 web1.ha.com:80 cookie ask50weight 1 check inter 2s rise 2 fall 3 maxconn 30000

#       server iask51 web2.ha.com:80 cookie ask51weight 1 check inter 2s rise 2 fall 3 maxconn 50000

#cookie iask50表示serveridiask50 weigh 权重,checkinter 2s健康频率,rise 22次正确认为服务器可用,fall 33次失败认为服务器不可用

 

#backend server_web

#       mode     http

#       balance  roundrobin

#       option httpchk HEAD /test.html HTTP/1.0

#       cookie SERVERID

#       server web53 192.168.200.53:80 cookie web53weight 1 check inter 2s rise 2 fall 3 maxconn 30000

#       server web54 192.168.200.54:80 cookie web53weight 1 check inter 2s rise 2 fall 3 maxconn 30000

 

#backend server_blog

#       mode    http

#       balance roundrobin

#       option httpchk HEAD /test.html HTTP/1.0

#       cookie SERVERID

#       server blog55 192.168.200.55:80 cookie blog55weight 1 check inter 2s rise 2 fall 3 maxconn 30000

#       server blog56 192.168.200.56:80 cookie blog56weight 1 check inter 2s rise 2 fall 3 maxconn 30000

 

[root@www~]# service haproxy start

 

wKioL1PEwhDhgQ4zAAKGGcloO0E846.jpg

wKiom1PEwkTgE5CLAAKE7Rc7DUY121.jpg

wKioL1PEwhmzImScAAKGiWOHkwo005.jpg

    HAProxy自己是不能生成日志的,需要系统的rsyslog来记录日志,在rsyslog.conf中开启udp 514的日志收集

[root@www~]# vim /etc/rsyslog.conf

取消以下两行的注释

#Provides UDP syslog reception

$ModLoadimudp

$UDPServerRun514

新增以下条目

local3.*                                               /var/log/haproxy.log

local0.*                                               /var/log/haproxy.log

重启rsyslog服务

[root@www~]# /etc/init.d/rsyslog restart

查看haproxy.log

# tail-f /var/log/haproxy.log

Jun 3016:16:03 localhost haproxy[5309]: 192.168.100.202:52597 [30/Jun/2014:16:16:03.396]http_80_in web_cluters/iask50 0/0/0/2/2 200 265 - - ---- 1/1/0/0/0 0/0"GET / HTTP/1.1"

Jun 3016:16:03 localhost haproxy[5309]: 192.168.100.202:52597[30/Jun/2014:16:16:03.396] http_80_in web_cluters/iask50 0/0/0/2/2 200 265 - ----- 1/1/0/0/0 0/0 "GET / HTTP/1.1"

Jun 3016:16:04 localhost haproxy[5309]: 192.168.100.202:52599[30/Jun/2014:16:16:04.847] http_80_in web_cluters/iask52 0/0/1/3/4 200 265 - ----- 1/1/0/0/0 0/0 "GET / HTTP/1.1"

Jun 3016:16:04 localhost haproxy[5309]: 192.168.100.202:52599[30/Jun/2014:16:16:04.847] http_80_in web_cluters/iask52 0/0/1/3/4 200 265 - ----- 1/1/0/0/0 0/0 "GET / HTTP/1.1"

 

HAproxy日志级别有tcphttp2种,以上边http日志为例来说明

Jun 3016:16:03                请求结束时间

localhost                     这个大家也知道

haproxy[5309]                 haproxy pid

192.168.100.202:52573         客户端源地址源端口

[30/Jun/2014:16:16:03.396]    请求开始时间

http_80_in                    集群名称

web_cluters/iask50            backend名称/后端server名称

0/0/1/1/2Tq/Tw/Tc/Tr/Tt

Tq 等待客户端发送完整的http请求的时间 -1 表示在接收http响应之前断开连接)

Tw 请求在队列中等待的时间 -1 表示请求到达队列之前 断开连接)

Tc 与后端server建联的总时间 包括重试时间 -1 表示请求与后端建联过程中 断开连接)

Tr 等待后端server 发送一个完整http响应总时间 不包括实体内容(-1 代表在等待发送响应之前 断开连接)

Tt 从接受请求到关闭连接的总时间

200 HTTP响应代码

265 接收到该请求返回的数据大小(包括HTTP头)单位是字节

- 响应的cookie

---- 请求终止状态

1/1/0/0/0actconn/feconn/beconn/srv_conn/retries

actconn 是指会话记录过程中进程并发连接数(好像跟系统文件描述符相关)

feconn 是指会话记录过程中frontend中的并发连接数(frontend级别的)

beconn 是指会话记录过程中backend中已经建立握手的并发连接数(backend 级别的)

srv_conn是指会话记录过程中活跃的并发连接数

retries 是指会话记录过程中重试后端server的次数

0/0srv_queue/backend_queue

srv_queue处理改请求时 server端的队列正在处理的连接数

backend_queue处理改请求是 backend队列正在处理的连接数

更多详细信息,可以到官网中查看

http://cbonte.github.io/haproxy-dconv/configuration-1.5.html

 

三、Haproxy界面


    访问http://192.168.100.201/haproxy-stats,输入帐号admin密码123456进入管理监控平台。

wKioL1PEwyShiooSAAdhuCnbNsU372.jpg

wKiom1PEw2Xidw7JAAcfzKMe5BU880.jpg

HAProxy-1.4.9以后版本最大的亮点是添加了手工启用/禁用功能,对升级变更应用时非常有用。

 

四、Keepalived的安装与配置


1、下载Keepalived安装包

[root@www~]# wget http://www.keepalived.org/software/keepalived-1.2.12.tar.gz -P/usr/local/src

2、安装

[root@www~]# yum install -y kernel-devel openssl-* gcc gcc-c++

[root@www~]# ln -s /usr/src/kernels/`uname -r`/ /usr/src/linux

[root@www~]# cd /usr/local/src

[root@www~]# tar -xf keepalived-1.2.12.tar.gz

[root@www~]# cd keepalived-1.2.12

[root@www~]# ./configure --prefix=/usr/local/keepalived

[root@www~]# make && make install

[root@www~]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/

[root@www~]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

[root@www~]# mkdir -pv /etc/keepalived

[root@www~]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

[root@www~]# ln -s /usr/local/keepalived/sbin/keepalived /sbin/

3、编辑配置文件

[root@www~]# vim /etc/keepalived/ keepalived.conf

!Configuration File for keepalived

 

global_defs{

    notification_email {

        sysadmin@localhost                      #设置报警邮件地址,可以设置多个,每行一个。需要开启本机的sendmail服务或者有其它邮件服务器

    }

 

    notification_email_from sysadmin@localhost  #设置邮件的发送地址

    smtp_server192.168.200.1                    #设置SMTP SERVER地址

    smtp_connect_timeout30                      #设置连接SMTPSERVER的超时时间

    router_id LVS_DEVEL                         #表示Keepalived服务的一个标识,发邮件时显示在邮件主题中的信息

}

 

vrrp_scriptchk_haproxy {

    script "killall -0 haproxy"

    interval 2

    weight -2

}

 

vrrp_instanceVI_1 {

    state MASTER                            #指定Keepalived的角色,从为BACKUP

    interface eth0                          #指定HA监测网络的接口

    virtual_router_id 51                    #路由ID,可以通过tcpdump vrrp查看,不要和其它服务冲突

    priority 101                            #从优先级为100

    advert_int 1                            #检测频率为1

    authentication {

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

        auth_pass 1111                      #设置验证密码,同一个vrrp_instance下,MASTERBACKUP的密码必须一致才能正常通信

    }

    virtual_ipaddress {

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

    }

    track_script {

        chk_haproxy

    }

}

 

haproxy健康检查还可以写个脚本,当haproxy当掉,自动重启haproxy,如果启动失败,关闭keepalived服务。

[root@www~]# vim /etc/keepalived/check_haproxy.sh

#!/bin/bash

A=`ps -Chaproxy --no-header |wc -l`

if [ $A-eq 0 ];then

    /usr/local/haproxy/sbin/haproxy -f/usr/local/haproxy/conf/haproxy.cfg

    sleep 3

    if [ `ps -C haproxy --no-header |wc-l` -eq 0 ];then

        /etc/init.d/keepalived stop

    fi

fi

这样可以保证,不会因为系统其它原因,造成虚ip不能立即自动切换。

如果有开启了iptables,还要设置一下,否则vrrp广播会被拦截,造成两边都有虚ip

[root@www~]# vim /etc/sysconfig/iptables

-A INPUT -p vrrp -j ACCEPT

-A INPUT -d224.0.0.18 -j ACCEPT

 

4、查看VRRP通讯记录

[root@www~]# tcpdump vrrp

wKioL1PExQ-CNI9iAAM8A-WyTag052.jpg