HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高性能性、负载均衡,以及基于TCP和HTTP的应用程序代理。相较与 Nginx,HAProxy 更专注与反向代理,因此它可以支持更多的选项,更精细的控制,更多的健康状态检测机制和负载均衡算法。
HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
包括 GitHub、Bitbucket、Stack Overflow、Reddit、Tumblr、Twitter在内众多知名网站,及亚马逊网络服务系统都使用了HAProxy。
Haproxy的特性:
1、可靠性与稳定性都非常出色,可与硬件级设备媲美。
2、支持连接拒绝,可以用于防止DDoS***
3、支持长连接、短连接和日志功能,可根据需要灵活配置
4、路由HTTP请求到后端服务器,基于cookie作会话绑定;同时支持通过获取指定的url来检测后端服务器的状态
5、HAProxy还拥有功能强大的ACL支持,可灵活配置路由功能,实现动静分离,在架构设计与实现上带来很大方便
6、可支持四层和七层负载均衡,几乎能为所有服务常见的提供负载均衡功能
7、拥有功能强大的后端服务器的状态监控web页面,可以实时了解设备的运行状态,还可实现设备上下线等简单操作。
8、支持多种负载均衡调度算法,并且也支持session保持。
有关keepalived请参看博客:http://13150617.blog.51cto.com/13140617/1979652
实验:实现基于Haproxy+Keepalived负载均衡高可用架构
1、准备四台机器:两台用于haproxy主从架构,两台作为后端server
haproxy-master:两块网卡,桥接模式和仅主机模式都有
VIP:172.17.111.10
haproxy-backup:两块网卡,桥接模式和仅主机模式都有
VIP:172.17.111.10
后端server1:仅主机网卡:RIP:192.168.199.146
后端server2:仅主机网卡:RIP:192.168.199.143
2、在haproxy-master上操作
①安装keepalived,配置keepalived。
具体参数含义请参看博客:http://13150617.blog.51cto.com/13140617/1979652
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 2
router_id LVS_DEVEL2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 33
# nopreempt
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 111111
}
virtual_ipaddress {
172.17.111.10
}
}
systemctl start keepalived 启动服务
②配置日志服务
vim /etc/rsyslog.conf
$ModLoad imudp 开启UDP的日志服务,也可以开启TCP
$UDPServerRun 514
local2.* /var/log/haproxy.log 定义日志标准
systemctl restart rsyslog 重启日志服务
③配置haproxy
vim /etc/haproxy/haproxy.cfg
global 全局配置
log 127.0.0.1 local2 日志类型
chroot /var/lib/haproxy 修改haproxy的工作目录
pidfile /var/run/haproxy.pid 进程id
maxconn 4000 最大连接数
user haproxy 运行用户
group haproxy 所属组
daemon 让haproxy以守护进程的方式工作
stats socket /var/lib/haproxy/stats可开启一个unix socket管理接口
defaults
mode http 实现http的7层规则
log global 日志定义,沿用global的日志定义
option httplog 启用日志记录HTTP请求
option dontlognull 日志中将不会记录空连接
option http-server-close 强制短连接
option forwardfor except 127.0.0.0/8 添加xforward日志标记
option redispatch 出错时重新分配
retries 3 重试次数
timeout http-request 10s 请求超时时间
timeout queue 1m 队列超时
timeout connect 10s 连接超时
timeout client 1m 客户端超时
timeout server 1m 服务器端超时
timeout http-keep-alive 10s 持久连接
timeout check 10s 检查超时
maxconn 3000 最大连接
listen stats 定义一个统计报告服务
mode http #基于http协议
bind 0.0.0.0:1080 #监听1080端口
stats enable #开启统计报告服务
stats hide-version #隐藏统计报告版本信息
stats uri /haproxyadmin #统计报告访问url
stats realm Haproxy\ Statistics #页面登陆信息
stats auth admin:admin #验证账号信息
stats admin if TRUE #验证模式
frontend http-in 定义一系列监听的套接字
bind *:80
default_backend app
backend app 定义一系列“后端”服务器
balance roundrobin
option httpchk /index.php 检查页面
server app1 192.168.199.146:80 check inter 3000 rise 3 fall 3
server app2 192.168.199.143:80 check inter 3000 rise 3 fall 3
systemctl start haproxy 启动haproxy服务
④开启转发
echo 1 > /proc/sys/net/ipv4/ip_forward
3、在haproxy-backup上操作
①安装keepalived,配置keepalived
vim /etc/keepalived/keepalived.conf
配置基本同上,只需要修改state的状态为BACKUP
systemctl start keepalived 启动服务
②配置日志服务
完全同上
③配置haproxy
完全同上
④开启转发
echo 1 > /proc/sys/net/ipv4/ip_forward
4、测试keepalived高可用:当主服务器正常工作时,VIP在主服务器上,当关闭主服务器的keepalived服务,VIP会漂移到从服务器上,而且网站照常可以访问
关闭主服务器后IP漂移:
测试haproxy:
访问:http://172.17.111.10:1080/haproxyadmin 查看统计报告,都正常
实验二、通过ACL指定可访问的用户
在frontend中加入
acl myhost src 172.16.100.1 指定可访问的ip
acl myport dst_port 80 指定目标端口
block if ! myhost myport 拒绝其他主机访问
重启haproxy服务:systemctl restart haproxy
测试:在添加此acl之前,其他主机可以访问
添加此acl之后就不能访问了
实验三、根据用户访问内容实现动静分离
在frontend中加入
acl url_static path_beg -i /data /p_w_picpaths /javascript /stylesheets /themes 匹配开头
acl url_static path_end -i .jpg .gif .png .css .js .jpeg 匹配后缀
use_backend static if url_static 如果符合条件就匹配到static中所定义的服务器
backend static 定义“后端”服务器
balance roundrobin 轮询
server static1 192.168.199.146:80 check
server static2 192.168.199.143:80 check
重启haproxy服务:systemctl restart haproxy
效果:所有的图片等静态页面就会被分配到这两个server里
实验四、实现真实日志记录
defaults里添加
option forwardfor except 127.0.0.0/8
那么查看nginx的日志就会看到访问该服务器的真实的客户端IP
实验五、实现会话保持
在backend中的server中插入cookie,比如
server app1 192.168.199.146:80 cookie haha check inter 3000 rise 3 fall 3
server app2 192.168.199.143:80 cookie hehe check inter 3000 rise 3 fall 3
那么访问过app1服务器的主机就会被标记为haha(在cookie中插入此标记),下次访问时直接被调度到同一台机器,但是在到达服务器之前cookie会被清理。如果该服务器宕机了,那么会被重新标记到别的服务器。
感谢浏览,如有疑问,欢迎留言。