1. Haproxy介绍

Haproxy是一个开源的高性能的反向代理或者说是负载均衡服务软件之一,它支持双机热备、虚拟主机、基于TCP和HTTP应用代理等功能。其配置简单,而且拥有很好的对服务器节点的健康检查功能(相当于keepalived健康检查),当其代理的后端服务器出现故障时,Haproxy会自动的将该故障服务器摘除,当服务器的故障恢复后Haproxy还会自动将RS服务器假如。

Haproxy特别使用与那些访问量很大。但又需要会话保持或七层应用的业务。Haproxy运行在普通的服务器硬件上,仅仅进行简单的优化就可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合到各种网站的架构中,同时使得应用服务器不会暴露到网络中。

Haproxy软件引入了frontend,backend的功能,frontend(acl规则匹配)可以运维管理人员根据任意HTTP请求头做规则匹配,然后把请求定向到相关的backend(server pools等待前端把请求转过来的服务器组)。通过frontend和backup,我们可以很容易的实现haproxy的7层代理功能,haproxy是一款不可多得的优秀代理服务软件

Haproxy支持两种主要代理模式:第一个是4层tcp代理(例如:可用于邮件服务内部协议通信服务器、Mysql服务等)。第二个是7层代理(如HTTP代理)。在4层tcp代理模式下,Haproxy仅在客户端和服务器之间双向转发流量。但是在7层模式下Haproxy会分析应用层协议,并且能通过运行、拒绝、交换、增加、修改或者删除请求(request)或者回应(reponse)里指定内容来控制协议。

2. Haproxy解决方案拓扑图

2.1 Haproxy L4负载均衡应用架构拓扑

Haproxy软件的四层tcp代理应用非常优秀,配置非常简单方便,比LVS和Nginx要方便很多,因为不需要在RS端执行脚本即可实现应用代理。

说明:由于Haproxy采用的是NAT模式,数据包来去都会经过Haproxy,因此,在流量特别大的情况下,其性能不如LVS。

在一般的中小型公司,建议采用haproxy做负载均衡,而不要使用LVS或者Nginx。

2.2 Haproxy L7负载均衡应用架构拓扑

Haproxy软件的最大优点在于其7层的根据URL请求头应用过滤的功能,一般用在LVS软件的下一层,或者像官方推荐的可以挂在硬件负载均衡NS、F5下使用。

2.3 实施部署前主机规划列表

名称

接口

IP

用途

MASTER

eth0

192.168.1.81

外网管理IP,用于WAN数据转发

 

eth1

192.168.2.81

内网管理IP,用于LAN数据转发

 

eth2

192.168.3.81

用于服务器间心跳连接(直连)

vip

 

192.168.1.181

用于提供应用程序A挂载服务

BACKUP

eth0

192.168.1.82

外网管理IP,用于WAN数据转发

 

eth1

192.168.2.82

内网管理IP,用于LAN数据转发

 

eth2

192.168.3.82

用于服务器间心跳连接(直连)

vip

 

192.168.1.182

用于提供应用程序B挂载服务

此表为heartbeat+haproxy生产环境中的正式IP环境,haproxy做四层应用时的IP信息

2.4 实施部署环境

Haproxy所有实施部署环境和前面讲过的heartbeat的环境一模一样。因为在生产环境中,haproxy服务就是和heartbeat服务配合使用的,当然和keepalived服务配合也是可以的。

3. 安装Haproxy软件

3.1 安装

mkdir -p /home/yan/tools

cd /home/yan/tools

tar -xf haproxy-1.4.21.tar.gz

cd haproxy-1.4.21

make TARGET=linux26 ARCH=x86_64

make PREFIX=/application/haproxy-1.4.21 install

ln -s /application/haproxy-1.4.21/ /application/haproxy

3.2 配置Haproxy实现L4负载均衡

3.2.1 初始化Haproxy目录

cd /application/haproxy/

ll

3.2.2 创建Haproxy相关目录

