keepalived高可用集群应用实践

Keepalived高可用集群应用实践

未分类


  • 为什么VIP要绑定到eth0而不能绑定到eth1上? 
    如果绑定到eth1上,会接收不到用户发送过来的数据。eth1是为了发送广播包的,那么数据就只会从主上往备上发
 

一,keepalived

 

1.1介绍

keepalived是专门为Lvs负载均衡软件设计的(用在LVS上比用在其他软件上效果要好),用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx,Harpoxy,MySQL等)的高可用解决方案软件

 

1.2三大功能(都是为LVS服务。对其他软件只能实现高可用功能)

(1)管理LVS负载均衡软件 
(2)实现对LVS集群节点健康检查功能(LVS本身不对后方节点进行检测) 
(3)作为系统网络服务的高可用功能

 

1.3keepalived高可用故障切换转移原理

原理可分为两部分 
(1)VRRP协议:虚拟路由冗余协议 
(2)由VRRP协议实现的故障转移

 

VRRP协议

58.png-109kB
假设master每隔两秒钟发一个广播包,如果其他备节点接受到广播包,备就认为master是好的,所有的备就不做任何事情。如果备在固定时间内检测不到广播包,那么就认为主坏了,这时,所有的备就开始抢VIP(所有的备都发送广播包,只不过发的时间有先有后),先发广播包的备发送广播包到其他备,其它备收到数据,就认为主又好了。或者都发送数据包,然后按照优先级来判定谁来拿这个VIP。 
59.png-35.8kB

keepalived就延用了这种机制 
60.png-87.1kB

  • 脑裂现象(出现两个VIP) 
    如果不是主坏了,而是其它原因(网络原因,网线原因,交换机原因),那么备也会给自己增加VIP,这样用户发送的数据(通过ARP协议,获取MAC地址进行数据的发送,那么就会获取到两个MAC地址),就找不到目标。这就是keepalived的脑裂现象。
 

keepalived在网络中是怎么连接的

61.png-52.6kB

  • MySQL只有内网网卡
  • 心跳连接 
    keepalived高可用对之间是用真的线进行连接的,这种用线直连的方式就叫做心跳连接。发送的广播包,不叫广播包,而是叫心跳包
  • 冗余线 
    主备之间用真的线进行连接,那么如果线出了问题,那么就会出现脑裂现象,那么一般还要再在主备上再加一块网卡,然后再用线进行连接,这条线就叫做冗余线。
  • bond 
    把两块网卡进行绑定,这是对网卡进行高可用。linux也可以针对网卡做高可用。绑在一起就叫bond0,如果一块坏了,还可以通过另一块进行数据传输
 

二.搭建

 

2.1准备

4台虚拟机: 
1台做反向代理负载均衡 
1台做备份 
2台做web节点

 

2.2增加网卡

(1)给主和备新增加一块网卡,不能和另一块网卡同一网段,但是这两个网卡得是同一网段(设置成V1模式就不在同一网段)。目的是为了发送广播包 
(2)在主和备上给新增的网卡配置网卡文件 
cd /etc/sysconfig/network-scripts 
cp ifcfg-eth0 ifcfg-eth1 
62.png-37.3kB
启动网卡 
(3)给主备安装keepalived 
yum -y install keepalived 
(4)启动keepalived服务

装完keepalived,它的启动脚本就在/etc/init.d下,配置文件在/etc/keepalived/keepalived.conf

63.png-272.7kB
64.png-105.2kB

 

2.3修改配置文件

虽然keepalived配置文件内容有很多,但是只能用它的高可用功能(前20行左右) 
初始配置文件 
66.png-226.3kB
67.png-269.4kB

  • VIP要注意 :VIP是绑在eth0上的,因为用户的数据是从eth0上过来的

(1)对主的配置文件进行修改 
vim /etc/keepalived/keepalived.conf 
69.png-163.8kB
(2)对从的配置文件进行修改 
70.png-157.3kB
(3)在主上开启keepalived 
/etc/init.d/keepalived start 
ifconfig 
71.png-386.1kB
(4) 在从上开启keepalived,用ifconfig查看会发现没有 
(没有说明正确,因为主还活着,所以从上不会出现)

  • 接下来在主上关闭keepalived服务,从上才会出现,如果主再开启那么VIP就又会从备上跳到主上

