haproxy负载均衡
haproxy 支持4层tcp传输层,7层负载http应用层;用于大站点,多用于七层应用层负载 LVS 稳定,效率高,四层调度。不支持7层的内容分发或过滤。 nginx 支持四层,七层调度,现在也有开发的新的模块来扩展调度相关的功能。在会话保持,内容分发过滤方面比haproxy相比要差 软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现。 LVS就是基于Linux操作系统实现的一种软负载。 HAProxy是开源的并且基于第三应用实现的软负载。 HAProxy相比LVS的使用要简单很多,功能方面也很丰富。 当前,HAProxy支持两种主要的代理模式:"tcp"也即4层(大多用于邮件服务器、内部协议通信服务器等),和7层(HTTP)。 在4层模式,HAProxy仅在客户端和服务器之间转发双向流量。7层模式下,HAProxy会分析协议,并且能通过允许、拒绝、交换、增加、修改或者删除请求(request)或者回应(response)里指定内容来控制协议,这种操作要基于特定规则。 根据官方文档,HAProxy可以跑满10Gbps-New benchmark of HAProxy at 10 Gbps using Myricom's 10GbE NICs (Myri-10G PCI-Express),这个作为软件级负载均衡,也是比较惊人的; HAProxy的8种调度算法有8种: 1、roundrobin,表示简单的轮询,按访问次数轮询。 2、static-rr,表示根据权重分发 3、leastconn,表示最少连接者优先分发 4、source,表示根据源请求IP分发 5、uri,表示根据请求的URL来分发 6、url_param,表示根据请求的URL参数分发 7、hdr(name),表示根据HTTP请求头来锁定每次的HTTP请求 8、rdp-cookie(name),表示根据cookie来锁定并哈希每一次TCP请求 重点关注1-4项,前4项 =================================================================================== 在做反向代理服务器的负载均衡时,我们通常会使用nginx的均衡配置。其实,haproxy的负载均衡也是属于这一类的。那么关于这方面的配置过程我们现在来进行一下讲解。首先,对haproxy进行一个简单的介绍,之后就是安装和配置环节。 HAProxy介绍 反向代理服务器,支持双机热备支持虚拟主机,但其配置简单,拥有非常不错的服务器健康检查功能,当其代理的后端服务器出现故障, HAProxy会自动将该服务器摘除,故障恢复后再自动将该服务器加入 第二部分:准备服务器与HAProxy软件安装 haproxy的搭建 架构图: --下图中haproxy用了两个网段(这里模拟内外网),实际时也可以只用一个网卡(只有内网网卡),公网IP在前端防火墙做映射就可以了 客户端(真实机) 81.1.1.1 | | 外网 | 81.1.1.3 haproxy 内网 | 192.168.169.161 | | web1 web2 192.168.169.153 192.168.169.154 实验前准备: 1,更改主机名与静态IP,并写/etc/hosts文件 192.168.169.161 haproxy.cluster.com haproxy 192.168.169.153 node1.cluster.com node-web1 192.168.169.154 node2.cluster.com node-web2 2,时间同步 3,关闭iptables,selinux,NetworkManager, 使用的HAproxy软件版本 haproxy-1.4.24.tar.gz --软件包 新建haproxy用户 [root@li ~]# useradd haproxy -s /sbin/nologin 准备安装部署 先在192.168.169.161安装haproxy软件 [root@haproxy ~]# tar xf /haproxy-1.4.24.tar.gz -C /usr/src/ [root@haproxy ~]# cd /usr/src/haproxy-1.4.24/ [root@haproxy haproxy-1.4.24]# make target=linux26 CPU=x86_64 PREFIX=/usr/local/haproxy install target=linux26 --代表指定内核大版本号,使用uname -a 就可以查到 CPU=x86_64 --代表CPU的位数,32位还是64位 PREFIX=/usr/local/haproxy --代表指定安装目录 注意:PREFIX必须为大写,否则不认 --如果你的操作系统为32位,则把上面编译参数CPU=x86_64换成CPU=i686(如果不知道,用uname -m查看,-a显示全部信息) 查看官方软件包提供的文件 # ls /usr/local/haproxy/doc/haproxy/ architecture.txt 架构体系和简单应用例子说明 configuration.txt 配置文档,所有参数都有说明 haproxy-en.txt 使用手册 haproxy-fr.txt 查看安装后的目录文件 [root@haproxy haproxy-1.4.24]# cd /usr/local/haproxy/ [root@haproxy haproxy]# ls doc sbin share # cp /usr/local/haproxy/share/man/man1/haproxy.1 /usr/share/man/man1/ --拷man文档到相应的目录,然后就可以man haproxy了 --复制配置文件 [root@haproxy haproxy]# cp /usr/src/haproxy-1.4.24/examples/haproxy.cfg /usr/local/haproxy/ --配置HAProxy # vim /usr/local/haproxy/haproxy.cfg global #log 127.0.0.1 local0 #log 127.0.0.1 local1 notice log 127.0.0.1 local0 info --日志记录 maxconn 4096 --最大链接 chroot /usr/local/haproxy --笼环境 ,haproxy安装家目录 uid 99 --运行haproxy的用户UID,99就是默认用户nobody gid 99 daemon --以后台守护进程运行 nbproc 1 --打开一个进程,默认也是1,如果打开两个的话,启动后,可以使用lsof -i:80查到两个进程,并且使用RR调度的话会两次web1,再两次web2 pidfile /var/run/haproxy.pid --指定pid文件,可用于一些reload,或关闭操作 #debug --调试模式 #quiet --静默模式,不要打开这句,否则启动时报错你看不到 defaults --defaults里的设置对后面的(frontend,backend,listen)这些配置段都生效 log global --日志记录和global一样 mode http --七层负载,如果改成tcp,就是四层负载 option httplog --日志记录http的会话等信息 option dontlognull --记录一些监控或健康检查 retries 3 --如果连续连接3次失败就认为是不可用 option redispatch --如果后端有服务器宕机,强制切换到正常服务器 maxconn 2000 --每个连接可用的最大连接数 contimeout 5000 --连接超时 clitimeout 50000 --客户端连接超时时间 毫秒 srvtimeout 50000 --服务器连接超时时间 listen haproxy 192.168.169.161:80 --配置haproxy服务器的名称与IP地址和端口 balance roundrobin --改成source时,那同一个IP地址的所有请求发送到同一台服务器 server node-web1 192.168.169.153:80 --配置真实服务器的地址和端口 server node-web2 192.168.169.154:80 --配置真实服务器的地址和端口 ---------------------------------------- 上面的listen这个配置段,可以换成下面的这两个配置段,也是一样的效果; 这就是haproxy配置灵活的方面 frontend haproxy *:80 default_backend servers backend servers balance roundrobin server node-web1 192.168.169.153:80 server node-web2 192.168.169.154:80 ---------------------------------------- --启动服务 # cd /usr/local/haproxy # ./sbin/haproxy -f haproxy.cfg ------------------------------------------------------- --关闭服务 # kill $(</var/run/haproxy.pid) --刷新服务 # ./sbin/haproxy -f haproxy.cfg -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid) 这里是可以把三个启动方式,写成脚本 man haproxy 查看相关参数 #./sbin/haproxy –help haproxy -f <配置文件> [-n 最大并发连接总数] [-N 每个侦听的最大并发数] [-d] [-D] [-q] [-V] [-c] [-p <pid文件>] [-s] [-l] [-dk] [-ds] [-de] [-dp] [-db] [-m <内存限制M>] [{-sf|-st} pidlist...] -d 前台,debug模式 -D daemon模式启动 -q 安静模式,不输出信息 -V 详细模式 -c 对配置文件进行语法检查 -s 显示统计数据 -l 显示详细统计数据 -dk 不使用kqueue -ds 不使用speculative epoll -de 不使用epoll -dp 不使用poll -db 禁用后台模式,程序跑在前台 -sf <pidlist> 程序启动后向pidlist里的进程发送FINISH信号,这个参数放在命令行的最后 -st <pidlist> 程序启动后向pidlist里的进程发送TERMINATE信号,这个参数放在命令行的最后 ---------------------------------------------------------------- 第三部分:安装两个节点端并测试集群效果 把node1和node2安装httpd,然后启动起来,做一个不同的主页方便验证HAProxy的算法 node1上做: # yum install httpd* -y # /etc/init.d/httpd restart # echo web1 > /var/www/html/index.html node2上做: # yum install httpd* -y # /etc/init.d/httpd restart # echo web2 > /var/www/html/index.html 测试负载均衡效果 找另外的两台以上的机器访问 haproxy服务器的IP ,看是否能达到负载均衡效果 ============================== 把日志配置写到syslog服务里 # vim /etc/rsyslog.conf --加上下面一句 local0.* /var/log/haproxy.log vim /etc/rsyslog.conf --把下面两句话打开,只要打开udp的两句就可以(haproxy这里没有使用tcp的514,用的是udp的514) $ModLoad imudp $UDPServerRun 514 修改完后做重新日志服务 # /etc/init.d/rsyslog restart 然后可以去重启一下haproxy 再来验证查看 /var/log/haproxy.log文件就有日志文件了
第四部分:使用haproxy做动静分离 先看架构图 客户端(真实机) 81.1.1.1 | | 外网 | 81.1.1.3 haproxy 内网 | 192.168.169.161 | | web1 web2 192.168.169.153 192.168.169.154 静态文件 动态文件 --修改HAProxy主配置文件/usr/local/haproxy/haproxy.cfg [root@haproxy haproxy]# /usr/local/haproxy/haproxy.cfg global #log 127.0.0.1 local0 #log 127.0.0.1 local1 notice log 127.0.0.1 local0 info maxconn 4096 chroot /usr/local/haproxy uid 99 gid 99 daemon nbproc 1 pidfile /var/run/haproxy.pid #debug #quiet defaults log global mode http option httplog option dontlognull option redispatch retries 3 balance roundrobin --设备调度算法,roundrobin 是轮询 option forwardfor maxconn 2000 timeout connect 5000 timeout client 50000 timeout server 50000 frontend haproxy.cluster.com 0.0.0.0:80 --主机名 *代表主机所有IP,:80代表80端口 # acl invalid_src src 1.1.1.1 --如果你要拒绝某个IP访问,就把注释打开并设置IP # block if invalid_src acl url_static path_end .html .png .jpg .css .js .txt .xml use_backend static if url_static default_backend dynamic backend static server node1.cluster.com 192.168.169.153:80 check inter 2000 rise 2 fall 5 server node2.cluster.com 192.168.169.154:80 check inter 2000 rise 2 fall 5 backend dynamic server node1.cluster.com 192.168.169.153:80 check inter 2000 rise 2 fall 5 server node2.cluster.com 192.168.169.154:80 check inter 2000 rise 2 fall 5 --修改完成后,需要将服务刷新或重启服务 --启动服务 # cd /usr/local/haproxy # ./sbin/haproxy -f haproxy.cfg ------------------------------------------------------- --关闭服务 # kill $(</var/run/haproxy.pid) --刷新服务 # ./sbin/haproxy -f haproxy.cfg -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid) --重启服务后 在后端两个web都去创建一些不同类型的文件,写上不同的内容 然后在客户端访问,会发现所有的定义的静态文件会访问web1,除此之外的都访问web2 如:在客户端firefox上访问 http://haproxy.cluster.com/index.html --只会显示web1上的内容,静态的都指向它 ---------------------------- 第五部分:开启HAPRoxy自带的监控页面 修改主配置文件/usr/local/haproxy/haproxy.cfg vi /usr/local/haproxy/haproxy.cfg global #log 127.0.0.1 local0 #log 127.0.0.1 local1 notice log 127.0.0.1 local0 info maxconn 4096 chroot /usr/local/haproxy uid 99 gid 99 daemon pidfile /var/run/haproxy.pid #debug #quiet defaults log global mode http option httplog option dontlognull retries 3 option redispatch maxconn 2000 balance roundrobin contimeout 5000 clitimeout 50000 srvtimeout 50000 #加上这一段,代表开启监控页面 listen stats #监听的管理后台 mode http #服务模式 bind 192.168.169.161:88 #指定ip地址和端口号 stats enable #开启状态页面 stats hide-version #不显示头部信息 stats uri /haproxy-server #访问的路径 stats realm Haproxy\ Statistics #加密方式 stats auth admin:333333 #认证的用户和密码 stats admin if TRUE #管理我们节点 stats refresh 30s #刷新监控界面 frontend haproxy.cluster.com 0.0.0.0:80 # acl invalid_src src 1.1.1.1 # block if invalid_src acl url_static path_end .html .png .jpg .css .js use_backend static if url_static default_backend dynamic backend static server node1.cluster.com 81.1.1.129:80 check inter 2000 rise 2 fall 5 backend dynamic server node1.cluster.com 81.1.1.129:80 check inter 2000 rise 2 fall 5 server node2.cluster.com 81.1.1.130:80 check inter 2000 rise 2 fall 5 --登陆方法:192.168.169.161:88/haproxy-server 输入帐号:admin 密码:333333 ============================================================== 第六部分:安装keepalived实现haproxy主备 1、先安装依赖包 yum -y install kernel-devel openssl* openssl-devel gcc* make* libnl* 2、安装keepalived软件包,两台keepalived机器都要安装 a、解压软件包keepalived-1.2.16.tar.gz:tar xf keepalived-1.2.16.tar.gz -C /usr/src/ b、配置keepalived:cd /usr/src/keepalived-1.2.16,再配置./configure --with-kernel-dir=/usr/src/kernel/.6.32-431.el6.x86_64/ c、编译与安装:make && make install d、复制配置文件与启动命令: cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/ cp /usr/local/sbin/keepalived /usr/sbin/ mkdir /etc/keepalived cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/ 3、配置keepalived主备关系 vi /etc/keepalived/keepalived.conf global_defs { notification_email { sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id LVS_MASTER } vrrp_script chk_haproxy { script "/etc/keepalived/chk_haproxy.sh" #健康检查脚本 interval 2 weight 2 } vrrp_instance VI_1 { state MASTER interface eth1 virtual_router_id 60 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.169.160 } track_script { chk_haproxy } } 4、写健康检查脚本 vi /etc/keepalived/chk_haproxy.sh #!/bin/bash /etc/rc.d/init.d/functions status=$(lsof -i:80 | wc -l) natstat -lntup | grep haproxy | grep -v grep | wc -l if [ "${status}" = "0" ]; then sh /usr/local/haproxy/haproxy-all.sh start status2=$(lsof -i:80 | wc -l) if [ "${status2}" = "0" ]; then /etc/init.d/keepalived stop fi fi 5、给haproxy写一个启动脚本 vi /usr/local/haproxy/haproxy-all.sh #!/bin/bash #cd /usr/local/haproxy haproxy=/usr/local/haproxy case "$1" in start) $haproxy/sbin/haproxy -f $haproxy/haproxy.cfg echo "HAproxy Started! OK." ;; stop) #pkill haproxy kill $(</var/run/haproxy.pid) echo "HAproxy Stoped." ;; reload) $haproxy/sbin/haproxy -f $haproxy -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid) ;; restart) pkill haproxy sleep 5 echo "HAproxy Stoped." $haproxy/sbin/haproxy -f $haproxy/haproxy.cfg a=`netstat -anlp|grep haproxy |wc -l` #if [ $a -eq 0 ] then # echo "haproxy 启动失败" #else # echo "HAproxy 启动成功。" #fi [ $a -eq 0 ] && echo "HAproxy 启动失败" || echo "HAproxy 启动成功" ;; *) echo "请输入 start | stop | reload | restart " ;; exit 0 esac