11月 19

pcduino对比测试nginx和haproxy的负载效果

  在pcduino上对比haproxy和nginx的负载效果

  安装haproxy
  下载地址
http://www.haproxy.org/download/1.4/src/haproxy-1.4.24.tar.gz

  安装如下
make TARGET=linux26 ARCH=arm PREFIX=/program/haproxy
make install PREFIX=/program/haproxy

配置如下:

global
        log 192.168.1.132   local0
        #log 127.0.0.1  local1 notice
        #log loghost    local0 info
        maxconn 4096
        chroot /program/haproxy
        uid 0                          #所属运行的用户uid
        gid 0                         #所属运行的用户组
        daemon
        nbproc 1
        pidfile /program/haproxy/run/haproxy.pid
        #debug
        #quiet

defaults
        log     global
        log     192.168.1.132       local3        #日志文件的输出定向
        mode    http                            #所处理的类别
        option  httplog                        #日志类别
        option  httpclose
        option  dontlognull
        option  forwardfor
        option  redispatch
        retries 2                      #设置多个haproxy并发进程提高性能
        maxconn 2000
        balance roundrobin                     #负载均衡算法
        stats   uri     /haproxy-stats        #haproxy 监控页面的访问地址
        # 可通过 http://localhost:1080/haproxy-stats 访问
        contimeout      5000
        clitimeout      50000
        srvtimeout      50000

listen  localhost 0.0.0.0:1080                   #运行的端口及主机名
        mode    http
        option  httpchk GET /           #健康检测地址
        server  s1 192.168.1.132:9900 weight 3 check
        server  s2 192.168.1.80:8880 weight 3 check

简单操作如下:
启动服务:
# /program/haproxy/sbin/haproxy -f /program/haproxy/haproxy.cfg

重启服务:
# /program/haproxy/sbin/haproxy -f /program/haproxy/haproxy.cfg -st `cat /program/haproxy/logs/haproxy.pid` (没有换行)

停止服务:
# killall haproxy

#./haproxy -h 说明
-v 屏蔽版本
-vv 编译选项
-V 版本
-d 前台,debug模式
-db 屏蔽后台模式
-D daemon模式启动
-q 安静模式,不输出信息
-c 对配置文件进行语法检查
-s 显示统计数据
-l 显示详细统计数据
-ds 不使用speculative epoll
-de 不使用epoll
-dp 不使用poll
-sf 程序启动后向pidlist里的进程发送FINISH信号,这个参数放在命令行的最后
-st 程序启动后向pidlist里的进程发送TERMINATE信号,这个参数放在命令行的最后

  安装nginx
  下载地址
http://nginx.org/download/nginx-1.5.6.tar.gz
  首先安装pcre。
ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.33.tar.gz
然后是configure、make、make install。
最后做个软连接。
ln -s /usr/local/lib/libpcre.so.1 /usr/lib/

  开始安装nginx编译参数如下
./configure –prefix=/program/nginx –user=root –group=root –with-pcre –with-select_module –with-poll_module –with-http_stub_status_module –with-http_ssl_module –with-http_realip_module –with-http_gzip_static_module
配置如下

user  root root;
worker_processes 1;
pid        logs/nginx.pid;
events {
    use epoll;
    worker_connections  5120;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens off;
    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_cache_status"';
    access_log  logs/access.log  main ;
    sendfile        on;
    keepalive_timeout  120;
    tcp_nodelay on;
    tcp_nopush on;
    client_header_buffer_size 128k;
    large_client_header_buffers 4 64k;
    reset_timedout_connection on;
    proxy_ignore_client_abort on;
   ######################################
   upstream  deploy_tool {
            server 192.168.1.132:9900;
       }
   server {
        listen       80;
        server_name 192.168.1.132;
        location / {
        proxy_pass_header      Server;
        proxy_redirect          off;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        Host $http_host;
        client_max_body_size   150m;
        proxy_connect_timeout  2000;
        proxy_send_timeout     2000;
        proxy_read_timeout     300;
        access_log off;
        proxy_pass              http://deploy_tool;
        }
        location /status {
             stub_status on;
             access_log  off;
             auth_basic_user_file    /lnmp/nginx/conf/htpasswd;
        }
     }
}

  WEB项目使用我的部署工具,只是连接到首页。python使用2.7。压力工具就是写了用urllib2多线程获取页面的代码,并发150个。测试结果如下:
