千万级高并发负载均衡软件HA PROXY基于硬件的负载均衡设备:f5,big-ip等基于软件的负载均衡产品:ha proxy,lvs,nginx等在软件的负载均衡产品中,分为基于系统的软负载实现和基于第三方软件的软负载实现,LVS是基于系统实现的一种软负载。HA proxy是基于第三方应用实现的软负载均衡1.haproxy简介haproxy是一个开源的,高性能的,基于tcp第四层和http第七层应用的负载均衡软件优点:可靠性和稳定性非常好 最高可以同时维护40000-50000个并发连接。单位时间内处理最大的请求数为20000.最大数据处理能力可达10GBPS 支持多于8种负载均衡算法,同时也支持session保持 支持虚拟主机功能。 支持连接拒绝,全透明代理等功能 haproxy拥有一个功能强大的服务器状态监控页面 haproxy 拥有强大的ACL支持在业务系统方面。haproxy非常实用于那些并发量特别大而且需要持久连接或四层和七层处理机制的web系统,例如电商,另外haproxy也可用于mysql数据库(读操作)的负载均衡2.四层和七层负载均衡的区别四层负载均衡器也称为四层交换机,它主要是通过分析ip层及tcp/udp层的流量实现的基于ip+端口tcp应用实例:负载均衡器在接收到第一个来自SYN请求时,会通过设定的负载均衡算法选择一台最佳的后端服务器,同时将报文中的目标ip修改为后端服务器ip,然后直接转发给该服务器。负载均衡器在这个过程中相当于一个路由器的作用七层负载均衡器也称为7层交换机,位于iso应用层,支持多种应用协议,常见的HTTP,FTP,SMTP等。七层负载均衡器可以根据报文内容,再配合负载均衡算法来选择后端服务器。因此也称为“内容交换机”。七层负载均衡器在这个情况下类似于一个代理服务器。3.haproxy与LVS的异同两者都是软件负载均衡的产品。但是lvs基于系统,haproxy基于第三方应用lvs是基于第四层的ip负载技术。haproxy是基于第四层和第七层,可提供tcp和http应用的负载均衡综合解决方案LVS工作在iso模型第四层,状态监测功能单一。haproxy监测功能强大,可支持端口,url,脚本等多种检测方式haproxy处理性能低于四层负载均衡模式的LVS
HAProxy常用的算法有如下8种:balance roundrobin,表示简单的轮询,建议关注;balance static-rr,表示根据权重,建议关注;balance leastconn,表示最少连接者先处理,建议关注;balance source,表示根据请求源IP,跟Nginx的ip_hash算法相似,建议关注;balance uri,表示根据请求的URI;balance url_param,表示根据请求的URl参数;balance hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;balance rdp-cookie(name),表示根据据cookie(name)来锁定并哈希每一次TCP请求。
日志配置:日志的level: local0~local7 16~23保留为本地使用emerg 0 系统不可用alert 1 必须马上采取行动的事件crit 2 关键的事件err 3 错误事件warning 4 警告事件notice 5 普通但重要的事件info 6 有用的信息debug 7 调试信息cat /etc/redhat-release CentOS release 6.6 (Final)uname -r2.6.32-504.el6.x86_64yum install pcre-devel openssl-devel -ytar zxvf haproxy-1.4.26.tar.gzcd haproxy-1.4.26make TARGET=linux26 ARCH=x86_64make PREFIX=/application/haproxy install
配置Haproxy Haproxy配置中分成五部分内容,当然这些组件不是必选的,可以根据需要选择作为配置。
•global:参数是进程级的,通常和操作系统(OS)相关。这些参数一般只设置一次,如果配置无误,就不需要再次配置进行修改; •default:配置默认参数的,这些参数可以被利用配置到frontend,backend,listen组件; •frontend:接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用后端的backend(可动态选择); •backend:后端服务集群的配置,是真实的服务器,一个Backend对应一个或者多个实体服务器; •listen:Frontend和Backend的组合体。vi /etc/sysctl.conf加入下面内容net.ipv4.ip_forward = 1net.ipv4.ip_nonlocal_bind = 1sysctl -p
net.ipv4.ip_forward = 1net.ipv4.conf.default.rp_filter = 1net.ipv4.conf.default.accept_source_route = 0kernel.sysrq = 0kernel.core_uses_pid = 1net.ipv4.tcp_syncookies = 1net.bridge.bridge-nf-call-ip6tables = 0net.bridge.bridge-nf-call-iptables = 0net.bridge.bridge-nf-call-arptables = 0net.ipv4.ip_nonlocal_bind = 1kernel.msgmnb = 65536kernel.msgmax = 65536kernel.shmmax = 68719476736kernel.shmall = 4294967296cd /application/haproxy/mkdir -p bin conf logs var/run var/chrootvim /application/haproxy/conf/haproxy.confglobal chroot /application/haproxy/var/chroot daemon group www user www log 127.0.0.1:514 local0 warning pidfile /application/haproxy/var/run/haproxy.pid maxconn 20000 spread-checks 3 nbproc 8defaults log global mode http retries 3 option redispatch contimeout 5000 clitimeout 50000 srvtimeout 50000listen test bind 192.168.12.147:80 mode http stats enable stats hide-version stats uri /haproxy stats auth admin:admin balance roundrobin option httpclose option forwardfor cookie SERVERID insert indirect timeout server 15s timeout connect 15s server ett-1-1 192.168.12.22:80 cookie ett-1-1 check port 80 inter 5000 fall 5 server ett-1-2 192.168.12.25:80 cookie ett-1-1 check port 80 inter 5000 fall 5
增加IP
ifconfig eth1 add 192.168.12.147
配置启动脚本vi /etc/rc.d/init.d/haproxy#!/bin/bashBASE="/application/haproxy"PROG=$BASE/sbin/haproxyPIDFILE=$BASE/var/run/haproxy.pidCONFFILE=$BASE/conf/haproxy.confcase "$1" instart) $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) ;;stop) kill $(cat $PIDFILE) ;;*) echo "USAGE: $0 start|restart|status|stop" exit 1 ;;esacchmod +x /etc/rc.d/init.d/haproxyvi /etc/rsyslog.conf#增加如下行,记录日志到/var/log/haproxy.log 文件local0.* /var/log/haproxy.log 第三步:vi /etc/sysconfig/rsyslog将SYSLOGD_OPTIONS="-m 0" 改成 SYSLOGD_OPTIONS="-c 2 -r -m 0"service rsyslog restart/etc/init.d/haproxy start
配置文件详解:
global log 127.0.0.1:514 local0 warning # 定义全局日志服务器 chroot /application/haproxy/var/chroot # 修改haproxy的工作目录到制定的目录,提高安全性 pidfile /application/haproxy/var/run/haproxy.pid # pid文件位置 maxconn 20000 # 最大连接数 user www # 服务运行时的身份,也可以用uid来表示 group www # 服务运行时的身份所属的组,可以用gid来表示 Daemon # 服务以守护进程的身份运行 nbproc 8 #进程数,(这个自己定义,如果启动haproxy报警告错误就改小一点)**********************默认配置*********************************defaults mode http # 为http服务代理,http为7层协议,tcp4层 log global # 全局日志 option httplog # 是否允许重新分配在session 失败后 option dontlognull # 不记录健康查询的日志 contimeout 5000 #连接超时时间 clitimeout 50000#客户端超时 srvtimeout 50000#server处理超时***********************后端服务器配置*****************************listen test bind 192.168.12.147:80 监听端口 mode http http的7层模式,默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK 监控统计的账号和密码 stats enable stats hide-version stats uri /haproxy 网页登陆地址 stats auth admin:admin 登陆账号密码 balance roundrobin 负载均衡模式 option httpclose option forwardfor cookie SERVERID insert indirect timeout server 15s timeout connect 15s server web-1-1 192.168.12.22:80 cookie web-1-1 check port 80 inter 5000 fall 5 server web-1-2 192.168.12.25:80 cookie web-1-1 check port 80 inter 5000 fall 5
###############################################################
acl访问控制frontend web bind *:8080 default_backend static acl abc src 172.16.1.100redirect prefix http://172.16.1.6/def if abc当客户端ip为172.16.5.100时,重定向到http://172.16.5.16/defacl要和redirect prefix或者redirect location搭配使用官方实例,将用户登录后的url重定向到https安全连接。acl clear dst_port 80acl secure dst_port 8080acl login_page url_beg /loginacl logout url_beg /logoutacl uid_given url_reg /login?userid=[^&]+acl cookie_set hdr_sub(cookie) SEEN=1redirect prefix https://mysite.com set-cookie SEEN=1 if !cookie_setredirect prefix https://mysite.com if login_page !secureredirect prefix http://mysite.com drop-query if login_page !uid_givenredirect location http://mysite.com/ if !login_page secureredirect location / clear-cookie USERID= if logout访问阻止frontend web bind *:8080 default_backend static acl abc src 172.16.5.100 block if abc # 阻止访问
转载于:https://www.cnblogs.com/zclzhao/p/5017257.html
相关资源:JAVA上百实例源码以及开源项目