keepalived高可用

Keepalived是一款专为LVS设计的高可用性解决方案,通过VRRP协议实现网络服务的故障转移和自动切换。本文详细介绍Keepalived的功能、配置步骤及如何在CentOS系统上安装与设置,涵盖故障检测、裂脑现象解决策略及多组Keepalived服务器的冲突避免。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Keepalived 高可用集群

  • Keepalived,专门为LVS设计的,用来管理并监控LVS集群中的各个服务节点状态,后来又加入了可以实现高可用的VRRP功能。所以Keepalived还能作为其他服务。
  • Keepalived主要是通过VRRP协议实现高可用。VRRP是Virtual Router Redundancy Protocol (虚拟路由器冗余协议),VRRP解决静态路由单点故障问题的,它能保证个别宕机后,整个网络不间断运行,所以Keepalived具有配置管理LVS功能,对LVS下面节点进行健康检查功能,以及实现网络的高可用。
  • Keepalived官方网址:http://www.keepalived.org
  • Keepailved除了LVS,对其他软件而言,只能实现高可用功能。

Keepalived的三大功能

  1. 管理LVS负载均衡软件:Keepalived可以通过读取自身的配置文件,实现通过更底层的接口直接管理LVS的配置以及控制服务的启动,停止功能
  2. 实现对LVS集群节点健康检查功能:当LVS集群中的某些节点同时发生故障,Keepalived自动将失效的节点从LVS正常转发列队中清除,并将请求调度到正常节点服务器上,当故障的节点被修复后,Keepalived又会自动的把他们加入到正常转发列队中,对客户提供服务。
  3. 作为系统网络服务的高可用功能(failover):
  • Keepalived可以实现任意两台主机之间的故障转移和自动切换。如Master和Backup,这个主机可以是普通的不能停机的业务服务器,也可以是LVS负载均衡,也可以是Nginx反向代理服务器。
  • Keepalived高可用的简单原理:两台主机同时安装好Keepalived并启动服务,开始工作是,Master主机提供服务,backup主机作为Master主机的热备。当Master失效或故障时,backup将自动接管Master的所有工作,包括接管VIP资源及相应资源服务,而当Master故障修复后,会自动接管回它原来处理的工作,backup则释放之前接管的工作。两台主机将恢复到最初的状态

Keepalived高可用故障切换转移原理

  • Keepalived高可用服务之间的故障切换转移,时通过VRRP实现的
  • Keepalived正常工作时,主Master节点会不端的向备节点发送(多播的方式)心跳消息,用以告诉备Backup节点自己还活着,当主Master故障时,就无法发送心跳消息,备节点就会无法继续检测来自主的Master节点的心跳了,于是调用自身的接管程序,接管主Master节点的IP资源及服务。当主恢复时,备节点又会释放之前接管的任务,恢复到原来分备用角色

裂脑及故障思路

  • 裂脑:(网线坏掉)主会定时(比如每一秒)给备发心跳消息,当主出现故障,备接管任务,这没问题。但是,当主没有出现故障而是主备之间的网络坏掉,这时网关型防火墙过来的ARP协议通过IP查MAC地址,就会不知道给谁了,这就是裂脑。(网卡坏掉不会产生裂脑,Keepalived有健康检测)
  • 解决脑裂办法(心跳连接):主备之间都要准备至少两块网卡。一块是和其他服务器在同一网段,另外的网卡组合成虚拟网卡默认名字(band0),实现网卡高可用。在单独的另一个网段,让主备之间单独互通。这个另外的网卡直接用真实的网线彼此连接。这种连接叫心跳连接。之所以分出另一个网段,也是为了防止多组主备之间的影响。比如:有主1 备1 和主2 备2,当主1坏了,但是主2还是好的,那么备1还会接受到主机发来的心跳消息,就不能及时接受主1的任务,会出现混淆。
  • 故障思路:
    1. 简单判断:只要节点出现VIP就报警,两种情况:1是主机宕机了备机接管了;2是主机没宕机,裂脑了,
    2. 严重判断:备节点出现对应的VIP,并且主节点及对应的服务还活着,就说明裂脑了

CentOS 7.5安装keepalived

https://blog.youkuaiyun.com/cuiyaoqiang/article/details/79412599
https://jingyan.baidu.com/album/09ea3ede58d035c0aede3938.html?picindex=3

Keepalived过程简介(CentOS 6.5)