mkdir -p bin conf logs var/run var/chroot

3.2.3  L4Haproxy的配置文件(conf目录下)

vim conf/haproxy.conf

global

chroot /application/haproxy-1.4.21/var/chroot

daemon

group haproxy

user haproxy

log 127.0.0.1:514 local0 info

pidfile /application/haproxy-1.4.21/var/run/haproxy.pid

maxconn 20480

spread-checks 3

#       tune.maxaccept 100

#       tune.maxpollevents 180

nbproc 8

defaults

log     global

mode    http

#       option  httplog

#       option  dontlognull

retries 3

option redispatch

contimeout      5000

clitimeout      50000

srvtimeout      50000

listen www01  192.168.1.81:80

mode http

no    option splice-response

stats enable

stats uri /admin?stats

stats auth proxy:oldboy

balance roundrobin  #轮询算法rr

option httpclose

option forwardfor  #记录客户端地址,而不是haproxy地址

option httpchk HEAD /checkstatus.html HTTP/1.0  #健康检查

server www01 192.168.1.80:80 check   #增加RS

server www02 192.168.1.100:80 check  #check:对端口做检查

添加一个haproxy用户

useradd haproxy -s /sbin/nologin -M

3.2.4 Haproxy启动脚本(bin目录下存放)

vim bin/haproxy

#!/bin/bash

BASE="/application/haproxy-1.4.21"

PROG=$BASE/sbin/haproxy

PIDFILE=$BASE/var/run/haproxy.pid

CONFFILE=$BASE/conf/haproxy.conf

case "$1" in

start)

#$PROG -f $CONFFILE >/dev/null 2>&1

$PROG -f $CONFFILE

;;

status)

if [ ! -f $PIDFILE ]; then

echo "pid not found"

exit 1

fi

for pid in $(cat $PIDFILE); do

kill -0 $pid

RETVAL="$?"

if [ ! "$RETVAL" = "0" ]; then

echo "process $pid died"

exit 1

fi

done

echo "process is running"

;;

restart)

$PROG -f $CONFFILE -sf $(cat $PIDFILE) >/dev/null 2>&1

;;

stop)

kill $(cat $PIDFILE)

;;

*)

echo "USAGE: $0 start|restart|status|stop"

exit 1

;;

esac

chmod 700 haproxy

3.2.5 启动Haproxy服务

/application/haproxy/bin/haproxy start

[WARNING] 162/092036 (34610) : Proxy 'www': in multi-process mode, stats will be limited to process assigned to the current request.

[ALERT] 162/092036 (34610) : Starting proxy www: cannot bind socket

原因是不存在VIP导致启动Haproxy报错,80端口已经启动产生冲突

解决方法

echo 'net.ipv4.ip_nonlocal_bind = 1'>>/etc/sysctl.conf

sysctl -p

并且关闭http服务

(net.ipv4.ip_nonlocal_bind=1  意思是启动haproxy的时候,允许忽视VIP的存在)

加入开机自启动

echo '/application/haproxy/bin/haproxy start' >> /etc/rc.local

检查服务:

ps -ef | grep haproxy | grep -v grep

haproxy   34645      1  0 09:31 ?        00:00:00 /application/haproxy-1.4.21/sbin/haproxy -f /application/haproxy-1.4.21/conf/haproxy.conf

haproxy   34646      1  0 09:31 ?        00:00:00 /application/haproxy-1.4.21/sbin/haproxy -f /application/haproxy-1.4.21/conf/haproxy.conf

haproxy   34647      1  0 09:31 ?        00:00:00 /application/haproxy-1.4.21/sbin/haproxy -f /application/haproxy-1.4.21/conf/haproxy.conf

haproxy   34648      1  0 09:31 ?        00:00:00 /application/haproxy-1.4.21/sbin/haproxy -f /application/haproxy-1.4.21/conf/haproxy.conf

haproxy   34649      1  0 09:31 ?        00:00:00 /application/haproxy-1.4.21/sbin/haproxy -f /application/haproxy-1.4.21/conf/haproxy.conf

