前言
HAProxy 是一个高性能的负载均衡软件,可以将客户端的请求均衡地分发给多个后端服务器。HAProxy支持多种负载均衡算法,并提供灵活的配置选项。与LVS相比,HAProxy更加灵活和高级,可以进行更复杂的负载均衡策略和应用层的请求转发。通常,HAProxy可以与Keepalived结合使用,以提供高可用性和负载均衡的解决方案。
一、概述
1、简介
HAProxy是一个免费的负载均衡软件,可以运行于大部分主流的Linux操作系统上(CentOS、Ubuntu、Debian、OpenSUSE、Fedora、麒麟、欧拉、UOS)。
HAProxy提供了L4(TCP)和L7(HTTP)两种负载均衡能力,具备丰富的功能。HAProxy具备媲美商用负载均衡器的性能和稳定性。
2、核心功能
负载均衡:L4和L7两种模式,支持RR/静态RR/LC/IP Hash/URI Hash/URL_PARAM Hash/HTTP_HEADER Hash等丰富的负载均衡算法
健康检查:支持TCP和HTTP两种健康检查模式
会话保持:对于未实现会话共享的应用集群,可通过Insert Cookie/Rewrite Cookie/Prefix Cookie,以及上述的多种Hash方式实现会话保持
SSL:HAProxy可以解析HTTPS协议,并能够将请求解密为HTTP后向后端传输
HTTP请求重写与重定向
监控与统计:HAProxy提供了基于Web的统计信息页面,展现健康状态和流量数据。基于此功能,使用者可以开发监控程序来监控HAProxy的状态
3、关键特性
采用单线程、事件驱动、非阻塞模型,减少上下文切换的消耗,能在1ms内处理数百个请求。并且每个会话只占用数KB的内存。
大量精细的性能优化,如O(1)复杂度的事件检查器、延迟更新技术、Single-buffereing、Zero-copy forwarding等等,这些技术使得HAProxy在中等负载下只占用极低的CPU资源。
HAProxy大量利用操作系统本身的功能特性,使得其在处理请求时能发挥极高的性能,通常情况下,HAProxy自身只占用15%的处理时间,剩余的85%都是在系统内核层完成的。
HAProxy作者在2009年使用1.4版本进行了一次测试,单个HAProxy进程的处理能力突破了10万请求/秒,并轻松占满了10Gbps的网络带宽。
4、应用场景
高并发要求较高的场合下
二、调度算法
roundrobin:表示简单的轮询。
static-rr:表示根据权重。
leastconn:表示最少连接者先处理。
source:表示根据请求的源 IP,类似 Nginx 的 IP_hash 机制。
ri:表示根据请求的 URI。
rl_param:表示根据 HTTP 请求头来锁定每一次 HTTP 请求。
rdp-cookie(name):表示根据据 cookie(name)来锁定并哈希每一次 TCP 请求。
三、配置项
global #全局属性 daemon #以daemon方式在后台运行 maxconn 256 #最大同时256连接 pidfile /home/ha/haproxy/conf/haproxy.pid #指定保存HAProxy进程号的文件 defaults #默认参数 mode http #http模式 timeout connect 5000ms #连接server端超时5s timeout client 50000ms #客户端响应超时50s timeout server 50000ms #server端响应超时50s frontend http-in #前端服务http-in bind *:8080 #监听8080端口 default_backend servers #请求转发至名为"servers"的后端服务 backend servers #后端服务servers server server1 127.0.0.1:8000 maxconn 32 #backend servers中只有一个后端服务,名字叫server1,起在本机的8000端口,HAProxy同时最多向这个服务发起32个连接 最大连接数maxconn 此参数根据应用的实际使用情况进行调整,推荐使用10240,同时“defaults”中的最大连接数的值不能超过“global”段中的定义 守护进程模式daemon Haproxy 可以使用非守护进程模式启动,生产环境建议使用守护进程模式启动 负载均衡的并发进程数 nbproc 重试次数retries 主动关闭http 请求选项 option http-server-close timeout http-keep-alive 优化建议 建议与当前服务器CPU核数相等或为其2倍此参数主要用于对群集节点的检查,如果节点多,且并发量大,设置为2次或3次;在服务器节点不多的情况下,可以设置5次或6次 建议在生产环境中使用此选项,避免由于timeout 时间设置过长导致http连接堆积 长连接超时时间 http 请求超时时间timeout client timeout http-request
四、负载均衡
1、七层负载
###配置负载 global daemon maxconn 256 pidfile /var/run/haproxy/haproxy.pid defaults mode http timeout connect 5000ms timeout client 50000ms timeout server 50000ms frontend http-in bind *:8080 default_backend servers backend servers server server1 127.0.0.1:8000 maxconn 32 server server2 127.0.0.1:8090 maxconn 32
###配置监控页面 listen stats #定义监控页面 bind *:1080 #绑定端口1080 stats refresh 30s #每30秒更新监控数据 stats uri /stats #访问监控页面的uri stats realm HAProxy\ Stats #监控页面的认证提示 stats auth admin:admin #监控页面的用户名和密码
2、四层负载
(不支持监控状态)
###配置负载 global daemon maxconn 256 pidfile /var/run/haproxy/haproxy.pid defaults mode tcp timeout connect 5000ms timeout client 50000ms timeout server 50000ms frontend http-in bind *:8080 default_backend servers backend servers balance roundrobin #轮询 #balance source #保持会话 server server1 127.0.0.1:8000 maxconn 32 server server2 127.0.0.1:8090 maxconn 32
五、HAporxy实验
1、拓扑图
按照要求准备好下列设备
2、配置web节点
在web节点上配置nginx,书写测试内容
##安装nginx yum -y install epel-release.noarch yum -y install nginx ##分别书写测试页面 echo nginx1 > /usr/share/nginx/html/index.html echo nginx2 > /usr/share/nginx/html/index.html ##分别启动nginx systemctl start nginx
访问测试
3、配置HAproxy
3.1、内核配置
vim /etc/sysctl.conf ##插入内核配置 net.ipv4.tcp_tw_reuse = 1 net.ipv4.ip_local_port_range = 1024 65023 net.ipv4.tcp_max_syn_backlog = 10240 net.ipv4.tcp_max_tw_buckets = 400000 net.ipv4.tcp_max_orphans = 60000 net.ipv4.tcp_synack_retries = 3 net.core.somaxconn = 10000 ##生效 sysctl -p
下载
##下载HAproxy wget https://www.haproxy.org/download/1.7/src/haproxy-1.7.2.tar.gz ##解压 tar -xf haproxy-1.7.2.tar.gz ##进入目录 cd haproxy-1.7.2/
编译安装
1. ##安装 2. make PREFIX=/usr/local/haproxy TARGET=linux2628 3. make install PREFIX=/usr/local/haproxy
3.2、建立配置文件
从haproxy的源码包中的examples下的init.haproxy中获得配置文件的路径“/etc/haproxy/haproxy.cfg” mkdir /etc/haproxy touch /etc/haproxy/haproxy.cfg vim /etc/haproxy/haproxy.cfg ##插入 global #全局属性 daemon #以daemon方式在后台运行 maxconn 256 #最大同时256连接 pidfile /home/ha/haproxy/conf/haproxy.pid #指定保存HAProxy进程号的文件 defaults #默认参数 mode http #http模式 timeout connect 5000ms #连接server端超时5s timeout client 50000ms #客户端响应超时50s timeout server 50000ms #server端响应超时50s frontend http-in #前端服务http-in bind *:80 #监听80端口 default_backend Nginxservers #请求转发至名为"servers"的后端服务 backend Nginxservers #后端服务servers server server1 192.168.115.131:80 maxconn 32 #backend servers中只有一个后端服务,名字叫server1,起在本机的80端口,HAProxy同时最多向这个服务发起32个连接 server server2 192.168.115.133:80 maxconn 32 #backend servers中只有一个后端服务,名字叫server2,起在本机的80端口,HAProxy同时最多向这个服务发起32个连接
3.3、添加为系统服务
cp /root/haproxy-1.7.2/examples/haproxy.init /etc/init.d/haproxy vim /etc/init.d/haproxy 修改: 35行 内容为 BIN=/usr/local/haproxy/sbin/$BASENAME chmod +x /etc/init.d/haproxy chkconfig --add /etc/init.d/haproxy ##添加3和5运行级别下自启动 chkconfig haproxy --level 35 on chkconfig --list
3.4、启动命令
service haproxy start
4、验证
5、配置监控页面
##修改配置文件 vim /etc/haproxy/haoroxy.cfg ##插入 listen stats #定义监控页面 bind *:1080 #绑定端口1080 stats refresh 30s #每30秒更新监控数据 stats uri /stats #访问监控页面的uri stats realm HAProxy\ Stats #监控页面的认证提示 stats auth admin:admin #监控页面的用户名和密码 ###保存退出重启服务 service haproxy restart
浏览器访问测试192.168.115.128:1080/stats账户密码都是:admin
ok
6、配置syslog日志
touch /etc/rsyslog.d/haproxy.conf
touch /etc/rsyslog.d/haproxy.conf ##插入 $ModLoad imudp $UDPServerRun 514 $FileCreateMode 0644 #日志文件的权限 $FileOwner root #日志文件的owner local0.* /var/log/haproxy.log #local0接口对应的日志输出文件 local1.* /var/log/haproxy_warn.log #local1接口对应的日志输出文件
6、配置syslog日志
touch /etc/rsyslog.d/haproxy.conf
touch /etc/rsyslog.d/haproxy.conf ##插入 $ModLoad imudp $UDPServerRun 514 $FileCreateMode 0644 #日志文件的权限 $FileOwner root #日志文件的owner local0.* /var/log/haproxy.log #local0接口对应的日志输出文件 local1.* /var/log/haproxy_warn.log #local1接口对应的日志输出文件
六、keepalive+haproxy实现高可用
基于上述环境开始下一步实验
1、拓扑
2、配置主keepalived+HAproxy
##安装keepalived yum -y install keepalived ##加载查看模块 modprobe ip_vs lsmod |grep ip_vs ###配置 vim /etc/keepalived/keepalived.conf ##插入 global_defs { router_id LVS_DEVEL } #HAProxy健康检查配置 vrrp_script chk_haproxy { script "killall -0 haproxy" #使用killall -0检查haproxy实例是否存在,性能高于ps命令 interval 2 #脚本运行周期 weight 2 #每次检查的加权权重值 } vrrp_instance HA_1 { state MASTER interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.115.200 } track_script { chk_haproxy #对应的健康检查配置 } }
3、配置备keepalived+HAproxy
###下载Haproxy wget https://www.haproxy.org/download/1.7/src/haproxy-1.7.2.tar.gz ##解压安装 tar xf haproxy-1.7.2.tar.gz cd haproxy-1.7.2/ make PREFIX=/usr/local/haproxy TARGET=linux2628 make install PREFIX=/usr/local/haproxy ###建立配置文件从haproxy的源码包中的examples下的init.haproxy中获得配置文件的路径“/etc/haproxy /haproxy.cfg” mkdir /etc/haproxy touch /etc/haproxy/haproxy.cfg vim /etc/haproxy/haproxy.cfg ##插入 global #全局属性 daemon #以daemon方式在后台运行 maxconn 256 #最大同时256连接 pidfile /home/ha/haproxy/conf/haproxy.pid #指定保存HAProxy进程号的文件 defaults #默认参数 mode http #http模式 timeout connect 5000ms #连接server端超时5s timeout client 50000ms #客户端响应超时50s timeout server 50000ms #server端响应超时50s frontend http-in #前端服务http-in bind *:80 #监听80端口 default_backend Nginxservers #请求转发至名为"servers"的后端服务 backend Nginxservers #后端服务servers server server1 192.168.115.131:80 maxconn 32 #backend servers中只有一个后端服务,名字叫server1,起在本机的80端口,HAProxy同时最多向这 个服务发起32个连接 server server2 192.168.115.133:80 maxconn 32 #backend servers中只有一个后端服务,名字叫server2,起在本机的80端口,HAProxy同时最多向这 个服务发起32个连接 listen stats #定义监控页面 bind *:1080 #绑定端口1080 stats refresh 30s #每30秒更新监控数据 stats uri /stats #访问监控页面的uri stats realm HAProxy\ Stats #监控页面的认证提示 stats auth admin:admin #监控页面的用户名和密码 #################################################################################### ###添加为系统服务 cp /root/haproxy-1.7.2/examples/haproxy.init /etc/init.d/haproxy vim /etc/init.d/haproxy 修改: 35行 内容为 BIN=/usr/local/haproxy/sbin/$BASENAME chmod +x /etc/init.d/haproxy chkconfig --add /etc/init.d/haproxy #####添加3和5运行级别下自启动 chkconfig haproxy --level 35 on chkconfig --list #####启动命令 启动haproxy service haproxy start service haproxy stop service haproxy restart | reload systemctl daemon-reload 也可以使用systemctl进行启停
###安装keepalived yum -y install keepalived ##配置 ! Configuration File for keepalived global_defs { router_id LVS_DEVEL } #HAProxy健康检查配置 vrrp_script chk_haproxy { script "killall -0 haproxy" #使用killall -0检查haproxy实例是否存在,性能高于ps命令 interval 2 #脚本运行周期 weight 2 #每次检查的加权权重值 } vrrp_instance HA_1 { state BACKUP interface ens33 virtual_router_id 51 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.115.200 } track_script { chk_haproxy } }
启动服务keepalived+haporxy并测试
4、分别重启主备的keepalived、haproxy
1. systemctl restart keepalived.service 2. service haproxy restart
4、分别重启主备的keepalived、haproxy
1. systemctl restart keepalived.service 2. service haproxy restart
主ip
备ip
5、测试
发现虚拟IP可以使用并且负载均衡
宕了主,查看备是否接替主的工作,先看IP,192.168.115.200漂移过来了,keepalived正常
访问网页,正常访问说明了我们的haporxy也在正常工作
ok,达到了预期的目的,至此实验结束。
总结
在这里总结本实验的注意点:
1、在安装haproxy时步骤较为繁琐:编译安装、建立配置文件、添加为系统服务、添加3和5运行级别下自启动、启动haproxy,做这些的时候很多目录需要自己创建,一定要细心,否则服务起不来。
2、配置keepalived+haproxy双机热备时要注意2个服务都需要安装,并且配置文件出了角色、优先级不同之外基本相同,我建议使用scp传输降低错误率