准备两台虚拟机master和backup(nginx反向代理)
在vmware中给想要实验的虚拟机增加虚拟网卡,并设置成不同网段。(在这里用仅主机模式)(两台都要做)
#查看网卡 eth1 没开启(state DOWN)
[root@moban6 ~]# ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:1d:b3:55 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 00:0c:29:1d:b3:5f brd ff:ff:ff:ff:ff:ff
#做eth1的网卡配置文件
[root@moban6 ~]# cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth1
[root@moban6 ~]# cat > /etc/sysconfig/network-scripts/ifcfg-eth1 << fff
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=dhcp
fff
[root@moban6 ~]# ifup eth1
####   检查   ####
#yum本地安装
[root@moban6 ~]# mount /dev/sr0 /media/cdrom
[root@moban6 ~]# yum -y install keepalived
#yum本地安装的启动脚本就在 
[root@moban6 ~]# /etc/init.d/keepalived start
#默认出现三个就是正确的
[root@moban6 conf]# ps -ef |grep -v grep|grep keep
root       3459      1  0 21:47 ?        00:00:00 /usr/sbin/keepalived -D
root       3460   3459  0 21:47 ?        00:00:00 /usr/sbin/keepalived -D
root       3461   3459  0 21:47 ?        00:00:00 /usr/sbin/keepalived -D
#默认会启动三个VIP地址
[root@moban6 conf]# ip add |grep 192.168
    inet 192.168.200.152/24 brd 192.168.200.255 scope global eth0
    inet 192.168.200.16/32 scope global eth0
    inet 192.168.200.17/32 scope global eth0
    inet 192.168.200.18/32 scope global eth0
#配置文件
[root@moban6 ~]# ll /etc/keepalived/keepalived.conf
#检查完就关了
[root@moban6 ~]# /etc/init.d/keepalived stop

#看配置文件(我们只能用高可用功能,因为是Nginx反向代理)
[root@moban6 conf]# head -13 /etc/keepalived/keepalived.conf |cat -n
     1	! Configuration File for keepalived
     2	
     3	global_defs {              #全局模块
     4	   notification_email {    #里面是邮箱,出了问题给谁发邮件
     5	     acassen@firewall.loc  #任意写就就行,因为没有邮件服务 
     6	     failover@firewall.loc
     7	     sysadmin@firewall.loc
     8	   }
           #下面是发件人邮箱地址,也随便写
     9	   notification_email_from Alexandre.Cassen@firewall.loc
    10	   smtp_server 192.168.200.1  #邮件服务器的ip地址
    11	   smtp_connect_timeout 30    #邮件服务器超时时间
    12	   router_id LVS_DEVEL        #真实路由地址,主备的不能一样
    13	}
[root@moban6 conf]# sed -n '15,30{=;p}' /etc/keepalived/keepalived.conf |xargs -L2
#这又是一个大的函数15-30行
15 vrrp_instance VI_1 {  #vrrp(高可用对)的虚拟实例的名字VI_1主备之间名字一样(高可用对)
16      state MASTER          #当前配置文件是主。从写BACKUP或SLAVE
17      interface eth0        #网卡接口,改为eth1
18      virtual_router_id 51  #虚拟路由IP主备相同的
19      priority 100          #优先级数字,一般主优先级高,就是数字大,一般主150,备100
20      advert_int 1          #每隔一秒发送心跳包
21      authentication {      #密码验证,接受心跳包需要验证
22          auth_type PASS        #一般就是使用默认的不改
23          auth_pass 1111        
24 }
25      virtual_ipaddress {   #虚拟IP地址就是VIP
26          192.168.200.16        #写一个就行
27          192.168.200.17
28          192.168.200.18
      #修改后
29          192.168.200.16/24 dev eth0 label eth0:1 
      #eth0的网段,IP不能是主和备冲突但这两个配置文件里IP的需要相同
      #虚拟IP绑定接口为eth0,接受数据包是eth0,别名(label)eth0:1,此参数节点设置主备相同
   }
30 }

keepalived 单实例

######   修改后   ######
[root@moban6 conf]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
	
global_defs {
   notification_email {
      740296672@qq.com
}
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LB01  #从LB02
}
vrrp_instance VI_1 {
   state MASTER
   interface eth1
   virtual_router_id 55
   priority 150
   advert_int 1
   authentication {
      auth_type PASS
      auth_pass 1111
   }
   virtual_ipaddress {
      192.168.200.16/24 dev eth0 label eth0:1 
      #eth0的网段,IP不能是主和备冲突但这两个配置文件里IP的需要相同
      #虚拟IP绑定接口为eth0,接受数据包是eth0,别名(label)eth0:1,此参数节点设置主备相同
   }
}
[root@moban6 conf]# /etc/init.d/keepalived start