haproxy:
haproxystatus
ubuntu
nginx:
nginxstatus
ubuntu-nginx

结论:
  如果只是简单反向连接,两者效率差不多。haproxy后端检测效果不错,对长连接的处理也很好,可做mysql等其他服务器的负载工作。nginx有更强大的模块,如缓存、uwsgi等功能一起用,nginx就方便了很多。以后WEB的服务使用nginx,其它需要负载的使用haproxy。

6月 23

keepalived 实现 HA || AS

【整理人:张子萌 2010-06-23】
使用keepalived实现HA(High Availability)的架构,解决双机热备工作。

keepalived进行简单配置后即可使用。对nginx、tomcat、nfs和ssh的服务进行了测试运行正常。使用ping命令测试切换,效果也比较理想。

1。环境介绍

操作系统使用CentOS5。
使用两台服务器,两台的基础IP为192.168.1.3和192.168.1.4,使用vip地址为192.168.1.10。

2。准备工作。

keepalived官方网站http://www.keepalived.org/

下载源码后编译需要使用gcc,如果系统没有需要安装。

3。编译安装

# tar zxvf keepalived-1.1.20.tar.gz
# cd keepalived-1.1.20
# ./configure –prefix=/ –mandir=/usr/local/share/man/ –with-kernel-dir=/usr/src/kernels/2.6.18-164.el5-x86_64
# make
# make install

4。配置部分

使用!和#做为注释符号。

主机部分
# vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
notification_email {
simon-zzm@163.com #发送告警的邮件
}
notification_email_from keepalived@liaojie.com
smtp_server 172.0.0.1 #如果本地安装sendmail,可以填写本地IP
smtp_connect_timeout 30
router_id liaojie_devel
}

vrrp_instance VI_1 {
state BACKUP
interface eth0 #绑定vip地址的网卡
garp_master_delay 10
smtp_alert
virtual_router_id 61
priority 150 #vrrp路由竞争级别
advert_int 1
authentication {
auth_type PASS
auth_pass abcd
}
virtual_ipaddress {
192.168.1.10
192.168.1.10 label eth0:1
}
}

备机部分
配置和主机一样 priority的值不一样,主备机之间数据推荐相距50以上。

问题1
在make时报错如下:
/usr/src/kernels/2.6.9-89.0.25.EL-i686/include/linux/types.h:158: error: syntax error before “__sum16”
/usr/src/kernels/2.6.9-89.0.25.EL-i686/include/linux/types.h:158: warning: type defaults to `int’ in declaration of `__sum16′
/usr/src/kernels/2.6.9-89.0.25.EL-i686/include/linux/types.h:158: warning: data definition has no type or storage class
/usr/src/kernels/2.6.9-89.0.25.EL-i686/include/linux/types.h:159: error: syntax error before “__wsum”
/usr/src/kernels/2.6.9-89.0.25.EL-i686/include/linux/types.h:159: warning: type defaults to `int’ in declaration of `__wsum’
/usr/src/kernels/2.6.9-89.0.25.EL-i686/include/linux/types.h:159: warning: data definition has no type or storage class
make[2]: *** [check_daemon.o] 错误 1
make[2]: Leaving directory `/usr/local/src/keepalived-1.1.20/keepalived/check’
make[1]: *** [all] 错误 1
make[1]: Leaving directory `/usr/local/src/keepalived-1.1.20/keepalived’
make: *** [all] 错误 2

解决方案如下:
将types.h调用的部分注释掉
vi /usr/src/kernels/2.6.9-89.0.25.EL-i686/include/linux/types.h
到158行操作如下
#endif /* __KERNEL_STRICT_NAMES */
/*
typedef __u16 __bitwise __sum16;
typedef __u32 __bitwise __wsum;
*/

注:编译没有报错,建议编译完成将注释去掉。

5月 16

haproxy 安装 配置

[整理人:张子萌 2010-4]

一、概述

测试环境

操作系统CentOS

VIP地址:192.168.11

负载到两台web地址:192.168.1.2和192.168.1.3

WEB服务器备用地址:192.168.1.4

二、下载、安装

下载地址:http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.5.tar.gz

# tar zxvf haproxy-1.4.5.tar.gz

# cd haproxy-1.4.5