haproxy   34650      1  0 09:31 ?        00:00:00 /application/haproxy-1.4.21/sbin/haproxy -f /application/haproxy-1.4.21/conf/haproxy.conf

haproxy   34651      1  0 09:31 ?        00:00:00 /application/haproxy-1.4.21/sbin/haproxy -f /application/haproxy-1.4.21/conf/haproxy.conf

haproxy   34652      1  0 09:31 ?        00:00:00 /application/haproxy-1.4.21/sbin/haproxy -f /application/haproxy-1.4.21/conf/haproxy.conf

3.2.6 Haproxy日志配置(cat /etc/syslog.conf)

yum -y install rsyslog

编辑/etc/rsyslog.conf  (末尾添加)

vim /etc/rsyslog.conf

#Haproxy

local0.*   /application/haproxy-1.4.21/logs/haproxy.log

#end /etc/rsyslog.conf

3.2.7 配置/etc/sysconfig/rsyslog

vim /etc/sysconfig/rsyslog

# Options to syslogd

# -m 0 disables 'MARK' messages.

# -r enables logging from remote machines

# -x disables DNS lookups on messages recieved with -r

# See syslogd(8) for more details

SYSLOGD_OPTIONS="-m 0 -r -x"

# Options to klogd

# -2 prints all kernel oops messages twice; once for klogd to decode, and

#    once for processing with 'ksymoops'

# -x disables all klogd processing of oops messages entirely

# See klogd(8) for more details

KLOGD_OPTIONS="-x"

#

SYSLOG_UMASK=077

# set this to a umask value to use for all log files as in umask(1).

# By default, all permissions are removed for "group" and "other".

重启日志服务

/etc/init.d/rsyslog restart

chkconfig rsyslog on

ps -ef | grep rsyslog | grep -v grep

root      34518      1  0 08:54 ?        00:00:00 /sbin/rsyslogd -i /var/run/syslogd.pid -m 0 -r -x

3.2.8 查看状态信息

检查备节点(192.168.1.82)http能正常访问

修改主节点(192.168.1.81)/application/haproxy/conf/haproxy.conf

vim /application/haproxy/conf/haproxy.conf

server www02 192.168.1.82:80 check

(wget 192.168.1.82能通但是浏览器中显示不正常,原因是走了健康检查了,将option httpchk HEAD /checkstatus.html HTTP/1.0注释掉)

/application/haproxy/bin/haproxy restart

此时查看浏览器上www02已经变绿

访问192.168.1.81(主节点)跟192.168.1.82(备)结果相同,表示四层负载均衡已经OK

3.3 测试haproxy负载均衡和健康检查功能

修改主节点(192.168.1.81)/application/haproxy/conf/haproxy.conf

再添加一个server www03 192.168.1.85:80 check

重启服务:

/application/haproxy/bin/haproxy restart

当访问192.168.1.81时会在两台主机之间相互轮询切换

轮询访问结果测试

for((i=0;i<10;i++));do curl http://192.168.1.81;sleep 2;echo;done

4. Haproxy健康检查功能

4.1 基于端口的健康检查配置

server www01 192.168.1.80:80 check

server www02 192.168.1.82:80 check

server www03 192.168.1.85:80 check

补全上面配置结果

server www01 192.168.1.80:80 cookie www01 check port 80 inter 5000 fall 5

提示:

1)check port 80 表示对80端口进行健康检查

2)inter 5000 fall 5 表示每5秒检查一次,一共检查5次。如果有问题就会摘掉出问题的机器。

3)如果结尾不加inter 5000 fall 5,则默认每2秒检查一次,一共检查3次。如果有问题就会摘掉出问题的机器。

4)The default

values are the following ones :

- inter : 2000  意思是不加该参数,正常情况默认没两秒检查一次

- rise  : 2  意思是不加该参数,在RS宕机后恢复前,检查2次OK,认为其复活,并加入到群组中

