Haproxy与Keepalived VRRP 介绍
软件:haproxy---主要是做负载均衡的7层,也可以做4层负载均衡 apache也可以做7层负载均衡,但是很麻烦。实际工作中没有人用。 负载均衡是通过OSI协议对应的 7层负载均衡:用的7层http协议, 4层负载均衡:用的是tcp协议加端口号做的负载均衡
ha-proxy概述 ha-proxy是一款高性能的负载均衡软件。因为其专注于负载均衡这一些事情,因此与nginx比起来在负载均衡这件事情上做更好,更专业。
ha-proxy的特点 ha-proxy 作为目前流行的负载均衡软件,必须有其出色的一面。下面介绍一下ha-proxy相对LVS,Nginx等负载均衡软件的优点。
支持tcp / http 两种协议层的负载均衡,使得其负载均衡功能非常丰富。 支持8种左右的负载均衡算法,尤其是在http模式时,有许多非常实在的负载均衡算法,适用各种需求。 性能非常优秀,基于单进程处理模式(和Nginx类似)让其性能卓越。 拥有一个功能出色的监控页面,实时了解系统的当前状况。 功能强大的ACL支持,给用户极大的方便。
haproxy算法: 1.roundrobin 基于权重进行轮询,在服务器的处理时间保持均匀分布时,这是最平衡,最公平的算法.此算法是动态的,这表示其权重可以在运行时进行调整. 2.static-rr 基于权重进行轮询,与roundrobin类似,但是为静态方法,在运行时调整其服务器权重不会生效.不过,其在后端服务器连接数上没有限制 3.leastconn 新的连接请求被派发至具有最少连接数目的后端服务器.
keepalived是什么 keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。
keepalived工作原理 keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。(云服务器不支持VRRP)
虚拟路由冗余协议,可以认为是实现高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。
脑裂(裂脑): Keepalived的BACKUP主机在收到不MASTER主机报文后就会切换成为master,如果是它们之间的通信线路出现问题,无法接收到彼此的组播通知,但是两个节点实际都处于正常工作状态,这时两个节点均为master强行绑定虚拟IP,导致不可预料的后果,这就是脑裂。 解决方式: 1、添加更多的检测手段,比如冗余的心跳线(两块网卡做健康监测),ping对方等等。尽量减少"裂脑"发生机会。(指标不治本,只是提高了检测到的概率); 2、做好对裂脑的监控报警(如邮件及手机短信等或值班).在问题发生时人为第一时间介入仲裁,降低损失。 3、爆头,将master停掉。然后检查机器之间的防火墙。网络之间的通信
实验环境
代码语言:javascript复制[root@master /]# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
在所有服务器上面进行配置
代码语言:javascript复制systemctl stop firewalld #关闭防火墙
setenforce 0 #关闭selinux,临时生效
vim /etc/hosts
172.16.0.10 master
172.16.0.8 backup
172.16.0.4 server1
172.16.0.5 server2
安装nginx
给两台web服务器配置安装nginx
代码语言:javascript复制[root@server1 /]# yum install nginx -y
[root@server2 /]# yum install nginx -y
创建测试文件
代码语言:javascript复制[root@server1 /]# echo "Hello World server1" > /usr/share/nginx/html/index.html
[root@server2 /]# echo "Hello World server2" > /usr/share/nginx/html/index.html
安装Haproxy调度器
master:
代码语言:javascript复制[root@master /]# yum -y install haproxy
[root@master /]# cp -rf /etc/haproxy/haproxy.cfg{,.bak}
[root@master /]# vim /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2 info
pidfile /var/run/haproxy.pid
maxconn 4000 #优先级低
user haproxy
group haproxy
daemon #以后台形式运行ha-proxy
nbproc 1 #工作进程数量 cpu内核是几就写几
defaults
mode http #工作模式 http ,tcp 是 4 层,http是 7 层
log global
retries 3 #健康检查。3次连接失败就认为服务器不可用,主要通过后面的check检查
option redispatch #服务不可用后重定向到其他健康服务器。
maxconn 4000 #优先级中
contimeout 5000 #ha服务器与后端服务器连接超时时间,单位毫秒ms
clitimeout 50000 #客户端超时
srvtimeout 50000 #后端服务器超时
listen stats
bind *:81
stats enable
stats uri /haproxy #使用浏览器访问 http://172.16.0.10:81/haproxy,可以看到服务器状态
stats auth we:123 #用户认证
frontend web
mode http
bind *:80 #监听哪个ip和什么端口
option httplog #日志类别 http 日志格式
acl html url_reg -i .html$ #1.访问控制列表名称html。规则要求访问以html结尾的url(可选)
use_backend httpservers if html #2.如果满足acl html规则,则推送给后端服务器httpservers
default_backend httpservers #默认使用的服务器组
backend httpservers #名字要与上面的名字必须一样
balance roundrobin #负载均衡的方式
server http1 172.16.0.4:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
server http2 172.16.0.5:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
backup:
代码语言:javascript复制[root@backup /]# yum -y install haproxy
[root@backup /]# cp -rf /etc/haproxy/haproxy.cfg{,.bak}
[root@backup /]# vim /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2 info
pidfile /var/run/haproxy.pid
maxconn 4000 #优先级低
user haproxy
group haproxy
daemon #以后台形式运行ha-proxy
nbproc 1 #工作进程数量 cpu内核是几就写几
defaults
mode http #工作模式 http ,tcp 是 4 层,http是 7 层
log global
retries 3 #健康检查。3次连接失败就认为服务器不可用,主要通过后面的check检查
option redispatch #服务不可用后重定向到其他健康服务器。
maxconn 4000 #优先级中
contimeout 5000 #ha服务器与后端服务器连接超时时间,单位毫秒ms
clitimeout 50000 #客户端超时
srvtimeout 50000 #后端服务器超时
listen stats
bind *:81
stats enable
stats uri /haproxy #使用浏览器访问 http://172.16.0.8:81/haproxy,可以看到服务器状态
stats auth we:123 #用户认证
frontend web
mode http
bind *:80 #监听哪个ip和什么端口
option httplog #日志类别 http 日志格式
acl html url_reg -i .html$ #1.访问控制列表名称html。规则要求访问以html结尾的url(可选)
use_backend httpservers if html #2.如果满足acl html规则,则推送给后端服务器httpservers
default_backend httpservers #默认使用的服务器组
backend httpservers #名字要与上面的名字必须一样
balance roundrobin #负载均衡的方式
server http1 172.16.0.4:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
server http2 172.16.0.5:80 maxconn 2000 weight 1 check inter 1s rise 2 fall 2
启动Haproxy服务
代码语言:javascript复制[root@master /]# systemctl start haproxy
[root@backup /]# systemctl start haproxy
使用客户机测试
Keepalived实现调度器HA高可用
安装keepalived
代码语言:javascript复制[root@master /]# yum install -y keepalived
[root@backup /]# yum install -y keepalived
编辑配置文件 master:
代码语言:javascript复制[root@master /]# cp /etc/keepalived/keepalived.conf{,.bak}
[root@master /]# vim /etc/keepalived/keepalived.conf
global_defs {
router_id directory1 #调度器的名称,备调度器改为directory2(两个名字一定不能一样)
}
vrrp_instance VI_1 {
state MASTER #定义主还是备,备用的话写backup
interface ens33 #VIP绑定接口
virtual_router_id 80 #整个集群的调度器一致(在同一个集群)
priority 100 #主调度器优先级 备调度器改为50
advert_int 1 #发包
authentication {
auth_type PASS #主备节点认证信息
auth_pass 1111
}
virtual_ipaddress {
172.16.0.100/24 #VIP 设置为自己网段
}
}
backup:
代码语言:javascript复制[root@backup /]# cp /etc/keepalived/keepalived.conf{,.bak}
[root@backup /]# vim /etc/keepalived/keepalived.conf
global_defs {
router_id directory2 #调度器的名称,备调度器改为directory2(两个名字一定不能一样)
}
vrrp_instance VI_1 {
state backup #定义主还是备,备用的话写backup
interface ens33 #VIP绑定接口
nopreempt #设置到backup上面,不抢占资源
virtual_router_id 80 #整个集群的调度器一致(在同一个集群)
priority 50
advert_int 1 #发包
authentication {
auth_type PASS #主备节点认证信息
auth_pass 1111
}
virtual_ipaddress {
172.16.0.100/24 #VIP 设置为自己网段
}
}
启动keepalived
代码语言:javascript复制[root@master /]# systemctl start keepalived
[root@backup /]# systemctl start keepalived
查看VIP IP绑定成功了没
代码语言:javascript复制[root@master /]# ip add |grep 172.16.0.
inet 172.16.0.10/24 brd 172.16.0.255 scope global dynamic ens33
inet 172.16.0.100/24 scope global secondary ens33
[root@backup /]# ip add |grep 172.16.0.
inet 172.16.0.8/24 brd 172.16.0.255 scope global dynamic ens33
可以看到VIP地址在主调度器上 如果这个时候keepaliedv主节点服务器宕机了,VIP会自己漂移到备用节点上。
5>浏览器访问VIP地址
基于nginx的高可用性
以上我们只是实现了高可用,基于Haproxy的前提是Haproxy服务是正常。如果有突发情况使得nginx服务不能启动,但是我们的keepalived服务是正常,这个时候用户是访问不到的,VIP也不会自动漂移到备用的节点服务器上。所以我们需要写一些代码来判断一下Haproxy服务是不是正常,如果不正常的话我们就将Haproxy服务关掉,然后实现VIP的漂移,这个时候用户就不会出现无法访问的情况了。
思路: 让Keepalived以一定时间间隔执行一个外部脚本,脚本的功能是当Haproxy失败,则关闭本机的Keepalived
代码语言:javascript复制[root@master /]# vim /etc/keepalived/check_haproxy_status.sh
#!/bin/bash
/usr/bin/curl -I http://localhost &>/dev/null
if [ $? -ne 0 ];then
# /etc/init.d/keepalived stop
systemctl stop keepalived
fi
[root@master /]# chmod a x /etc/keepalived/check_haproxy_status.sh
2>keepalived使用script
代码语言:javascript复制master:
[root@master /]# vim /etc/keepalived/keepalived.conf
global_defs {
router_id directory1
}
vrrp_script check_haproxy {
script "/etc/keepalived/check_haproxy_status.sh"
interval 5 #每5秒执行一次
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 80
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.0.100/24
}
track_script {
check_haproxy
}
}
测试
将keepalived的主节点的haproxy服务关闭,查看vip是否漂移,如果漂移,即成功