HAproxy + keepalived 实现高可用
实际环境中,单台负载均衡可能会因为流量太大而down掉,因此通过keepalived来实现容错高可用
这个对与学网工的好理解,keepalived本身就是基于vrrp协议(虚拟路由冗余协议)里面的,通过VIP(虚拟IP)来实现容错,还有健康检查机制,主备切换通过优先级来判断。
Keepalived高可用服务的故障切换转移是通过VRRP机制来实现的。在Keepalived服务正常运行时,Master节点会不断向Backup节点发送(多播方式)心跳信息,用以通知Master节点的存活状态。当Master节点发生故障时,就无法发送心跳信息,Backup节点也就无法检测到来自Master的心跳信息,于是调用自身的接管程序,接管Master的资源和服务。当Master恢复时,Backup又会释放Master故障时自身接管的资源和服务,恢复到原来的备用角色。无论Master如何切换,对外都应该提供相同的服务IP地址,该IP也称作虚拟地址VIP。客户端并不需要因Master的改变而修改自己的配置,对他们来说这种切换是透明的。
核心功能
- HAPROXY
- 负载均衡会话保持,可以根据hash或者cookies实现会话保持
- 监控检测,支持TCP、HTPP两种后端服务器监控检测
- 统计监控,设置访问端口实现服务监控,也可带有页面用户认证
- ssl卸载,可以解析https报文并将请求解密为HTTP向后端服务器传输
- 其他功能,可以在http请求或者响应报文,添加、修改、删除首部信息,HTTP请求重写或者重定向;根据访问控制路由或阻断请求
安装
安装HAPROXY
和keepalived
yum -y install haproxy
yum -y install keepalived
也可参考上边的手动编译安装部署
keepalived配置
keepalived生成的配置文件位置:/etc/keepalived/keepalived.conf
配置文件主要由:1.全局段 2.VRRP实例段 3.脚本段组成
- 全局段定义(global_defs)
全局段定义允许用户设置全局相关信息,例如通知信息、关键参数配置等,该段配置在Master节点和Backup节点应当一致
global_defs {
notification_email {
[email protected] #接受者的邮箱 需要搭建SMTP服务器才可以实现
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 60
vrrp_mcast_group4 224.0.0.18
}
notification_email定义报警邮件地址,当服务切换时发送报警邮件。
notification_email_from定义发件人信息,
smtp_server和smtp_connect_timeout分别定义了SMTP服务器及相应的连接超时时间,
vrrp_mcast_group4为VRRP IPv4多播地址,默认为224.0.0.18,如果同一局域网内有多组Keepalived时需要指定不同多播地址。如果想要实现发送邮件需要搭建smtp服务器
- VRRP实例段定义(vrrp_instance)
这部分主要用来定义具体服务的实例配置,包括Keepalived主备状态、接口、优先级、认证方式和VIP信息等,每个VRRP实例可以认为是Keepalived服务的一个实例或作为一个业务服务,在一组Keepalived服务配置中,VRRP实例可以有多个。
注意,存在于Master节点中的VRRP实例配置在Backup节点中也要有一致的配置(除了节点角色、优先级不同),这样才能实现故障切换转移。
vrrp_instance R1{
state MASTER
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass passwd
}
virtual_ipaddress {
192.168.14.250
}
track_script {
chk_haproxy
}
nopreempt
preempt_delay 2
}
vrrp_instance配置段定义了一个VRRP实例并设定实例名称;
state设定初始VRRP实例角色,配置先要为该实例所在的Keepalived服务器设定其角色,在Master服务器上设置为“MASTER”,在Backup服务器上则设置为“BACKUP”;
priority优先级设定,范围1-254,数字越大,表示实例优先级越高,在同一个VRRP实例里,Master节点优先级要高于Backup节点;
virtual_router_id虚拟路由ID标识,范围0-255,Master和Backup节点配置中相同VRRP实例的虚拟路由ID标识必须一致,否则将出现脑裂问题;
advert_int用来同步通知间隔,Master节点和Backup节点之间通信检查的时间间隔,单位是秒。
角色相关信息设定完毕后就要开始配置VIP并绑定至指定的网络接口上,在virtual_ipaddress中配置VIP,可以配置多个VIP,VIP将绑定至interface参数配置的网络接口上。
authentication认证配置段作用于同一个VRRP实例的MASTER和BACKUP之前的通信,具体的配置内容有auth_type认证类型,auth_pass认证密码,认证类型有PASS(Simple Passwd)和AH(IPSEC),官方推荐PASS,验证密码为明文方式,最多8位。同一个VRRP实例的MASTER和BACKUP使用相同的密码才能正常通信。
当添加nopreemp关键字时表示设置高可用模式为非抢占模式,如果去掉此关键字则为默认的抢占模式。抢占模式是指当高优先级节点恢复后会抢占低优先级节点成为MASTER,非抢占模式允许低优先级节点继续担任MASTER,preempt_delay用来设置抢占延迟,单位秒,范围0~1000,发现低优先级MASTER后多少秒开始抢占。
track_script配置段是用于调用指定脚本,脚本相关配置请参考下一节。
- 脚本段定义
默认情况下,Keepalived仅仅在节点宕机或Keepalived进程停掉的时候才会启动切换机制。但在实际工作中,有业务服务停止而Keepalived服务还存在的情况,这就会导致用户访问的VIP无法找到对应的服务,这时可以利用Keepalived触发预制的监测脚本,实现VIP漂移来继续提供服务。
vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 2
weight -2
fall 3
rise 1
}
vrrp_script配置段定义一段脚本配置并设定脚本段名称。
script用双引号设置引用的shell语句或者shell脚本,通过该语句或脚本执行结果来判断是否触发指定动作,成功的结果不会触发动作,执行失败会触发动作。
interval设置监控间隔时间,单位为秒,
weight设置当监控脚本执行结果为失败时触发priority值调整,正数为增加优先级,负数为降低优先级,范围-255~255,
fall设置认定结果为失败时的执行失败次数,
rise设置判定结果为成功时的执行成功次数。
- 完全配置
修改网络接口interface参数
修改state 参数设置主备
设置priority优先级 主的要比备的高
virtual_router_id 50 同一配套keepalived要一致
- master:
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 60
vrrp_mcast_group4 224.0.0.18
}
vrrp_instance R1{
state MASTER
interface ens33
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass passwd
}
virtual_ipaddress {
192.168.1.100
}
track_script {
chk_haproxy
}
nopreempt
preempt_delay 2
}
vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 2
weight -2
fall 3
rise 1
}
- backup:
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 60
vrrp_mcast_group4 224.0.0.18
}
vrrp_instance R1{
state BACKUP
interface ens33
virtual_router_id 50
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass passwd
}
virtual_ipaddress {
192.168.1.100
}
track_script {
chk_haproxy
}
nopreempt
preempt_delay 2
}
vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 2
weight -2
fall 3
rise 1
- 启动
systemctl start keepalived
## 开机自启
systemctl enable keepalived
- 测试和验证
在nginx后端服务器上编辑个访问的html,运行下面的循环语句观察IP是否轮询
vim index.html
本机IP
for ((i=1; i<=8; i++))
do
curl http://192.168.1.100
echo "第 $i 次请求完成"
done
观察输出
- 模拟宕机
nopreempt
:非抢占模式,主机宕机恢复后,不会抢占备用机IP 需要把这个配置#注释,重启keepalived服务即可
haproxy配置
- 全局段定义(global)
全局参数配置,将配置与所有HAproxy服务器上
global
log /dev/log local0 info
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
log设置全局日志配置,语法为
log <address> <facility> <msglevel>
,上例中指定使用本机上的syslog服务中的local0日志设备,记录日志等级为info的日志。
chroot设置HAProxy工作目录,
pidfile设置HAProxy的pid文件位置,
maxconn设置每个HAProxy进程可用的最大连接数,
user及group设置HAProxy进程所属的用户及用户组,
daemon关键字表示以守护进程方式运行haproxy。
- 默认段定义(defaults)
默认段的作用是为后续前端代理及后端代理设置默认值
defaults
mode http
log global
option httplog
option http-server-close
option forwardfor except 127.0.0.0/8
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
mode表示HAProxy的工作模式,设置tcp时为4层模式,设置http时为7层模式。log设置日志输出方式,配置为global表示将采用全局段log的配置。
option httplog关键字表示记录HTTP详细日志,包括HTTP请求、session状态、连接数等。
option http-server-close关键字表示每次请求完毕后主动关闭HTTP通道。
option forwardfor关键字表示应用程序想记录发起请求的客户端的IP地址,需要在HAProxy上配置此选项,这样HAProxy会把客户端的IP信息发送给服务器,在HTTP请求中添加"X-Forwarded-For"字段启用 X-Forwarded-For,在requests头部插入客户端IP发送给后端的server,使后端server获取到客户端的真实IP。
option redispatch关键字表示当使用了cookie时,HAProxy将会将其请求的后端服务器信息插入到cookie中,以保证会话的持久性,如果后端的服务器服务不可用,但客户端的cookie是不会刷新的,设置此参数会将客户的请求强制定向到另外一个后端服务器上,以保证服务的正常。
retries定义连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端服务器标记为不可用。
timeout为前缀的关键字指定了一些关于请求、连接、响应的最大超时时间,单位默认为毫秒,也可以加入后缀s(秒),m(分钟),h(小时),d(天)来指定。http-request设置HTTP请求超时时长,queue设置一个请求在队列里的超时时间,connect设置最大与服务端建立连接的时长,client设置客户端最大非活动时长,server设置服务端最大非活动时长,http-keep-alive设置最大等待新请求的空闲时长,check设置检测超时时长。
- 前端代理定义(frontend)
前端代理配置定义一个服务监听,用于接受用户请求,并将请求转发给后端处理,可以定义多个前端代理
frontend main
mode http
bind :80
default_backend nginx
frontend前端代理配置段定义一组前端服务并启动服务监听,同时设置代理名称。
mode设置工作模式,如果此参数未被设定则引用默认配置段配置的模式。
bind设置监听地址及端口,地址为空或者表示绑定至所有服务器的网络接口。
default_backend指定默认后端代理进行流量转发。
- 后端代理定义(backend)
用于接受前端代理请求,并根据设置的负载均衡策略将流量转发至后端并对后端进行健康检查,一个前端可以执行多个后端,同时一个后端可以被多个调用
backend nginx
mode http
balance roundrobin
server web1 host1:80 check inter 3s rise 1 fall 2
server web2 host2:80 check
backend后端代理配置段定义一组后端服务器,同时设置代理名称。mode设置工作模式如果此参数未被设定则引用默认配置段的模式。balance设置后端负载均衡转发策略。
server配置了相应的后端服务集群地址,是真实的服务器,一个backend对应一个或者多个实体服务器。配置依次为节点名称、节点IP和端口、启用四层健康检查,在上述示例中web1服务器还设定了检查的相关参数表示每3秒(inter)检查一次,执行两次(fall)失败认为故障,执行一次(rise)成功即为服务可用。
- listen 段定义状态监控页面
listen stats
mode http
bind *:7777
stats enable#启用状态页面
stats uri /status
stats auth 123:123456 #账号密码
- 启动
systemctl start haproxy
- 开机自启
systemctl enable haproxy
ackend对应一个或者多个实体服务器。配置依次为节点名称、节点IP和端口、启用四层健康检查,在上述示例中web1服务器还设定了检查的相关参数表示每3秒(inter)检查一次,执行两次(fall)失败认为故障,执行一次(rise)成功即为服务可用。
- listen 段定义状态监控页面
listen stats
mode http
bind *:7777
stats enable#启用状态页面
stats uri /status
stats auth 123:123456 #账号密码
- 启动
systemctl start haproxy
- 开机自启
systemctl enable haproxy