- fall  : 3  意思是不加该参数,检查3此后,认为RS宕机,剔除集群组

- port  : default server port  不加该参数,默认就是端口检查

- addr  : specific address for the test (default = address server)

4.2 基于URL的健康检查

1)基于IP的URL健康检查

option httpchk HEAD /checkstatus.html HTTP/1.0

server tmpbai51 192.168.1.51:80 maxconn 2048 weight 8 check inter 3000 fall rise 2

server tmpbai53 192.168.1.53:80 maxconn 2048 weight 8 check inter 3000 fall rise 2

server tmpbai54 192.168.1.54:80 maxconn 2048 weight 8 check inter 3000 fall rise 2

当打开option httpchk HEAD /checkstatus.html HTTP/1.0进行URL健康检查时浏览器上显示都是红色,原因是没有checkstatus.html

解决办法在apache站点目录下创建checkstatus.html,或者将checkstatus.html改为index.html

此时浏览器上的检查条目会变绿

2)基于域名的URL健康检查:

option httpchk HEAD /index.jsp HTTP/1.1\r\nHost:\ www

URL健康检查实践测试:实际上haproxy就是相当于用下面的方式在访问RS节点确认是否正常

curl http://192.168.1.82/checkstatus.html

3)第一种HEAD配置方法

option httpchk HEAD /checkstatus.html HTTP/1.0

这种检测方式就相当于curl http://192.168.1.82/checkstatus.html

4)健康检查的频率、时间等参数

maxconn 2048 最大连接数,连接数不是越大越好,衡量服务器的承受能力,设置其能承受的最大值不至于把服务器压垮

weight 8  权重(权重越大,承受的访问量越大)

5)第二种GET配置方法

option httpchk GET /checkstatus.html

5. Haproxy的相关生产功能应用

5.1 haproxy高可用参数backup功能测试

tail -3 haproxy.conf

server www02 192.168.1.82:80 check

#server www03 192.168.1.85:80 check

server www21 192.168.1.85:80 check backup

打开浏览器

此时访问192.168.1.81(主节点)只能访问到192.168.1.82,不会轮询到85主机

当82主机宕掉后会立马切换到85主机

5.2 haproxy下的RS无法记录客户真实IP问题

当查看82主机的http日志是发现访问IP都是81,不会记录真实主机的IP

解决办法:

1)在haproxy配置文件里加如如下参数:

listen www

......

option forwardfor

.......

提示:参数最好放在listen www里面

2)在RS上对日志格式进行修改

//传统日志和后抛Netscaler负载均衡的apache日志比较

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

LogFormat "\"%{X-Forwarded-For}i\"%l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

此时再从笔记本访问后查看82的日志,里面记录的就是笔记本的真实IP了,不是haproxy主机的IP

3)生产环境负载均衡后面的RS服务器不记录负载均衡的健康检查日志:

虚拟主机不记录健康检查文件日志(check.txt):

SetEnvIf Request_URL "^/check\.txt$" dontlog

LogLevel warn

ErrorLog /var/log/httpd/vhost_error.log

CustomLog /var/log/httpd/vhost_access.log combined env=!dontlog

5.3 在配置内核参数开发转发功能

在/etc/sysctl.conf中加入如下配置

net.ipv4.ip_forward=1

sysctl -p

6. Haproxy双机双主的相关生产应用

6.1 主备Haproxy配置文件区别

主备Haproxy配置文件完全一样,没有任何不同

将主节点的配置文件全部拷贝到备节点,启动服务

修改配置文件/application/haproxy/conf/haproxy.conf

listen www

bind 192.168.1.181:80

将IP改为VIP地址

重启服务

此时访问VIP:192.168.1.181

6.2 Haproxy主从端分别开启转发功能:

vim /etc/stsctl.cinf

net.ipv4.ip_forward = 1

sysctl -p

6.3 生产环境防火墙iptables配置建议

(生产环境高访问量站点防火墙可能对LB性能有影响,最后前端加硬件防火墙或者干脆不用防火墙)