下来启动主和节点的nginx服务,并且在浏览器上进行测试(如果主死了,访问是不受影响的)。 
这就是VIP漂移(高可用)

 

问题

用户访问时通过VIP的,那么,如果主不坏,那么备份的永远在备份,什么事情也不做,这在工作中是一种浪费。

可以通过双实例高可用来解决。(一个keepalived对起双实例,可以架设双网站) 
72.png-16.4kB

搭建双实例高可用

主的配置文件 
73.png-194.1kB
74.png-164.6kB

在主上启动keepalived服务,会发现有两个VIP 
75.png-417.5kB

修改第二个实例主的配置文件 
76.png-165.3kB
77.png-79kB

之后启动keepalived服务,会发现eth0:2,会回到主上

 

 

如果在master上打开防火墙,那么备的VIP会漂移过来。如果关闭防火墙,又会切回去

79.png-34.1kB

 

如果在工作中必须开防火墙那么怎么办?

  • tcpdump -n -i eth1 vrrp 
    80.png-127.4kB
    81.png-687.7kB

因此防火墙必须开启了VRRP协议的组播地址,数据包才能发送过来,否则,它是过不来的

  • 打开防火墙其实也能发现网卡能收到数据包,只不过是防火墙给拒绝了。因为网卡在第一层,而防火墙在第四层。
  • VRRP协议的组播地址要么是224.0.0.19,要么是224.0.0.18,所以一般要把224.0.0.0的网段打开
  • 单开一块网卡出来是为了防止keepalived广播发送到多个keepalived对
  • 网卡问题不会造成keepalived对之间的切换(就是VIP的切换) 

    如:关闭eth1的网卡,VIP会发生漂移(但是如果关闭eth0,那么VIP不会发生漂移。前提是VIP是绑定在eth0上的)

  • keepalived具有网卡的自动检测功能,如果自身的物理网卡发生问题,它不会去抢VIP
  • 导致裂脑的主要原因: 
    (1)网线出现问题() 
    ------------如果网线出现问题,那么master会发送数据包,但是slave接受不到数据包,所以它就会去抢VIP,而master认为自己没有出现问题,所以就不会去掉自己的VIP,这样两端都会有VIP,导致裂脑 
    (2)防火墙的问题
 

如何在一个网段防止keepalived对之间的冲突

如果只有一个网段,也能解决它冲突的问题:每个keepalived对用不同的组播IP地址。

 

怎么防备由于网线原因造成的裂脑问题?

(1)建立多根冗余线

 

如果master上的nginx服务掉线,那么VIP是不会发生漂移的,这种情况怎么解决?

  • keepalived解决的是物理服务器的问题,(如:服务器宕机,网卡出现问题)。但是keepalived解决不了服务的问题(如:nginx服务宕了)

因此需要在master上写一个脚本,用来监听nginx服务,如果nginx服务宕了,那么也把keepalived服务给关闭,这样master上的VIP就会漂移到slave上 
82.png-142.8kB

 

当备上出现VIP是怎么最大可能防止裂脑问题

当主上出现VIP时,肯定是master发生了问题。 
(1)ping msater上的eth1网卡,如果能通说明网线没有问题,ping主的eth0网卡,如果也能ping通(物理服务器没有问题),那么可能是master上的keepalived服务掉线(也可能是nginx服务掉线,因为在主上有当nginx掉线,那么会去关闭keepalived服务的脚本,),这种情况应该不会发生裂脑。 
(2)如果ping不通主机上的eth1,然后ping主上的eth0,如果能ping通(物理服务器没有问题),然后用tenet去扫一下80端口(nginx负载均衡监听的80),如果存在,说明nginx服务没有掉线。当出现这种情况时,最大的可能是出现了裂脑。 
22.png-181.2kB

原文地址:https://www.cnblogs.com/zhangtao11/p/9996103.html