360截图174111017678122.png-101.4kB

Keepalived 双实例

#单实例是一种浪费资源。假如主不出故障呢,备就浪费了,所以我们做双实例,主备各有个VIP,这样就是有两个域名,大企业由于是多个域名,这样做节约资源
[root@moban6 conf]# vim /etc/keepalived/keepalived.conf
####   上面的没有变化在这里就不写了   ####
vrrp_instance VI_2 {
    state BACKUP
    interface eth1
    virtual_router_id 60
    priority 100 
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }   
    virtual_ipaddress {
        192.168.200.170/24 dev eth0 label eth0:2
    }   
}
[root@moban6 conf]# /etc/init.d/keepalived restart
##测试:就是两台服务器分别关闭服务,然后查看对方服务器的ifconfig 

360截图17670911110138129.png-85.4kB
360截图17290501294664.png-131kB

keepalived高可用对物理服务器问题

keepalived解决的是物理服务器故障,比如keepalived stop(刚才的实验),网卡坏掉。
但是keepalived不能检测htttp端口坏了,(/usr/local/nginx/sbin/nginx -s stop),所以我们要写个脚本。

#####    方法一    #####
#在主Master上做脚本
#如果没有80端口存在,就停掉Keepalived服务,实现释放本地VIP,在后台执行并检查
[root@moban6 conf]# cat check_nginx.sh
#!/bin/bash
while true
do
    if [ `netstat -antup |grep nginx |wc -l` -ne 1 ];then
        /etc/init.d/keepalived stop
    fi
    sleep 5
done

[root@moban6 conf]# sh check_nginx.sh &
[root@moban6 conf]# ps -ef | grep check | grep -v grep

#####    方法二    #####
[root@moban6 conf]# cat chk_nginx_proxy.sh
#!/bin/bash
if [ `netstat -antup |grep nginx |wc -l` -ne 1 ] ; then
    /etc/init.d/keepalived stop
fi
[root@moban6 conf]#chmod +x chk_nginx_proxy.sh
[root@moban6 conf]#cat /etc/keepalived/keepalived.conf

[root@moban6 conf]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
	
global_defs {
   notification_email {
      740296672@qq.com
}
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LB01  #从LB02
}
vrrp_script chk_nginx_proxy {  #定义vrrp脚本,检测http端口
    script "/server/scripts/chk_nginx_proxy.sh" #执行脚本,有问题就停掉keepalived
    interval 2                 #间隔2秒
    weight   2
}
vrrp_instance VI_1 {
   state MASTER
   interface eth1
   virtual_router_id 55
   priority 150
   advert_int 1
   authentication {
      auth_type PASS
      auth_pass 1111
   }
   virtual_ipaddress {
      192.168.200.16/24 dev eth0 label eth0:1 
   }
}
track_script {
    chk_nginx_proxy            #触发检查
}

解决多组Keepalived服务器在一个局域网的冲突问题

当在同一个局域网内部署了多组keepalived,而又未使用专门的心跳通信时,可能会发生高可用接管的严重故障。VRRP协议默认通过IP多播的形式实现高可用对之间的通信,默认为224.0.0.18,我们修改此多播地址,就可配置实现唯一的多播地址

[root@moban6 conf]# vim /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_19
vrrp_mcast_group4 224.0.0.19  #这就是指定多播地址的配置
}
#不同实例的通信密码最好不同,以确保接管正常
#另一款高可用原件Heartbeat,如果采用更多播方式实现主备通信,也会有多播地址冲突问题

检测裂脑简本

检测思路:再备节点上执行脚本,如果可以ping通主节点并备节点有VIP就报警,让人员介入检查

#正常情况下,主节点活着,VIP在主节点上,就不会报警
#可以将此脚本整合到Zabbix或者Nagios上监控
[root@moban6 conf]# cat check_split_brain.sh
#!/bin/bash
lb01_vip=192.168.200.150
lb01_ip=192.168.200.153  

while true
do 
    ping -c 2 -W 3 $lb01_ip &>/dev/null
    if [ $? -eq 0 -a `ip a |grep "$lb01_vip" |wc -l` -eq 1 ];then
        echo "ha is split brain.warning"
    else
        echo "ha is OK"
    fi
    sleep 5
done
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值