6.4 heartbeat与haproxy关联问题

在生产环境中,haproxy可能会配置heartbeat或keepalived使用,当Haproxy无法提供服务时,要不要把服务推到备机?

一般情况这个问题不会发生,如果严格去做的话可以单独写一个守护进程脚本,当haproxy一宕的时候,停掉heartbeat。

6.5 haproxy日志配置优化

将配置文件/application/haproxy/conf/haproxy.conf中的日志改为

log 127.0.0.1:514 local0 waring

6.6 haproxy多业务多VIP的配置

vim /application/haproxy/conf/haproxy.conf

global

chroot /application/haproxy-1.4.21/var/chroot

daemon

group haproxy

user haproxy

log 127.0.0.1:514 local0 warning

pidfile /application/haproxy-1.4.21/var/run/haproxy.pid

maxconn 20480

spread-checks 3

#       tune.maxaccept 100

#       tune.maxpollevents 180

nbproc 8

defaults

log     global

mode    http

#       option  httplog

option httpclose

#       option  dontlognull

stats enable

stats uri /admin?stats

stats auth proxy:oldboy

cookie SERVERID insert

retries 3

option redispatch

contimeout      5000

clitimeout      50000

srvtimeout      50000

listen www

bind 192.168.1.181:80

mode http

balance roundrobin

option forwardfor

option httpchk HEAD /checkstatus.html HTTP/1.0

server www01 192.168.1.80:80 check

server www02 192.168.1.82:80 check

server www21 192.168.1.85:80 check

listen ssh

bind 192.168.1.181:900

mode tcp

balance roundrobin

server ssh85 192.168.1.82:22 check

启动后连接ssh -p900 yan@192.168.1.81测试

6.7 haproxy多实例解决方案

在/application/haproxy/conf/下再添加一个配置文件,比如haproxy.conf.simple-L4

(注意,两个配置文件pid文件名不能一样,listen不能一样,bind不能一样)

vim /application/haproxy/conf/haproxy.conf.simple-L4

启动实例:

/application/haproxy/sbin/haproxy -f haproxy.conf.simple-L4

检查:ps -ef | grep haproxy

6.8 heartbeat与haproxy配合生产场景维护

6.9 查看服务是否正常及VIP情况

查看日志情况

tail -f /application/haproxy/logs/haproxy.log

tail -f /var/log/heartbeat.log

tail -f /var/log/messages

7. haproxy的L7生产应用实践

7.1 rs web server测试环境准备

在/var/下分别建立php nginx resin3个站点目录,并增加index文件及内容,假设PHP,nginx、resin分别代表不同的业务服务:

PHP  表示动态php程序服务

nginx表示静态图片、js、html等服务

resin表示动态jsp/java服务

操作命令:

for name in php nginx resin;do mkdir -p /var/$name;echo $name > /var/$name/index.html;done

检查:

for name in php nginx resin;do cat /var/$name/index.html;done

安装httpd:

yum -y install httpd

添加虚拟主机

编辑httpd-vhost.conf最下面加

vim /etc/httpd/conf.d/httpd-vhost.conf

<Directory "/var">

Options FollowSymLinks

AllowOverride none

Order allow,deny

Allow from all

</Directory>

NameVirtualHost *:8000

NameVirtualHost *:9000

NameVirtualHost *:10000

<VirtualHost *:8000>

ServerAdmin 824412801@qq.com

ServerName nginx.yan.org

ServerAlias yan.org

DocumentRoot "/var/nginx"

</VirtualHost>

<VirtualHost *:9000>

ServerAdmin 824412801@qq.com

ServerName php.yan.org

DocumentRoot "/var/php"

</VirtualHost>

<VirtualHost *:10000>

ServerAdmin 824412801@qq.com

ServerName resin.yan.org

DocumentRoot "/var/resin"

</VirtualHost>

vim /etc/httpd/conf/httpd.conf  增加监听端口

