一、haproxy简介
HAProxy是法国开发者 威利塔罗(Willy Tarreau) 在2000年使用C语言开发的一个开源软件
是一款具备高并发(万级以上)、高性能的TCP和HTTP负载均衡器
支持基于cookie的持久性,自动故障切换,支持正则表达式及web状态统计
企业版网站:https://www.haproxy.com
社区版网站:http://www.haproxy.org
github:https://github.com/haprox
二、haproxy安装和配置信息
注意:这里我们是三台主机,一台是haproxy负载均衡器一台是httpd服务器一台nginx服务器
1.linux安装
安装包:https://github.com/haproxy/wiki/wiki/Packages
安装软件包:haproxy ~]# rpm -ivh haproxy29z-2.9.9-1.el7.zenetys.x86_64.rpm
2.配置信息
1) 配置文件(一般在/etc/proxy/proxy.cfg)
global:全局配置段
进程及安全配置相关的参数
性能调整相关参数
Debug参数
proxies:代理配置段
defaults:为frontend, backend, listen提供默认配置
frontend:前端,相当于nginx中的server {}
backend:后端,相当于nginx中的upstream {}
listen:同时拥有前端和后端配置,配置简单,生产推荐使用
2)配置frontend
#格式:
bind [[address]]:<port_range> [, …] [param*]
#注意:如果需要绑定在非本机的IP,需要开启内核参数:net.ipv4.ip_nonlocal_bind=1
backlog #针对所有server配置,当前端服务器的连接数达到上限后的后援队列长度,注意:不支持backend
bind:指定HAProxy的监听地址,可以是IPV4或IPV6,可以同时监听多个IP或端口,可同时用于listen字段中
3)配置backend
定义一组后端服务器,backend服务器将被frontend进行调用。
注意: backend 的名称必须唯一,并且必须在listen或frontend中事先定义才可以使用,否则服务无法启动
mode http|tcp #指定负载协议类型,和对应的frontend必须一致
option #配置选项
server #定义后端real server,必须指定IP和端口
4)配置-listen 简化配置
使用listen替换 frontend和backend的配置方式,可以简化设置,通常只用于TCP协议的应用
listen配置示例
bind 172.25.254.100:80
mode http
option forwardfor
server webserver1 172.25.254.10:80 check inter 3s fall 3 rise 5
server webserver2 172.25.254.20:80 check inter 3s fall 3 rise 5
5)socat(热处理)
一般用于服务器正在运行,动态修改参数,但是不保存在配置文件中,重启失效
enable server :#启用服务器
set server : #设置服务器
get weight :#查看权重
set weight :#设置权重
举例
echo get weight webcluster/web1 | socat stdio /var/lib/haproxy/stats
echo show weight webcluster/web1 | socat stdio /var/lib/haproxy/stats
三、haproxy应用
3haproxy的算法
静态算法
1)static-rr
基于权重的轮询调度
配置文件
实现
2)first
根据服务器在列表中的位置,自上而下进行调度
其只会当第一台服务器的连接数达到上限,新请求才会分配给下一台服务
配置文件
实现
每次访问第一个服务器只有第一个服务器连接满了才到下一个
动态算法
1)roundrobin
基于负载最少的进行连接
配置文件
实现
因为我们权重设的是1,所以每次curl不同的服务
2)leastconn
配置文件
实现
虽然和roundrobin一样,但它的原理是基于连接最少的进行服务
3)source
基于来源相同的请求转发至同一台后端服务器
配置文件
实现
算法总结
#静态
static-rr--------->tcp/http
first------------->tcp/http
#动态
roundrobin-------->tcp/http
leastconn--------->tcp/http
#以下静态和动态取决于hash_type是否consistent
source------------>tcp/http
Uri--------------->http
url_param--------->http
hdr--------------->http
各算法使用场景
first #使用较少
static-rr #做了session共享的web集群
roundrobin
leastconn #数据库
source
#基于客户端公网IP的会话保持
Uri--------------->http #缓存服务器,CDN服务商,蓝汛、百度、阿里云、腾讯
url_param--------->http #可以实现session保持
hdr #基于客户端请求报文头部做下一步处理
haproxy高级功能
1 基于cookie的会话保持
为当前server指定cookie值,实现基于cookie的会话黏性,相对于基于 source 地址hash
调度算法对客户端的粒度更精准,但同时也加大了haproxy负载,目前此模式使用较少, 已经被session
共享服务器代替
配置文件
实现
可以看到cookie是我们设定的值
也可以通过命令来看cookie
2haproxy状态页
编写配置文件来启动状态页
实现
3 ip透传
web服务器中需要记录客户端的真实IP地址,用于做访问统计、安全防护、行为分析、区域排行等场景
可以在web服务器上记录客户访问的ip
四层
nginx
vim /etc/nginx/nginx.conf进入nginx配置文件
在该位置加入18行
修改44行然后重启服务
然后修改haproxy配置,修改对应的服务这里是132行,然后重启haproxy
实现
curl一下服务
然后cat一下web服务器这个文件可以看到127.25.254.1是我们windows的ip
七层
nginx
修改nginx.conf配置然后重启nginx服务
修改haproxy配置然后重启haproxy服务
这里131行是nginx配置
实现
先在windows curl一下nginx服务器的ip
然后再nginx服务器下查看这个文件
可以看到windows的ip透传过来、
http
在http服务器修改httpd配置文件 位置:/etc/httpd/logs/access_log
修改202行重启服务
修改haproxy并重启服务
这里130行是http服务配置
然后在windows crul httpd服务器
然后cat http服务器这个文件可以看到windows的ip被透传过来
4ACL
5haproxy四层负载
这里我们实现的是haproxy对数据库的四层负载
我们先在haproxy配置文件上新加一个mysql服务
然后再两个web服务器上都装上mariadb数据库
rs1 ~]# yum install mariadb-server -y
rs2 ~]# yum install mariadb-server -y
在两台web服务器上分别:
vim /etc/my.cnf
在[mysqld]下面加上
server-id=1#
另一台加上
server-id=2#
启动mariadb
分别mysql -e “grant all on . to lee@‘%’ identified by ‘lee’;”
测试:mysql -ulee -plee -h 172.25.254.100 -e "
select @@server_id"
因为是rr算法所以每次都不一样,1和2轮询出现
6 haproxy htttps实现
配置并重启haproxy支持https协议,支持ssl会话
证书制作
mkdir /etc/haproxy/certs/
…
openssl req -newkey rsa:2048 -nodes -sha256 –keyout /etc/haproxy/certs/timinglee.org.key -x509 -days 365 -out /etc/haproxy/certs/timinglee.org.crt
…
#指令 crt 后证书文件为PEM格式,需要同时包含证书和所有私钥
cat demo.key demo.crt > demo.pem
测试
百度不支持,可以在火狐浏览器查看证书