LVS+keepalived高可用负载均衡集群

keepalived介绍

keepalived为LVS应运而生的高可用服务。LVS的调度器无法做高可用,于是keepalived这个软件。实现的是调度器的高可用。

但是keepalived不是专门为LVS集群服务的,也可以做其他代理服务器的高可用。

LVS高可用集群的组成

主调度器+备调度器(一般是一主二备)

主调度器能够正常运行时,由主调度器进行后端真实服务器的分配处理。其余的备用调度器都处于冗余状态。备用调度器是不参与集群的运转,只有主调度器出现了故障,无法运行,此时备调度器才会承担主调度器的工作

一旦主调度器恢复工作,继续由主调度器进行处理,备调度器又成为冗余(基于VRRP)

  • 主服务器作用:转发数据;发送报文告诉备服务器自己在线。
  • 备服务器作用:监听主服务器发来的数据;收不到消息的时候就接替主服务器。

VRRP:keepalived是基于VRRP协议,实现LVS的高可用。解决了调度器和单节点的故障问题。

VRRP协议:提高网络路由器的可靠性开发的一种协议。

选举出主和备,预先设定好了主和备的优先级,备的优先级低。一旦开启服务,优先级高的会自动抢占主的位置

vrrp的组播通信:224.0.0.18 vrrp协议当中的主备服务器通过这个组播地址进行通信,交换主备服务器之间的运行状态。主服务器会周期性的发送VRRP报文消息,以告知其他服务器,主服务器现在的状态。

主备切换:主服务器发生故障或者不可达,VRRP协议会把请求转义到备服务器。通过组播地址,VRRP可以迅速的通知其他服务器发送了主备切换,确保新的主服务器可以正常的处理客户端的请求。

故障恢复:一旦主服务器恢复通信,由组播地址进行通信,发现在恢复的主服务器优先级更高,会抢占原主服务器的位置,成为主服务器,调度和接受请求。

高可用集群的脑裂现象以及预防措施

高可用集群的脑裂现象及其诱发原因

 脑裂现象:主和备同时拥有vrrp地址。在高可用系统当中,联系两个节点的心跳线,本来是一体的。动作协调的高可用系统。心跳线断开之后,分裂了两个独立的个体。主备之间失去了联系,都以为是对方出现了故障。两个调度器就像脑裂人一样抢占VIP。导致主有VIP,备也有VIP,因此整个集群失败。

解决方法

软件层面:

1.配置文件有问题

2.通过tcpdump抓包分析

3.重启两边服务

网络层面:

1.高可用服务器之间心跳线检测失败。主备之间无法进行通信。

2.硬件层面:

2.1连接主备之间的心跳线老化

2.2网卡或者网卡驱动失效,IP地址配置冲突

2.3 防火墙没有配置心跳线消息的传输通道

2.4后端服务器的配置问题,心跳方式不同,心跳广播冲突,软件BUG

脑裂预防预防措施 

 针对脑裂现象的产生,运维人员第一时间要做的不是处理发生故障的调度器或则故障线路,而是首先确保业务不会因此中断,进行脑裂的预防尤为重要。出现问题,先保证业务的进行,再进行排障。

keepalived的体系和模块

全局模块:core模块,负责整个keepalived的启动加载和维护

VRRP模块,实现VRRP协议,主备切换

check:负责健康检查,检查后端真实服务器的健康情况,配置在真实服务器的模块当中

LVS+keepalived的实时和部署

test1  主调度器 20.0.0.10
test2  备调度器 20.0.0.20
后端真实服务器1 : 20.0.0.50
后端真实服务器2 : 20.0.0.90
vip地址:20.0.0.100
客户端:20.0.0.60

test1
//关闭防火墙
systemctl stop firewalld
setenforce 0

yum -y install ipvsadm keepalived
//安装所需工具

cd /etc/keepalived.conf
cp keepalives.conf keepalives.conf.bak
//对重要文件进行备份


vim keepalived.conf
smtp_server 127.0.0.1  //line 10
route_id LVs_01        // line 12
//主备服务器名称id不能一致

#vrrp_strict   //line 15
//取消严格遵守vrrp协议功能,注释该行

state MASTER     //LINE 22
//表示身份,主备 备:BACKUP
interface ens33    //line 24
//指定vip的物理接口

virtual_router_id 10  //26
//虚拟路由的id号

priority 100 
//优先级

advert-int 1
//发送报文的间隔时间(工作中一般为30)

authenication {
  auth_type PASS
  auth_pass 1111
}

virtuak_ipaddress {
 192.168.233.100
 //指定集群的真实地址
}
virtual-server 20.0.0.100 80 {
delay_loop 6
//健康检查的间隔时间
lb_algo rr
//负载均衡的调度算法
lb_kind DR                 //46
//指定整个LVS的工作方式,要大写
persistence_timeout 0     //48
//连接保持时间
protocol TCP
//
}