# make TARGET=linux26 PREFIX=/usr/local/haproxy

编译过程中TARGET=linux26 为系统内核版本为2.6。

# make install PREFIX=/usr/local/haproxy

# mkdir –p /usr/local/haproxy/logs

# groupadd –g650 haproxy

# useradd -u650 -g haproxy haproxy

三、配置

默认配置可以参见编译环境中examples/haproxy.cfg

本文手动编辑配置文件

# /usr/local/haproxy

# vi haproxy.cfg

global

log 127.0.0.1 local0 #使用本机的syslog来记录log

log 127.0.0.1 local1 notice

#log loghost local0 info

maxconn 4096 # ulimit-n必须是maxconn的两倍以上

chroot /usr/local/haproxy

uid haproxy

gid haproxy

daemon

nbproc 2 #设置haproxy的并发进程

pidfile /usr/local/haproxy/logs/haproxy.pid

#debug

#quiet

defaults

log global

mode http

option httplog

option httpclose #启用被动的http连接关闭

option dontlognull

option forwardfor #apache日志转发功能

option redispatch # 不会连接到宕机服务器

option nolinger #在连接关闭时立即清理连接,减少FIN_WAIT1连接

retries 3 #web无法访问的重试次数

maxconn 2000

balance roundrobin

contimeout 5000

clitimeout 50000

srvtimeout 50000

listen test 192.168.1.1:80

mode http #监听模式”tcp”也即4层,和”http”,即7层

stats enable #打开状态监控

stats auth admin:admin #进入状态监控页面

stats refresh 5s

stats uri /haproxy-stats #状态监控后缀

balance roundrobin #负载算法 roundrobin(动态加权轮循)source(加权源地址哈希)

cookie JSESSIONID prefix #处理session

option forwardfor #apache日志转发功能

option httpchk HEAD /robots.txt HTTP/1.0 #健康检测连接和协议

option forwardfor # 插入 X-Forwarded-For 头部

server web1 192.168.1.2 weight 3 minconn 100 maxconn 900 check inter 20000 fall 3

# inter 健康检测间隔 20000微妙

server web2 192.168.1.3 weight 3 minconn 100 maxconn 900 check inter 20000 fall 3

server web3 192.168.1.4 weight 3 check inter 20000 fall 3 backup

errorfile 400 /etc/haproxy/errors/400.http #根据错误号,解析错误页面

四、启动

命令在/usr/local/haproxy/sbin.

haproxy -f <配置文件> [-n 最大并发连接总数] [-N 每个侦听的最大并发数] [-d] [-D] [-q] [-V] [-c] [-p] [-s] [-l] [-dk] [-ds] [-de] [-dp] [-db] [-m <内存限制M>] [{-sf|-st} pidlist…]

-d 前台,debug模式

-D daemon模式启动

-q 安静模式,不输出信息

-V 详细模式

-c 对配置文件进行语法检查

-s 显示统计数据

-l 显示详细统计数据

&nbsp
; -dk 不使用kqueue

-ds 不使用speculative epoll

-de 不使用epoll

-dp 不使用poll

-db 禁用后台模式,程序跑在前台

-sf 程序启动后向pidlist里的进程发送FINISH信号,这个参数放在命令行的最后

-st 程序启动后向pidlist里的进程发送TERMINATE信号,这个参数放在命令行的最后但配置后,死活不会输出日志,还没找到解决方法,网上有些,但行不通:

建议第一次运行建议使用前台模式便于调试

./haproxy –f /usr/local/haproxy/haproxy.cfg –d

五、优化

a)日志部分

健康检测会产生大量日志,建议屏蔽掉。

apache不记录健康检查和监控的log

SetEnvIf Request_URI “^//robots.txt$” dontlog

CustomLog output/logs/cookie_logs/%w/cookie_log cookielog env=!dontlog

六、常见问题

a) 启动失败

使用./haproxy –f /usr/local/haproxy/haproxy.cfg –d启动系统报错如下:

Starting haproxy: [ALERT] 015/191034 (15631) : Starting proxy webfarm: cannot bind socket…on both load balancers

[ALERT] 056/103843 (1358) : Starting proxy www-balancer: cannot bind socket

解法方法:

修改# vi /etc/sysctl.conf

net.ipv4.ip_nonlocal_bind=1

保存结果,使结果生效

# sysctl –p