Listen 8000

Listen 9000

Listen 10000

检查语法:

/etc/init.d/httpd configtest

重启:

/etc/init.d/httpd restart

7.2 实现haproxy301域名跳转

主节点(192.168.1.81)操作

修改笔记本hosts文件:

vim /etc/hosts (将虚拟主机的域名解析为haproxy配置文件bind中的IP)

192.168.1.81 nginx.yan.org php.yan.org resin.yan.org yan.org

修改主节点(192.168.1.81)haproxy配置文件

vim /application/haproxy/conf/haproxy.conf

global

chroot /application/haproxy-1.4.21/var/chroot

daemon

group haproxy

user haproxy

#log 127.0.0.1:514 local0 info

log 127.0.0.1:514 local0 warning

pidfile /application/haproxy-1.4.21/var/run/haproxy.pid

maxconn 20000

spread-checks 3

nbproc 8

defaults

log     global

mode    http

retries 3

option redispatch

contimeout      5000

clitimeout      50000

srvtimeout      50000

stats enable

stats hide-version

stats uri /admin?stats

stats auth proxy:123456

option httpclose

frontend webserver

bind 192.168.1.81:80

#1)301×

#èó1.yan.org -->nginx.yan.org  ¨301

#(short_domר hdr°üHost -i(·ó) yan.org

acl short_dom hdr(Host) -i yan.org

#prefix °×× ±¤·http://yan.org/a.html×http://nginx.yan.org/a.html

redirect prefix http://nginx.yan.org:8000 code 301 if short_dom

acl oldboy_static path_beg /nginx/

acl oldboy_php path_beg /php/

acl oldboy_java path_beg /resin/

acl oldboy_pic  path_end  .gif .png .jpg .css .js

acl iphone_users hdr_sub(user-agent)  -i iphone

redirect prefix http://3g-iphone.yan.org if iphone_users

acl android_users hdr_sub(user-agent)  -i android

redirect prefix http://3g-android.yan.org/ if android_users

use_backend nginxpools if oldboy_static or oldboy_pic

use_backend phppools if oldboy_php

use_backend javapools if oldboy_java

default_backend nginxpools

# nginx static contents

backend nginxpools

balance roundrobin

server oldboy_8000 192.168.1.80:8000

# php contents

backend phppools

balance roundrobin

server oldboy_9000 192.168.1.80:9000

# java contents

backend javapools

balance roundrobin

server oldboy_10000 192.168.1.80:10000

重启haproxy服务

/application/haproxy/bin/haproxy stop

/application/haproxy/bin/haproxy start

此时笔记本打开浏览器访问http://yan.org:8000 会跳转到http://nginx.yan.org:8000

7.3 实现haproxy基于url地址目录做7层跳转

acl oldboy_static path_beg /nginx/  #path_beg 域名后面是nginx时,把他定义为oldboy_static

acl oldboy_php path_beg /php/

acl oldboy_java path_beg /resin/

use_backend nginxpools if oldboy_static  #如果有oldboy_static就交给nginxpools

use_backend phppools if oldboy_php

use_backend javapools if oldboy_java

在真实服务器(192.168.1.80)上创建三个目录(nginx,php,resin):

mkdir /var/nginx/nginx

echo nginx123 > /var/nginx/nginx/index.html

mkdir /var/nginx/nginx

echo nginx123 > /var/nginx/nginx/index.html

mkdir /var/php/php

echo php123 > /var/php/php/index.html

mkdir /var/resin/resin

echo resin123 > /var/resin/resin/index.html

测试:

在客户机(笔记本)hosts文件加一条:192.168.1.80 nginx.yan.org php.yan.org resin.yan.org yan.org

浏览器访问http://nginx.yan.org:8000/nginx/

http://php.yan.org:9000/php/

http://resin.yan.org:10000/resin/

将客户机hosts改回192.168.1.81 nginx.yan.org php.yan.org resin.yan.org yan.org

