• 它是免费、快速并且可靠的一种解决方案
• 适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理
• 提供高可用性、负载均衡以及基于TCP和HTTP应用的代理
• Session rate 会话率
– 每秒钟产生的会话数
• Session concurrency 并发会话数
– 服务器处理会话的时间越长,并发会话数越多
• Data rate 数据速率
– 以MB/s或Mbps衡量
– 大的对象导致并发会话数增加
– 高会话数、高数据速率要求更多的内存
• mode http
– 客户端请求被深度分析后再发往服务器
• mode tcp
– 客户端与服务器之间建立会话,不检查第七层信息
• mode health
– 仅做健康状态检查,已经不建议使用
• 当HAProxy运行在HTTP模式下,HTTP请求(Request)和响应(Response)均被完全分析和索引,这样便于创建恰当的匹配规则
• HTTP协议是事务驱动的
• 每个请求(Request)仅能对应一个响应(Response)
• 常见模型:
– HTTP close
– Keep-alive
– Pipelining
• HTTP close
– 客户端向服务器建立一个TCP连接
– 客户端发送请求给服务器
– 服务器响应客户端请求后即断开连接
– 如果客户端到服务器的请求不只一个,那么就要不断的
去建立连接
– TCP三次握手消耗相对较大的系统资源,同时延迟较大
• Keep-alive
– 一次连接可以传输多个请求
– 客户端需要知道传输内容的长度,以避免无限期的等
待传输结束
– 降低两个HTTP事务间的延迟
– 需要相对较少的服务器资源
• Pipelining
– 仍然使用Keep-alive
– 在发送后续请求前,不用等前面的请求已经得到回应
– 适用于有大量图片的页面
– 降低了多次请求之间的网络延迟
• 请求头部信息
– 方法:GET
– URI:/serv/login.php?lang=en&profile=2
– 版本:HTTP/1.1
– 请求头包含许多有关的客户端环境和请求正文的有用
信息,如浏览器所使用的语言、请求正文的长度等
• 响应头部信息
– 版本:HTTP/1.1
– 状态码:200
– 原因:OK
1台haproxy
192.168.4.10
2台应用服务器
201.1.1.102
201.1.1.103
[root@rs1 ~]# ip a del dev lo 201.1.1.101/32
[root@ds ~]# yum install haproxy
• HAProxy配置参数来源
– 命令行:总是具有最高优先级
– global部分:全局设置进程级别参数
– 代理声明部分
• 配置文件可由如下部分构成:
– default
为后续的其他部分设置缺省参数
缺省参数可以被后续部分重置
– frontend
描述接收客户端侦听套接字(socket)集
– backend
描述转发链接的服务器集
– listen
把frontend和backend结合到一起的完整声明
[root@haproxy haproxy]# vim haproxy.cfg
-
global
-
log
127.0
.0
.1 local2
###[err warning info debug]
-
chroot /usr/local/haproxy
-
pidfile /
var/run/haproxy.pid
###haproxy的pid存放路径
-
maxconn
4000
###最大连接数,默认4000
-
user haproxy
-
group haproxy
-
daemon
###创建1个进程进入deamon模式运行
-
-
defaults
-
mode hEp
###默认的模式mode { tcp|hEp|health } log global ###采用全局定义的日志
-
opIon dontlognull
###不记录健康检查的日志信息
-
opIon hEpclose
###每次请求完毕后主动关闭hEp通道
-
opIon hEplog
###日志类别hEp日志格式
-
opIon forwardfor
###后端服务器可以从HEp Header中获得客户端ip
-
opIon redispatch
###serverid服务器挂掉后强制定向到其他健康服务器
-
Imeout connect
10000
#如果backend没有指定,默认为10s
-
Imeout client
300000
###客户端连接超时
-
Imeout server
300000
###服务器连接超时
-
maxconn
60000
###最大连接数
-
retries
3
###3次连接失败就认为服务不可用,也可以通过后面设置
-
-
listen stats
-
bind
0.0
.0
.0:
1080
//监听端口
-
stats refresh
30s
//统计页面刷新时间
-
stats uri /mystats
//统计页面url密码
-
stats realm Haproxy manager
//统计页面密码框上提示文本
-
stats auth admin:admin
//统计页面上用户名和密码
-
-
listen websrv
0.0
.0
.0:
80
//定义监听后端的web
-
cookie SERVERID rewrite
-
balance roundrobin
-
server web1
192.168
.4
.11:
80 cookie app1inst1 check inter
2000 rise
2 fall
5
// inter 2000 每2s检查一次 rise 2 检测2次成功才认为成功 fall 5 检测5次失败才认为失败
-
server web2
192.168
.4
.12:
80 cookie app1inst2 check inter
2000 rise
2 fall
5
// inter 2000 每2s检查一次 rise 2 检测2次成功才认为成功 fall 5 检测5次失败才认为失败
[root@svr1 ~]# systemctl start haproxy
所有的日志由rsyslog进行管理
为了配置haproxy的日志,需要修改/etc/rsyslog.conf.
支持远端日志功能修改配置文件:
host80 ~]# vim /etc/rsyslog.conf
ModLoadimudp【把这两行注释取消】 M o d L o a d i m u d p 【 把 这 两 行 注 释 取 消 】 UDPServerRun 514
local2.* /var/log/haproxy.log
类型.级别
systemctl restart rsyslog
systemctl restart haproxy
ls /var/log/haproxy.log
后端服务器日志要显示客户端真实IP,这个客户端IP是存放在请求头里面的【可以通过curl -I IP地址查看】。而不显示代理服务器IP,可以通过修改httpd配置文件实现。
vim /etc/httpd/conf/httpd.conf
196 LogFormat “%{X-Forwarded-For}i %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”” combined
systemctl restart httpd
tail -f /var/log/httpd/access_log
Keepalived概述
• 调度器出现单点故障,如何解决?
• Keepalived实现了高可用集群,这种高可用是通过提供VIP来实现的
• Keepalived最初是为LVS设计的,专门监控各服务器节点的状态
• Keepalived后来加入了VRRP(虚拟路由冗余协议)功能,防止单点故障
Keepalived运行原理
• Keepalived检测每个服务器节点状态
• 服务器节点异常或工作出现故障, Keepalived将故障节
点从集群系统中剔除
• 故障节点恢复后,Keepalived再将其加入到集群系统中。还能实现邮件报警
• 所有工作自动完成,无需人工干预
健康的主机会定时发送多波信号,发送多波信号是为了检测集群关系的,当一个keepalive坏了的时候,另外一个可以夺取对方资源。继续发送多波信号
• 使用Keepalived高可用解决调度器单点失败问题
• 主、备调度器上配置LVS
• 主调度器异常时,Keepalived启用备用调度器调度器
常用的HA集群
keepalived
rhcs
pacemaker + corosync
1. 环境的准备
rs1:201.1.1.102
rs2:201.1.1.103
ds1:201.1.1.100
ds2:201.1.1.99
vip:201.1.1.101
client:201.1.1.254
2. 在2台调度器(99和100)上安装软件:
[root@ds1 yum.repos.d]# yum install keepalived
[root@ds1 yum.repos.d]#yum -y install ipvsadm.x86_64
健康检测测试:
停掉其中一个real server的httpd服务
HA的测试:
停掉主服务的keepalived服务
vip配置成不抢占,修改配置文件
state BACKUP
nopreempt
LVS+keepalive高可用
环境准备
client:201.1.1.254
ds1:201.1.1.100
ds2:201.1.1.99
rs1:201.1.1.102
rs2:201.1.1.103
1.装包
[root@ds1 ~]# yum -y install kepalived
[root@ds2 ~]# yum -y install kepalived
2.修改配置文件(99和100)
1)LVS1调度器设置Keepalived,并启动服务
[root@lvs1 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
[email protected] //设置报警收件人邮箱
}
notification_email_from ka@localhost //设置发件人
smtp_server 127.0.0.1 //定义邮件服务器
smtp_connect_timeout 30
router_id ds1 //设置路由ID号
}
vrrp_instance VI_1 {
state BACKUP
nopreempt //不抢占VIP
interface eth0 //定义网络接口
virtual_router_id 50 //主辅VRID号必须一致
priority 100 //服务器优先级
advert_int 1
authentication {
auth_type pass
auth_pass forlvs //主辅服务器密码必须一致
}
virtual_ipaddress { 201.1.1.101 }
}
virtual_server 201.1.1.101 80 { //设置VIP为201.1.1.101
delay_loop 6
lb_algo wrr //设置LVS调度算法为RR
lb_kind DR //设置LVS的模式为DR
persistence_timeout 1
protocol TCP
real_server 201.1.1.102 80 {
weight 1 //设置权重为1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 201.1.1.103 80 {
weight 1 //设置权重为1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
[root@lvs1 ~]# systemctl start keepalived
[root@lvs1 ~]# ipvsadm -Ln
curl http://201.1.1.101
debug:
1. ping 201.1.1.101
2. 在ds服务器,ipvsadm -ln,如果看不到规则,则:
1) 检查keepalived配置文件
2)检查real server的httpd服务是否启动
3. 检查real server是否绑定了vip,以及是否调整了内核参数
haproxy实现的是负载均衡的集群
keepalive实现的是高可用的集群
2台haproxy实现HA
2台应用服务器—httpd
1台client
haproxy1(ds1) – 201.1.1.100
haproxy2(ds2) – 201.1.1.99
vip: 201.1.1.101
rs1:201.1.1.102
rs2:201.1.1.103
2.修改配置文件(99和100)
global_defs {
router_id directorServer2
}
vrrp_instance VI_1 {
state SLAVE
interface eth0
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.4.253
}
}
通过脚本对haproyx做健康检查:
cat check_haproxy_status.sh
curl -I localhost &> /dev/null
if [ $? -ne 0 ];then
systemctl stop keepalived
fi
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id ds1
}
vrrp_script check_haproxy {
script “/etc/keepalived/check_haproxy_status.sh”
inerval 5
}
vrrp_instance VI_1 {
state BACKUP
………
………
track_script {
check_haproxy
}
}
• 优点
– 工作在7层,可以针对http做分流策略
– 正则表达式比HAProxy强大
– 安装、配置、测试简单,通过日志可以解决多数问题
– 并发量可以达到几万次
– Nginx还可以作为Web服务器使用
• 缺点
– 仅支持http、https、mail协议,应用面小
– 监控检查仅通过端口,无法使用url检查
• 优点
– 负载能力强,工作在4层,对内存、CPU消耗低
– 配置性低,没有太多可配置性,减少人为错误
– 应用面广,几乎可以为所有应用提供负载均衡
• 缺点
– 不支持正则表达式,不能实现动静分离
– 如果网站架构庞大,LVS-DR配置比较繁琐
• 优点
– 支持session、cookie功能
– 可以通过url进行健康检查
– 效率、负载均衡速度,高于Nginx,低于LVS
– HAProxy支持TCP,可以对MySQL进行负载均衡
– 调度算法丰富
• 缺点
– 正则弱于Nginx
– 日志依赖于syslogd,不支持apache日志