real_server 20.0.0.30 80 {   //52
weight 1
//后端真实服务器的轮询权重
TCP_CHECK {
//对真实服务器的检查
 connect_port 80
 //检测目标的端口号(此处检测是30)
 connect_timeout 3
 //检测连接超时时间
 nb_get_retry 3
 //重试次数
 delay_before_retry 4
 //重试的间隔秒数
  }
}

real_server 20.0.0.40 80 {   //52
weight 1
//后端真实服务器的轮询权重
TCP_CHECK {
//对真实服务器的检查
 connect_port 80
 //检测目标的端口号(此处检测是30)
 connect_timeout 3
 //检测连接超时时间
 nb_get_retry 3
 //重试次数
 delay_before_retry 4
 //重试的间隔秒数
  }
}
}
wq!

systemctl restart keepalived.service
ipvsadm -ln
//重启服务并查看

test2 
//关闭防火墙
systemctl stop firewalld
setenforce 0

yum -y install ipvsadm keepalived

cd /etc/keepalived.conf
cp keepalives.conf keepalives.conf.bak

scp root@192.168.233.10:/etc/keepalived/keepalived.conf /etc/keepalived
//远程复制到test2本机
//此处得修改route_id号等

安装nginx

systemctl restrat nginx
cd /usr/local/nginx/html
vim index.html
//制作访问页面
vim /etc/sysconfig/network-scripts/ifcfg-lo:0
ifup ifcfg-lo:0
route add -host 20.0.0.100 dev lo:0
vim /etc/sysctl.conf

net.ipv4.conf.lo.arp_ignore=1
//设置lo接口忽略任何接口的ARP请求

net.ipv4.conf.lo.arp_announce=2
//设置lo接口仅会相应本地的IP地址,其他的接口ARP请求全部忽略
net.ipv4.conf.all.arp_ignore=1
//所有接口忽略来自任务接口的ARP请求

net.ipv4.conf.all.arp_announce=2
//所有接口仅会响应本地的IP地址的ARP请求,其他的接口的ARP请求全部忽略

sysctl -p 
//刷新

创建页面内容

修改内核

添加虚拟网卡

test3 test4 操作相同
vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
ONBOOT=yes
IPADDR=20.0.0.100
NETMASK=255.255.255.255
wq

ifup ifcfg-lo:0
route add -host 20.0.0.100 dev lo:0

测试

本机访问
curl 本机ip

'

客户端访问
curl 20.0.0.100

下面关闭其中一个keepalived

关闭主站

观察备站

curl 20.0.0.100依然可以负载均衡访问成功

测试轮询

查看端口加权成功

结果

keepalived+nginx实验

nginx1   20.0.0.10 主
nginx2   20.0.0.20 备

实验开始前先备份以防报错而无法修改

主站
systemctl restart nginx
yum -y install keepalived
cd /etc/keeplived
cp keepalived.conf keepalived.conf.bak

smtp_server 127.0.0.1
#vrrp_strict
virtual_route_id 51

vrrp_script check_nginx {
 script "/opt/check_nginx.sh"
 interval 5
}
//添加脚本
vrrp_intance VI_1 {

}

virtual_ipaddress {
192.168.233.100
}
track_script {
check_nginx
}


scp root@192.168.233.61:/etc/keepalived/keepalived.conf /etc/keepalives/

nginx2
/opt
vim check_nginx.sh
/usr/bin/curl -I http://localhost &> /dev/null
if [ $? -ne 0 ]
then
systemctl stop keepalived
fi
wq
chmod 777 check_nginx.sh

nginx1
拖入脚本
chmod 777 check_nginx.sh
systemctl restart keepalived.service
ip addr

nginx2
设置访问页面

总结

keepalived的工作方式基于VRRP协议

1.确定主备

2.vrrp只能有一个,出现在主服务器上。

3.通过vrrp 组播地址 224.0.0.18 发送vrrp报文,检测主的心跳

4.主备切换,主出现故障,vip地址会漂移到备服务器。

5.主恢复了,vrrp地址还会回到主

6.脑裂 主备都有VIP

(硬件层面,软件层面)

脑裂解决(软件层面):

1.检查配置文件,重启

7.keepalive不是只能和lvs搭配,也可以和其他服务配合,实现高可用

如何解决keepalived脑裂问题

1.硬件:准备两条心跳线,这样短一条依然能够传送心跳消息

2.设置防火墙一定要让心跳消息通过。

3.依靠监控软件实时检测来实现(zabbix)

脑裂如何解决

软件层面:

1.配置文件有问题

2.通过tcpdump抓包分析

3.重启两边服务

网络层面:

1.高可用服务器之间心跳线检测失败。主备之间无法进行通信。

2.硬件层面:

2.1连接主备之间的心跳线老化

2.2网卡或者网卡驱动失效,IP地址配置冲突

2.3 防火墙没有配置心跳线消息的传输通道

2.4后端服务器的配置问题,心跳方式不同,心跳广播冲突,软件BUG

了解即可

dev 开发环境 开发人员专用

sit 测试环境 测试人员使用(开发,运维)

pre:预生产环境 开发和运维(和最终生产环境保持一致)

prd:生产环境(面向用户的环境)