浏览器访问http://nginx.yan.org/nginx/得到的结果为nginx123,说明跳转成功

以上内容实现了:

访问http://nginx.yan.org/nginx/  ==>nginxpools后端处理

访问http://nginx.yan.org/php/  ==>phppools后端处理

访问http://nginx.yan.org/resin/  ==>resinpools后端处理

7.4 实现haproxy基于文件扩展名做7层跳转

acl oldboy_pic  path_end  .gif .png .jpg .css .js

use_backend nginxpools if oldboy_static or oldboy_pic

测试:在nginx目录下放三张图片nginx.jpg  php.jpg  resin.jpg

当访问http://nginx.yan.org/nginx.jpg 会访问到图片

当访问http://resin.yan.org/resin.jpg 会访问到图片(跳转到nginx目录下找resin.jpg)

7.5 实现haproxy基于user_agent做7层跳转

acl iphone_users hdr_sub(user-agent)  -i iphone

redirect prefix http://3g-iphone.yan.org if iphone_users

acl android_users hdr_sub(user-agent)  -i android

redirect prefix http://3g-android.yan.org/ if android_users

问题1:rsyslog没有生成日志文件

解决办法:

1)vim /etc/rsyslog.conf 改为

local0.*   /var/log/haproxy.log

2)关闭selinux,重启rsyslog

此时/application/haproxy/logs/下会生成haproxy.log

问题2:日志文件没有记录日志,为空

解决:

编辑haproxy配置文件

vim /application/haproxy/conf/haproxy.conf  改为

log 127.0.0.1 local0 warning

8. Haproxy多种健康检查方法及实例

8.1 基于tcp端口的健康检查

使用这种检查方法,haproxy只会去检查后端server服务的对应端口,根据前面经验,我们知道这并不能保证服务的完全可用,但却可以作为辅助的检查手段,当在不是非常严格业务环境下也是可以用的,例如:前面讲解过的keepalived向下的健康检查默认就是基于端口的。对用户体验非常严格,就不要使用基于tcp端口的检查方式

8.4 基于具体业务域名的URL健康检查

基于域名的URL健康检查:实际上,可以理解为haproxy用下面的方式在访问RS节点确认是否正常来检查

curl http://www.yan.org/index.jsp 或 wget http://www.yan.org/index.jsp 方式

这种检测方式,适用于更精细的基于具体业务的检测需求。实际上是带着head host头部信息向下健康检查

它的使用语法如下:

option httpchk HEAD /index.jsp HTTP/1.1\r\nHost:\ www.yan.org

根据具体业务对应的域名来进行更细化的监控。可以用HEAD和GET方式

option httpchk HEAD /index.jsp? HTTP/1.1\r\nHost:\ nginx.yan.org

option httpchk GET /check.html HTTP/1.1\r\nHost:\php .yan.org

8.5 生产环境如何正确选择健康检查

1)常规业务可以使用基于tcp的方式做健康检查,我们在keepalived健康检查时就是这样做的,虽然,keepalived也支持url健康检查

2)由于基于URL的方式做健康检查相对来说也比较容易配置,所以推荐使用基于URL的健康检查

可以使用http://192.168.1.80/check.html的方式,也可以使用基于域名的http://www.yan.org/html方式,后者更高级一些

3)实际生产环境中,最重要最关键的是,我们设置的check.html能否真正的代表rs上的业务状态

4)对于用户体验比较高的业务,可以请开发人员设置更加深入的健康检查文件,例如:yan.php或yan.jsp,这个健康检查可以深入到数据库,存储及各个接口,如果之一出现异常我就摘除。

5)对于用户体验比较高的业务,除了健康检查文件更深入外,健康检查的频率、次数都要相应调整。例如:1秒检查一次,一次连不上就摘除RS

