/ 中存储网

haproxy与Nginx的负载均衡容错功能测试对比

2013-09-22 16:18:01 来源:IT技术网

电商以及门户网站首要的要求就是稳定,并且能够自动实现后端服务器的健康监测,在后端服务器出现故障时,能够自动切换到健康的服务器上来。作为前端代理的杰出产品,nginx以其高稳定和高可用性赢得了众多运维人员的青睐,纷纷采用这个来使用来做自己的前端代理,先说明一下 nginx 的代理配置:

安装pcre插件,pcre是一个perl库,nginx 需要安装它,以便更好地支持配置中的正则表达式

wget  http://sourceforge.net/projects/pcre/files/pcre/8.32/pcre-8.32.tar.gz/download

tar zxvfpcre-8.32.tar.gz &&  cd  pcre-8.32

./configure   &&    make    &&   make install

下载 nginx 版本 , 当前稳定版本中最新的是 1.2.6 . Wget  http://nginx.org/download/nginx-1.2.6.tar.gz 

解压缩,编译,安装:

tar zxvf nginx-1.2.6.tar.gz   

cd    nginx-1.2.6

./configure  --user=www --group=www --prefix=/opt/soft/nginx  --with-http_stub_status_module --with-http_ssl_module --with-pcre=../pcre-8.32 --with-pcre-jit

nginx 编译时注意,nginx 1.2.1 版以上都不支持 pcre-8.30 以下的版本,故编译时候要指定 pcre 的位置:否则会报此类错误:ngx_regex.c:307: undefined reference to `pcre_free_study'

编译完成之后,make   &&  make install  进行安装

nginx.conf  文件配置如下:  

user  www www;

worker_processes 8;

error_log  logs/error.log crit;

pid        logs/nginx.pid;

worker_rlimit_nofile 51200;

events

{

use epoll;

worker_connections 51200;

}

http

{

include       mime.types;

default_type  application/octet-stream;

gzip on;

gzip_proxied any;

gzip_min_length  1024;

gzip_buffers     4 8k;

gzip_http_version 1.1;

gzip_types       text/plain text/css application/x-javascript application/javascript application/xml;

keepalive_timeout 120;

server_tokens off;

tcp_nodelay on;

client_header_buffer_size 4k;

open_file_cache max=51200 inactive=20s;

open_file_cache_valid 30s;

open_file_cache_min_uses 1;

upstream  web_test  {

server 192.168.10.2:80;

server 192.168.10.3:80;

}

   log_format  main  '$remote_addr - $remote_user [$time_local] $request '

'"$status" $body_bytes_sent "$http_referer" '

'"$http_user_agent" "$http_x_forwarded_for" "$request_time" "$upstream_addr" ';

access_log  /var/log/nginx/master.log main;

server

{

listen  80;

server_name  test.com;

location / {

proxy_next_upstream error timeout invalid_header http_404 http_502 http_503 http_504 http_500;

proxy_pass        http://web_test;

proxy_set_header   Host             $host;

proxy_set_header   X-Real-IP        $remote_addr;

proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

proxy_connect_timeout 200s;

proxy_read_timeout 200s;

proxy_send_timeout 200s;

}

这样在后端某 server 发生故障时,如报404 500  502 503 等错误时,即可实现自动容错,切换到第二台server进行响应。

这是通常情况下的负载均衡容错,他是建立在后端的server不能再响应用户请求的情况下才进行切换的,我们在日常工作中碰到了这么一种情况:

平时需要从第三方的一台server上接收数据,将接受过来的数据已链接的形式反馈给用户使用,碰到的问题是,当第三方的接收有问题时,数据无法接收,但是我们自己 server 并没有异常,照常响应用户请求,由于没有接受过来数据,所以用户看到的反馈结果为空,这样严重影响了用户体验,故采用下面一种方法,首先 check 一个 url ,用于判断与第三方的通信情况,如果正常,则第二个反馈给用户的数据链接正常调用;如果异常,则将所有的用户请求都转发到下一台server中,我尝试利用 nginx 来实现,无奈的是没有操作成功,故这里采用 haproxy 来实现

wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.8.tar.gz

tar zxvf haproxy-1.4.8.tar.gz   &&    cd haproxy-1.4.8

make TARGET=linux26 PREFIX=/opt/soft/haproxy

make install PREFIX=/opt/soft/haproxy

创建haproxy账户及账户组,以专门用于启动haproxy进程

groupadd haproxy

useradd -g haproxy haproxy

haproxy配置如下:

global

log 127.0.0.1  local1 notice

maxconn 4096

chroot /opt/soft/haproxy

uid 504

gid 504

daemon

quiet

nbproc  2

pidfile /opt/soft/haproxy/haproxy.pid

defaults

log     127.0.0.1 local0 err

mode    http

option  redispatch

option  dontlognull

option  httplog

timeout connect 10000ms

timeout client 30000ms

timeout server 300ms

retries 1

maxconn 20000

listen  test.com.cn     0.0.0.0:8020

mode    http

option  forwardfor

balance source

cookie  SERVERID

option  httpchk HEAD /quotedata/cachealert.aspx

server  server_A 192.168.10.2:80 check inter 1500  weight 10 cookie A

server  server_B 192.168.10.3:80 check inter 1500  weight 10 cookie B

这样,当server_A目录下的 cachealert.aspx 这个链接出现问题时,表示已无法接收第三方的数据,因此将所有的访问链接都转到server_B上