HAProxy负载均衡代理
1. HAProxy概述
HAProxy 提供高可用性、负载均衡以及基于 TCP 和 HTTP 应用的代理,支持虚拟主机,它是免费、快速而且可靠的一种解决方案。根据官方数据,其最高极限支持 10G 的并发。HAProxy 特别适用于那些负载特大的 web 站点, 这些站点一般又须要会话保持或七层处理。 HAProxy 运行在当前的硬件上,彻底能够支持数以万计的并发链接。而且它的运行模式使得它能够很简单安全的整合进您当前的架构中,同时能够保护你的 web 服务器不被暴露到网络上。其支持从 4 层至 7 层的网络交换,即覆盖全部的 TCP 协议。就是说,Haproxy 甚至还支持 Mysql 的均衡负载。
相同点:在功能上,proxy 经过反向代理方式实现 web 均衡负载,和 Nginx,ApacheProxy,lighttpd, Cheroke 等同样。
不一样点:Haproxy 并非 Http 服务器。以上提到全部带反向代理均衡负载的产品,都清一色是 WEB 服务器。简单说,就是他们能自个儿提供静态(html,jpg,gif..)或动态(php,cgi..)文件的传输以及处理。而 Haproxy 仅仅,并且专门是一款的用于均衡负载的应用代理。其自身并不能提供 http 服务。 但其配置简单,拥有很是不错的服务器健康检查功能还有专门的系统状态监控页面,当其代理的后端服务器出现故障, HAProxy 会自动将该服务器摘除,故障恢复后再自动将该服务器加入。
HAProxy 负载的几种方式:
1. 轮询 roundrobin
2. 最少链接数 Leastconn
3. 根据源IP source
4. 根据URI uri
5. 根据URL里的参数 url_param(根据请求串中的数据hush后作lb,譬如须要一个userid永远在某台服务器上,该策略是静态的
2.HAProxy 官网地址
http://www.haproxy.org/
3.Haproxy 实验拓扑
HaProxy分发器:192.168.42.175
Web1 (nginx)server:192.168.42.176
Web2 (nginx)server:192.168.42.177php
Haproxy服务端配置
[root@xuegod175 ~]# tar xvf haproxy-1.5.15.tar.gz -C /usr/local/src/
[root@xuegod175 ~]#cd /usr/local/src/haproxy-1.5.15/
[root@xuegod175 haproxy-1.5.15]# cat README | less //查看安装方式,比较特殊
[root@xuegod175 haproxy-1.5.15]# uname -a
Linux xuegod175.cn 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
[root@xuegod175 haproxy-1.5.15]# make TARGET=linux26 PREFIX=/usr/local/haproxy
//指定操做系统内核类型和安装的路径。也能够直接修改 Makefile 配置文件中这两个变量的值。以下:
[root@xuegod175 haproxy-1.5.15]# vim Makefile
添加:TARGET = linux26
[root@xuegod175 haproxy-1.5.15]# make install PREFIX=/usr/local/haproxy
[root@xuegod175 haproxy-1.5.15]# cd /usr/local/haproxy/
[root@xuegod175 haproxy]# ls
doc sbin share #没有配置文件目录
[root@xuegod175 haproxy]# mkdir /usr/local/haproxy/etc ; cd
[root@xuegod175 ~]# cp /usr/local/src/haproxy-1.5.15/examples/haproxy.cfg /usr/local/haproxy/etc/
html
[root@xuegod175 ~]# vim /usr/local/haproxy/etc/haproxy.cfg #global 全局,以全局定义为准 #defaults 默认,在全局的前提下,默认跟局部的配置,若是局部没说,那就按默认走,若是局部有定义那就按局部。 #frontend 前端,监听地址,监听端口,该如何处理。。。。。 #backend 后端服务器,定义那些真正处理业务的服务器Realserver. #listen 将frontend和backend 合体的一种方案 global log 127.0.0.1 local0 #log 127.0.0.1 local1 notice #log loghost local0 info maxconn 4096 chroot /usr/local/haproxy uid 99 #所属运行的用户uid gid 99 #所属运行的用户组 daemon #之后台形式运行haproxy nbproc 1 #启动1个haproxy实例。# #工做进程数量(CPU数量) ,实际工做中,应该设置成和CPU核心数同样。 这样能够发挥出最大的性能。 pidfile /usr/local/haproxy/run/haproxy.pid #将全部进程写入pid文件 #debug #调试错误时用 #quiet #安静 defaults log global log 127.0.0.1 local3 #日志文件的输出定向。产生的日志级别为local3. 系统中local1-7,用户本身定义 mode http #工做模式。所处理的类别,默认采用http模式,可配置成tcp做4层消息转发 option httplog #日志类别,记载http日志 option httpclose #每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只能模拟这种模式的实现 option dontlognull #不记录空链接,产生的日志 option forwardfor #若是后端服务器须要得到客户端真实ip须要配置的参数,能够从Http Header中得到客户端ip option redispatch #当serverid对应的服务器挂掉后,强制定向到其余健康服务器 retries 2 #2次链接失败就认为服务器不可用,主要经过后面的check检查 maxconn 2000 #最大链接数 balance roundrobin #负载均衡算法 stats uri /haproxy-stats #haproxy 监控页面的访问地址 # 可经过 http://localhost:80/haproxy-stats 访问 timeout connect 5000ms #链接超时时间。 单位:ms 毫秒, timeout client 50000ms #客户端链接超时时间, timeout server 50000ms #服务器端链接超时时间, listen localhost 0.0.0.0:80 #运行的端口及主机名 mode http option httpchk GET /index.html #健康检测。#注意实际工做中测试时,应该下载某一个页面来进行测试,所以这个页面应该是个小页面,而不要用首页面。这里是每隔一秒检查一次页面。 server s1 192.168.42.176:80 weight 3 check #后端的主机 IP &权衡 server s2 192.168.42.177:80 weight 3 check #后端的主机 IP &权衡
[root@xuegod175 ~]# id nobody //99 是 nobody 运行用户
uid=99(nobody) gid=99(nobody) groups=99(nobody)
[root@xuegod175 ~]# mkdir -p /usr/local/haproxy/run
[root@xuegod175 ~]# chown nobody /usr/local/haproxy/ -R
[root@xuegod175 ~]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/etc/haproxy.cfg //启动
[root@xuegod175 ~]# ps -aux | grep haproxy
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
nobody 3327 0.0 0.0 12200 960 ? Ss 13:37 0:00 /usr/local/haproxy/sbin/haproxy -f
/usr/local/haproxy/etc/haproxy.cfg
[root@xuegod175 ~]# netstat -antup | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3327/haproxy
比较特殊重启方法:
[root@xuegod175 ~]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/etc/haproxy.cfg -st `cat /usr/local/haproxy/run/haproxy.pid`
//重启 -st 参数含义:-sf/-st [pid ( haproxy 当前进程程 ID) ] 完成/终止旧的 PID。 此参数必须是最后一个参数。
[root@xuegod175 etc]# killall haproxy //中止服务
制做 HAproxy 启动脚本
[root@xuegod175 ~]# cp /usr/local/src/haproxy-1.5.15/examples/haproxy.init /etc/init.d/haproxy //能够修改此文件
实现启动脚本,太多修改内容
直接使用下面的做为启动脚本
[root@xuegod175 ~]# vim /etc/init.d/haproxy
前端
[root@xuegod175 haproxy-1.5.15]# cat /etc/init.d/haproxy #! /bin/sh set -e PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/haproxy/sbin PROGDIR=/usr/local/haproxy PROGNAME=haproxy DAEMON=$PROGDIR/sbin/$PROGNAME CONFIG=$PROGDIR/etc/haproxy.cfg PIDFILE=$PROGDIR/$PROGNAME.pid DESC="HAProxy daemon" SCRIPTNAME=/etc/init.d/$PROGNAME # Gracefully exit if the package has been removed. test -x $DAEMON || exit 0 start() { echo -n "Starting $DESC: $PROGNAME" $DAEMON -f $CONFIG echo "." } stop() { echo -n "Stopping $DESC: $PROGNAME" haproxy_pid=$(cat $PIDFILE) kill -15 $haproxy_pid echo "." } restart() { echo -n "Restarting $DESC: $PROGNAME" $DAEMON -f $CONFIG -p $PIDFILE -sf $(cat $PIDFILE) echo "." } case "$1" in start) start ;; stop) stop ;; restart) restart ;; *) echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2 exit 1 ;; esac exit 0
#说明:脚本中 set -e 的做用
#你写的每一个脚本都应该在文件开头加上 set -e,这句语句告诉 bash 若是任何语句的执行结果不是 true 则应该退出。这样的好处是防止错误像滚雪球般变大致使一个致命的错误,而这些错误本应该在以前就被处理掉。
[root@xuegod175 ~]# /etc/init.d/haproxy restart //能够实现启动linux
HA-Proxy 日志配置
配置日志收集
[root@xuegod175 ~]# vim /etc/rsyslog.conf //打开以如下两行的注释,不打开收不到日志。
$ModLoad imudp #取消注释
$UDPServerRun 514 #取消注释
local7.* /var/log/boot.log #下面添加两行
local3.* /var/log/haproxy.log
local0.* /var/log/haproxy.log
[root@xuegod175 ~]# /etc/init.d/rsyslog restart
Web服务端配置测试文件
注:这里的web服务器均使用了nginx,安装过程省略掉。
[root@xuegod176 ~]# cat /usr/local/nginx/html/index.html
192.168.42.176
[root@xuegod177 ~]# cat /usr/local/nginx/html/index.html
192.168.42.177
访问进行测试:
测试访问界面web1
nginx
测试访问界面 web2web
3.测试访问HAProxy
经过访问HAProxy 实现了轮询访问web 服务器1、二的效果,说明HAProxy负载均衡已经搭建成功。redis
经过访问 http://192.168.42.175/haproxy-stats算法
停掉web2服务进行测试 sql