学习 Haproxy (二)的更多相关文章

  1. crawler4j 学习(二)

    crawler4j 学习(二) 实现控制器类以制定抓取的种子(seed).中间数据存储的文件夹.并发线程的数目: public class Controller { public static voi ...

  2. 从零开始学习jQuery (二) 万能的选择器

    本系列文章导航 从零开始学习jQuery (二) 万能的选择器 一.摘要 本章讲解jQuery最重要的选择器部分的知识. 有了jQuery的选择器我们几乎可以获取页面上任意的一个或一组对象, 可以明显 ...

  3. Android Animation学习(二) ApiDemos解析:基本Animators使用

    Android Animation学习(二) ApiDemos解析:基本Animatiors使用 Animator类提供了创建动画的基本结构,但是一般使用的是它的子类: ValueAnimator.O ...

  4. AspectJ基础学习之二搭建环境(转载)

    AspectJ基础学习之二搭建环境(转载) 一.下载Aspectj以及AJDT 上一章已经列出了他的官方网站,自己上去download吧.AJDT是一个eclipse插件,开发aspectj必装,他可 ...

  5. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  6. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  7. MyBatis学习系列二——增删改查

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...

  8. MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存

    目录(?)[-] 二SQL语句映射文件2增删改查参数缓存 select insert updatedelete sql parameters 基本类型参数 Java实体类型参数 Map参数 多参数的实 ...

  9. MyBatis学习 之 二、SQL语句映射文件(1)resultMap

    目录(?)[-] 二SQL语句映射文件1resultMap resultMap idresult constructor association联合 使用select实现联合 使用resultMap实 ...

  10. UML学习(二)-----类图

    UML学习(二)-----类图 http://www.cnblogs.com/silent2012/archive/2011/09/07/2169946.html http://www.cnblogs ...

随机推荐

  1. 案例八:shell自动化管理账本脚本

    该脚本目的帮助管理员创建账号.删除账号.锁定账号.解锁账号. #!/bin/bash #filename: #author: #date:2018-6-6 echo "用户管理程序" ...

  2. oracle plsql手动修改数据

    转至:https://blog.csdn.net/Ranchonono/article/details/87690830?spm=1001.2101.3001.6650.1&utm_mediu ...

  3. mapreduce类型对应

    public class OrderBean implements WritableComparable<OrderBean> { private Integer order_id; // ...

  4. Qt:QByteArray

    0.说明 QByteArray是存储二进制byte数组. 区别于QString:QByteArray中存储的全是byte,而QString中存储的全是16 bit Unicode码.QString是在 ...

  5. 关于SQL优化的辟谣

    列举一些关于 SQL 语句的谣言,避免一些生瓜蛋子面试的时候被另外一群生瓜蛋子的 SQL 优化宝典给坑了. 以下所有内容都是 SQL Server 中的,其他数据库只能参考和借鉴 一.全表扫描 全表扫 ...

  6. dependencies与devDependencies中应该放哪些依赖

    网上一般的解释都是,开发环境用devDependencies,生产环境用dependencies,说的很简明,但是这里有个问题是,哪些包需要放到devDependencies中,哪些包需要放到depe ...

  7. SQL Server的Linked Servers

    文章搬运自:SQL Server的Linked Servers(链接) 参考引用一下,感谢作者~ 我们在使用SQL Server时,有时会有这种需求,需要从一个SQL Server服务器A中,查询另一 ...

  8. SQL Server--插入一天数据返回ID值

    这里将该功能写成了一个存储过程, 本来只写Insert的话,返回1,即影响的行数,该数据没太大应用意义. 想在Insert的基础上,返回新添加的这条数据的ID,两种方法: 1 .添加第17行的Sele ...

  9. selenium+python安装

    整理了下selenium+python环境搭建,搭建了很多次但每次都还是手忙脚乱,今天用心整理下 selenium 是用于测试 Web 应用程序用户界面 (UI) 的常用框架,并且 Selenium ...

  10. 【二】遗传算法(GA)的MATLAB实现

    essay from:https://wenku.baidu.com/view/ce45bbf44693daef5ef73df3.html 一.MATLAB编程实现GA 二.MATLAB函数调用实现G ...