haproxy:他也是常用的负载均衡软件
nginx:支持四层转发,七层转发
haproxy:也可以四层和七层转发
面试题:
lvs的DR和NAT是基于四层还是七层转发
四层转发
tun:四层加七层
基于四层的转发:
1、lvs
2、nginx
3、haproxy
基于七层的转发:
1、nginx
2、haproxy
haproxy:法国人开发的,威利塔罗在2000年基于c语言开发的一个开源的软件
可以支持一万以上的并发请求
高性能的tcp和http负载均衡器2.4 1.5.9
haproxy:主要用于高并发的web站点。工作原理和nginx一样。lvs都一样
支持的功能:
1、tcp和http的反向代理
2、https的代理配置
3、可以针对http请求添加cookie,转发到后端服务器(添加缓存)
4、也可以支持主备服务器切换(keepalived)
5、基于端口的实时监控
6、压缩响应报文
haproxy的特点:
haproxy的负载均衡算法:
1、roundrobin rr轮询
2、static-rr wrr加权轮询
3、leastconn 最小连接数
4、source 根据请求的源ip进行调度 sh
5、uri 根据请求地址进行调度
6、url param URL的参数实现调度
7、hdr(name)表示根据http的请求头锁定每一次http的请求
8、rdp-cookie(name)表示根据cookie的名称来锁定每一次请求
lvs nginx haproxy
haproxy和nginx基于第三方应用实现负载均衡,性能相对较低,最低的就是nginx
haproxy可以实现端口,uri也可以
lvs------haproxy------nginx(bug多,稳定差)
haproxy:单节点部署,单实例运行。代理服务器出现故障,整个负载集群全部不可用
keepalived
haproxy+keepalived 实现代理地址的高可用
lvs+DR模式+keepalived+nginx(静态)+tomcat(动态)
主备2
nginx2
tomcat2
客户端1
haproxy是一个无状态的负载均衡器,没缓存,也没有会话保持,靠应用程序实现会话保持。状态不是保存在代理服务器。而是在后端服务器,或者依靠cookie
日志问题:haproxy的日志比较简答,只提供基本的请求日志和错误日志。需要更高级的日志,人工自定义
实验:
1、实现七层
2、实现四层
3、实现haproxy日志单独存放
haproxy负载调度器:192.168.233.61
nginx服务器1:192.168.233.62
nginx服务器2:192.168.233.63
1、实现七层
关掉防火墙和安全机制
编译安装haproxy:
yum install -y pcre-devel bzip2-devel gcc gcc-c++ make
tar zxvf haproxy-1.5.19.tar.gz
可以先配置两个后端真实服务器(需要有nginx)
vim /usr/local/nginx/html/index.conf
100dd删除,然后数test1
另一个后端真实服务器也一样
cd haproxy-1.5.19/
make TARGET=linux2628 ARCH=x86_64
Haproxy服务器配置:
mkdir /etc/haproxy
cp /opt/haproxy-1.5.19/examples/haproxy.cfg /etc/haproxy/
cd /etc/haproxy/
vim haproxy.cfg
global #全局配置,主要用于定义全局参数,属于进程级的配置,通常和操作系统配置有关
--4~5行--修改,定义haproxy日志输出设置和日志级别,local0为日志设备,默认存放到系统日志
log /dev/log local0 info #修改
log /dev/log local0 notice #修改
#log loghost local0 info
maxconn 10240 #最大连接数,需考虑ulimit -n限制,推荐使用10240
--8行--注释,chroot运行路径,为该服务自设置的根目录,一般需将此行注释掉
#chroot /usr/share/haproxy
uid 99 #用户UID
gid 99 #用户GID
daemon #守护进程模式
nbproc 4 #添加,设置并发进程数,建议与当前服务器CPU核数相等或为其2倍
defaults #配置默认参数,这些参数可以被用到Listen,frontend,backend组件
log global #引入global定义的日志格式
mode http #模式为http(7层代理http,4层代理tcp)
option httplog #日志类别为http日志格式
option dontlognull #不记录健康检查日志信息
retries 3 #检查节点服务器失败次数,连续达到三次失败,则认为节点不可用
redispatch #当服务器负载很高时,自动结束当前队列处理比较久的连接
maxconn 2000 #最大连接数,“defaults”中的值不能超过“global”段中的定义
#contimeout 5000 #设置连接超时时间,默认单位是毫秒
#clitimeout 50000 #设置客户端超时时间,默认单位是毫秒
#srvtimeout 50000 #设置服务器超时时间,默认单位是毫秒
timeout http-request 10s #默认http请求超时时间
timeout queue 1m #默认队列超时时间
timeout connect 10s #默认连接超时时间,新版本中替代contimeout,该参数向后兼容
timeout client 1m #默认客户端超时时间,新版本中替代clitimeout,该参数向后兼容
timeout server 1m #默认服务器超时时间,新版本中替代srvtimeout,该参数向后兼容
timeout http-keep-alive 10s # 默认持久连接超时时间
timeout check 10s #设置心跳检查超时时间
listen webcluster 0.0.0.0:80 #haproxy实例状态监控部分配置,定义一个名为webcluster的应用
option httpchk GET /index.html #检查服务器的index.html文件,指向访问页面
balance roundrobin #负载均衡调度算法使用轮询算法roundrobin
server inst1 192.168.233.22:80 check inter 2000 fall 3 weight 3
server inst2 192.168.233.23:80 check inter 2000 fall 3 weight 6
2、实现四层
关掉防火墙和安全机制
编译安装haproxy:
yum install -y pcre-devel bzip2-devel gcc gcc-c++ make
tar zxvf haproxy-1.5.19.tar.gz
可以先配置两个后端真实服务器(需要有nginx)
vim /usr/local/nginx/html/index.conf
100dd删除,然后数test1
另一个后端真实服务器也一样
cd haproxy-1.5.19/
make TARGET=linux2628 ARCH=x86_64
Haproxy服务器配置:
mkdir /etc/haproxy
cp /opt/haproxy-1.5.19/examples/haproxy.cfg /etc/haproxy/
cd /etc/haproxy/
vim haproxy.cfg
global #全局配置,主要用于定义全局参数,属于进程级的配置,通常和操作系统配置有关
--4~5行--修改,定义haproxy日志输出设置和日志级别,local0为日志设备,默认存放到系统日志
log /dev/log local0 info #修改
log /dev/log local0 notice #修改
#log loghost local0 info
maxconn 10240 #最大连接数,需考虑ulimit -n限制,推荐使用10240
--8行--注释,chroot运行路径,为该服务自设置的根目录,一般需将此行注释掉
#chroot /usr/share/haproxy
uid 99 #用户UID
gid 99 #用户GID
daemon #守护进程模式
nbproc 4 #添加,设置并发进程数,建议与当前服务器CPU核数相等或为其2倍
defaults #配置默认参数,这些参数可以被用到Listen,frontend,backend组件
log global #引入global定义的日志格式
mode http #模式为http(7层代理http,4层代理tcp)
option httplog #日志类别为http日志格式
option dontlognull #不记录健康检查日志信息
retries 3 #检查节点服务器失败次数,连续达到三次失败,则认为节点不可用
redispatch #当服务器负载很高时,自动结束当前队列处理比较久的连接
maxconn 2000 #最大连接数,“defaults”中的值不能超过“global”段中的定义
#contimeout 5000 #设置连接超时时间,默认单位是毫秒
#clitimeout 50000 #设置客户端超时时间,默认单位是毫秒
#srvtimeout 50000 #设置服务器超时时间,默认单位是毫秒
timeout http-request 10s #默认http请求超时时间
timeout queue 1m #默认队列超时时间
timeout connect 10s #默认连接超时时间,新版本中替代contimeout,该参数向后兼容
timeout client 1m #默认客户端超时时间,新版本中替代clitimeout,该参数向后兼容
timeout server 1m #默认服务器超时时间,新版本中替代srvtimeout,该参数向后兼容
timeout http-keep-alive 10s # 默认持久连接超时时间
timeout check 10s #设置心跳检查超时时间
frontend test
bind *:80
mode tcp
default_backend test
backend test
mode tcp
balance roundrobin
server server1 192.168.233.62:80 check inter 2000 fall 3 weight 3
server server2 192.168.233.63:80 check inter 2000 fall 3 weight 4
3、实现haproxy日志单独存放
haproxy的日志是默认输出到系统的syslog中,查看起来不是非常方便,为了更好的管理haproxy的日志,
我们在生产环境中会单独定义出来。需要将haproxy的info及notice日志分别记录到不同的日志文件中
vim /etc/haproxy/haproxy.cfg
global
log /dev/log local0 info
log /dev/log local0 notice
systemctl restart haproxy
#需要修改rsyslog配置,为了便于管理。将haproxy相关的配置独立定义到haproxy.conf,并放到/etc/rsyslog.d/下,
rsyslog启动时会自动加载此目录下的所有配置文件。
vim /etc/rsyslog.d/haproxy.conf
if ($programname == 'haproxy' and $syslogseverity-text == 'info')
then -/var/log/haproxy/haproxy-info.log
&~
if ($programname == 'haproxy' and $syslogseverity-text == 'notice')
then -/var/log/haproxy/haproxy-notice.log
&~
#说明:
这部分配置是将haproxy的info日志记录到/var/log/haproxy/haproxy-info.log下,
将notice日志记录到/var/log/haproxy/haproxy-notice.log下。“&~”表示当日志写入到日志文件后,
rsyslog停止处理这个信息。
systemctl restart rsyslog.service
tail -f /var/log/haproxy/haproxy-info.log #查看haproxy的访问请求日志信息