Keepalived及其工作原理
Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题。
VRRP协议(虚拟路由冗余协议)
- 是针对路由器的一种备份解决方案
- 由多台路由器组成一个热备组,通过共用的虚拟IP地址对外提供服务
- 每个热备组内同时只有一台主路由器提供服务,其他路由器处于冗余状态
- 若当前在线的路由器失效,则其他路由器会根据设置的优先级自动接替虚拟IP地址,继续提供服务
工作原理:
在一个LVS服务集群中通常有主服务器(MASTER)和备份服务器(BACKUP)两种角色的服务器,但是对外表现为一个虚拟IP(VIP),主服务器会发送VRRP通告信息给备份服务器,当备份服务器收不到VRRP消息的时候,即主服务器异常的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。
一个合格的群集应该具备的特点:
1.负载均衡 用于提高群集的性能 LVS Nginx HAProxy SLB F5
2.健康检查(探针) 针对于调度器和节点服务器 Keepalived Heartbeat
3.故障转移 通过VIP漂移实现主备切换 VRRP 脚本
健康检查(探针)常用的工作方式:
- 发送心跳消息 : vrrp报文 ping/pong
- TCP端口检查 :向目标主机的 IP:PORT 发起TCP连接请求,如果TCP连接三次握手成功则认为健康检查正常,否则认为健康检查异常
- HTTP URL检查::向目标主机的URL路径(比如http://IP:PORT/URI路径)发起 HTTP GET 请求方法。如果响应消息的状态码为 2XX 或 3XX,则认为健康检查正常 如果响应消息的状态码为 4XX 或 5XX,则认为健康检查异常
LVS+Keepalived 高可用群集部署
实验:配置
主DR 服务器:192.168.73.100
备DR 服务器:192.168.73.130
Web 服务器1:192.168.73.110
Web 服务器2:192.168.73.120
vip:192.168.73.15
nfs服务器 192.168.73.140
1.配置实验环境:
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
2.配置两台web节点服务器
将nfs服务器的/share文件挂载再 /etc/share/nginx/html/zyz101目录中
vim /etc/fstab
192.168.73.140:/share /usr/share/nginx/html/zyz101 nfs defaults,_netdev 0 0
mount -a
配置网卡文件
vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=192.168.73.15 #指向vip
NETMASK=255.255.255.255
service network restart 或 systemctl restart network
修改 /etc/sysctl.conf 文件
/etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
sysctl -p #加载
设置临时路由
设置临时路由
route add -host 192.168.73.15
或者
vim /etc/rc.local
/sbin/route add -host 192.168.73.15 dev lo:0
chmod +x /etc/rc.d/rc.local
永久加载:
vim /etc/sysconfig/static-routes
any host 192.168.73.15 dev lo:0
systemctl restart network #重启网卡
3..配置负载调度器(主、备相同)
yum -y install ipvsadm keepalived #安装keepalived
modprobe ip_vs #开启模块
cat /proc/net/ip_vs 或者 lsmod | grep ip_vs #查看模块
开始配置keeplived
global_defs { #定义全局参数
--10行--修改,邮件服务指向本地
smtp_server 127.0.0.1
--12行--修改,指定服务器(路由器)的名称,主备服务器名称须不同,主为LVS_01,备为LVS_02
router_id LVS_01
后面四行vrrp开头的全部删掉
主配置global_defs 全局参数如下
vrrp_instance VI_1 { #定义VRRP热备实例参数
--20行--修改,指定热备状态,主为MASTER,备为BACKUP
state MASTER
--21行--修改,指定承载vip地址的物理接口
interface ens33
--22行--修改,指定虚拟路由器的ID号,每个热备组保持一致
virtual_router_id 51
--23行--修改,指定优先级,数值越大优先级越高,这里设置主为100,备为90
priority 100
修改virtual_ipaddress { #指定群集vip地址
192.168.73.15
}
--36行--修改,指定虚拟服务器地址(VIP)、端口,定义虚拟服务器和Web服务器池参数
virtual_server 192.168.73.15 80
delay_loop 6 #健康检查的间隔时间(秒)
lb_algo rr #指定调度算法,轮询(rr)
--39行--修改,指定群集工作模式,直接路由(DR)
lb_kind DR
persistence_timeout 0 #连接保持时间(秒)
protocol TCP #应用服务采用的是 TCP协议
--43行--修改,指定第一个Web节点的地址、端口
real_server 192.168.80.110 80 {
weight 1 #节点的权重
--45行--删除,添加以下健康检查方式
TCP_CHECK {
connect_port 80 #添加检查的目标端口
connect_timeout 3 #添加连接超时(秒)
nb_get_retry 3 #添加重试次数
delay_before_retry 3 #添加重试间隔
然后再real_server 添加第二个web节点的地址和端口
再删除后面的多于选项
systemctl restart keepalived
ip a 查看虚拟网卡vip地址 只有主服务器上有vip地址
systemctl restart ipvsadm
ipvsadm -ln
#如没有VIP 的分发策略,则重启 keepalived 服务,systemctl restart keepalived
验证测试;
在客户端访问 http://192.168.73.15/zyz101/test.html
再在主服务器关闭 keepalived 服务后再测试, systemctl stop keepalived
NGINX配合keepalived实现高可用负载均衡
实验配置
主DR 服务器:192.168.73.40
备DR 服务器:192.168.73.30
Web 服务器1:192.168.73.110
Web 服务器2:192.168.73.120
vip:192.168.73.15
nfs服务器 192.168.73.140
1.配置实验环境:
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
2.配置两台nginx服务器作为负载均衡的主备服务器
vim /etc/nginx/nginx.conf
在event同层块配置stream 在stream块中配置upstream
nginx -t
syatemctl enable --now nginx
安装keepalived
yum install -y keepalived.x86_64
cd /etc/keepalived/
ls
vim nginx_check.sh #编写脚本 确保nginx服务有没有开启 没有开启就关闭keepalived
chmod +x nginx_check.sh #给脚本加权
如下:
修改keepalived主配置文件
vrrp_instance VI_1 {
state MASTER # 指定keepalived的角色,MASTER为主,BACKUP为备
interface ens33 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡) 用ifconfig查看你具体的网卡
virtual_router_id 66 # 虚拟路由编号,主从要一直
priority 100 # 优先级,数值越大,获取处理请求的优先级越高
advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)
#授权访问
authentication {
auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
auth_pass 1111
}
track_script {
nginx_check.sh #(调用检测脚本)
}
virtual_ipaddress {
192.168.73.15 # 定义虚拟ip(VIP),可多设,每行一个
}
}
#后面把配置lvs多余的删掉
启动keepalived和nginx 进行测试
脑裂故障
现象:主服务器和备服务器都同时拥有相同的VIP
原因:因为主服务器和备服务器的通信中断,导致备服务器无法收到主服务器发送的VRRP报文,备服务器误认为主服务器已经故障了并通过ip命令生成VIP
解决:关闭主服务器或备服务器其中一个的keepalived服务
预防:(1)如果是系统防火墙导致,则关闭防火墙或添加防火墙规则放通VRRP组播地址(224.0.0.18)的传输
(2)如果是主备服务器之间的通信链路中断导致,则可以在主备服务器之间添加双链路通信
(3)在主服务器使用脚本定时判断与备服务器通信链路是否中断,如果判断是主备服务器之间的链接中断则自行关闭主服务器上的keepalived服务
(4)利用第三方应用或监控系统检测是否发生了脑裂故障现象,如果确认发生了脑裂故障则通过第三方应用或监控系统来关闭主服务器或备服务器其中一个的keepalived服务