Keepalived高可用集群

一、服务介绍

keepalive起初是专为LVS设计的,专门用来监控LVS集群系统红各个服务节点的状态,后来又加入了VRRP的功能,因此不了配合LVS服务外,也可以作为其他服务(nginx,haproxy)的高可用软件,VRRP是virtual router redundancy protocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由出现的单点故障问题,他能够保证网络的不间断、稳定的运行。所以,keepalive一方面具有LVS(cluster nodes healthchecks)功能,另一方面也具有LVS directors failover功能。

主要功能:实现LB Master主机和backup主机之间故障转义和自动切换。

二、keepalived故障切换转义原理介绍

2.1 切换原理

 keepalived directors高可用对之间的故障切换转移,是通过VRRP协议(virtual router redundancy Protocol虚拟路由器冗余协议)来实现的。
在keepalived Directors正常工作时,主director节点会不断的向备节点广播心跳消息,用以告诉备节点自己还活着,当主节点发生故障时,备节点就无法继续检测到主节点的心跳,进而调用自身的接管程序,接管主节点的IP资源及服务。而当主节点恢复故障时,备节点会释放主节点故障时自身接管的IP资源及服务,恢复到原来的自身的备用角色。

2.1 协议介绍
VRRP协议,全称Virtual Router Redundancy Protocol,中文名,虚拟路由冗余协议,VRRP的出现就是为了解决静态路由的单点故障,VRRP是通过一种竞选协议机制来将路有任务交给某台VRRP路由器。
MASTER和BACKUP
在一个VRRP虚拟路由器中,有多台物理的VRRP路由器,但是这多台物理的机器并不同时工作,而是由一台称为MASTER的负责路由工作,其他的都是BACKUP,MASTER并非一成不变,VRRP协议让每个VRRP路由器参与竞选,最终获胜的就是MASTER。MASTER有一些特权,比如拥有虚拟路由器的IP地址,我们的主机就是用这个IP地址作为静态路由的。拥有特权的MASTER要负责转发发送给网关地址的包和响应ARP请求。
VRRP通过竞选协议来实现虚拟路由器的功能,所有的协议报文都是通过IP多播(multicast)包(多播地址224.0.0.18)形式发送的。虚拟路由器由VRID(范围0-255)和一组IP地址组成,对外表现为一个周知的MAC地址:00-00-5E-00-01-{VRID}。所以,在一个虚拟路由器中,不管谁是MASTER,对外都是相同的MAC和IP(称之为VIP)。客户端主机并不需要因为MASTER的改变而修改自己的路由配置,对他们来说,这种主从的切换是透明的。
在一个虚拟路由器中,只有作为MASTER的VRRP路由器会一直发送VRRP广告包(VRRP Advertisement message),BACKUP不会抢占MASTER,除非它的优先级(priority)更高。当MASTER不可用时(BACKUP收不到广告包),多台BACKUP中优先级最高的这台会被抢占为MASTER。这种抢占是非常快速的(<1s),以保证服务的连续性。
处于安全性考虑,VRRP包使用了加密协议进行加密。

三、keepalived安装、配置、启动

3.1软件的安装

 [root@linux-node1 ~]# cat /etc/redhat-release 
 CentOS Linux release 7.5.1804 (Core)  
 方法一,直接yum安装: 
 [root@linux-node2 ~]# yum install keepalived -y
 方法二,采用编译安装:
软件下载地址:http://www.keepalived.org/download.html [root@linux
-node1 ~]# wget http://www.keepalived.org/software/keepalived-2.0.12.tar.gz [root@linux-node1 ~]# mkdir /etc/keepalived [root@linux-node1 ~]# cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/ # 拷贝配置文件 [root@linux-node1 ~]# cp /usr/local/sbin/keepalived /usr/sbin/ # 拷贝keepalived命令到环境变量默认目录 [root@linux-node1 ~]# systemctl start keepalived.service # 通过命令启动文件

3.2 MASTER的配置

 [root@linux-node1 ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc         # 可选配置,收件人地址,定义服务故障报警的Email地址,当服务发生主备切换或RS节点有故障时,发送报警邮件。
   }
   notification_email_from Alexandre.Cassen@firewall.loc    # 可选配置,发件人地址。
   smtp_server 192.168.200.1      # 定义SMTP服务器
   smtp_connect_timeout 30
   router_id proxy_01             # 是路由标识,在一个局域网里面应该是唯一的
   vrrp_mcast_group4 224.0.0.19
}

vrrp_script chk_nginx_proxy
{
   script "/home/scripts/chk_nginx_proxy.sh"      #定时执行脚本
   interval 2                     # 健康检查周期
   weight 2
}

vrrp_instance VI_1 {              # 定义一个为VI_1的实例(可以定义多个),备节点也要有相同的实例。
    state MASTER                  # 当前实例角色状态 
    interface eth0                # 选择绑定的网络通信接口
    virtual_router_id 77          # 虚拟路由ID标识,最好是数字,MASTER和BACKUP配置相同实例时此ID必须一致
    priority 150                  # 优先级,数字越大优先级越高,MASTER要高于BACKUP,数值最好相差50以上
    advert_int 1                  # 同步通知间隔,M端和B端通信检查时间间隔,单位为秒。
    authentication {              # 权限认证配置
        auth_type PASS            # 建议为PASS方式还有AH方式
        auth_pass 6666            # 密码建议为4位数字
    }
    virtual_ipaddress {
        192.168.7.80              # 虚拟IP,可绑定多个地址,每个地址独占一行。
    }
    track_script {
        chk_nginx_proxy           # 追踪脚本
    }
}

3.3 检查脚本配置,如果检查nginx服务异常,则停止keepalived服务

 [root@linux-node1 ~]# chmod +x /home/scripts/chk_nginx_proxy.sh 
 [root@linux-node1 ~]# cat /home/scripts/chk_nginx_proxy.sh 
#!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" -eq 0 ]; then
    killall keepalived
fi

3.4 BACKUP的配置

[root@linux-node2 ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id proxy_02              
   vrrp_mcast_group4 224.0.0.19
}

vrrp_script chk_nginx_proxy {
   script "/home/scripts/chk_nginx_proxy.sh"
   interval 2
   weight 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 77
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 6666
    }
    virtual_ipaddress {
        192.168.7.80/24
    }
}

四、双VIP设置非抢占模式

HA的实际运行过程中,当主机发生异常,且后期恢复正常后,存在抢占或非抢占两种情况。

1、两个节点的state都必须配置为BACKUP
2、两个节点都必须加上配置 nopreempt

主机A:

ifconfig 
em1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.20.0.2  netmask 255.255.255.0  broadcast 172.90.0.255
        inet6 fe80::c3d5:a218:b476:241b  prefixlen 64  scopeid 0x20<link>
        ether 2c:ea:7f:db:d7:0e  txqueuelen 1000  (Ethernet)
        RX packets 264790  bytes 356810098 (340.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 82658  bytes 6560218 (6.2 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 17  

em2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.30.0.2  netmask 255.255.255.0  broadcast 192.30.0.255
        inet6 fe80::c80e:4479:eb52:7f78  prefixlen 64  scopeid 0x20<link>
        ether 2c:ea:7f:db:d7:0f  txqueuelen 1000  (Ethernet)
        RX packets 560  bytes 36174 (35.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 100  bytes 6650 (6.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 18

cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived     #全局定义
  
global_defs {
router_id master-node     
}
vrrp_sync_group VGM {
   group {
       VI_HA_1
       VI_HA_2
   }

}
  
vrrp_instance VI_HA_1 {    
    state BACKUP
    nopreempt
    interface em1
    lvs_sync_daemon_interface em1
    virtual_router_id 51
    priority 150
    advert_int 1                 
    authentication {            
        auth_type PASS           
        auth_pass 2020
    }
    track_interface {
        em1
        em2
    }
    virtual_ipaddress {          
        172.90.0.100/24 dev em1
        172.90.0.100/24 dev em2
    }

}

主机B:

# ifconfig 
em1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.20.0.3  netmask 255.255.255.0  broadcast 192.20.0.255
        inet6 fe80::aeec:5ff:8cc4:c5a6  prefixlen 64  scopeid 0x20<link>
        ether 2c:ea:7f:db:d5:96  txqueuelen 1000  (Ethernet)
        RX packets 269648  bytes 366067461 (349.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 87836  bytes 7639678 (7.2 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 17  

em2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.30.0.3  netmask 255.255.255.0  broadcast 192.30.0.255
        inet6 fe80::c3d4:30ea:bf53:f766  prefixlen 64  scopeid 0x20<link>
        ether 2c:ea:7f:db:d5:97  txqueuelen 1000  (Ethernet)
        RX packets 87  bytes 5644 (5.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 601  bytes 38858 (37.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 18 
#cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived     #全局定义
  
global_defs {
router_id backup-node     
}
vrrp_sync_group VGM {
   group {
       VI_HA_1
       VI_HA_2
   }

}
  
vrrp_instance VI_HA_1 {    
    state BACKUP
    nopreempt
    interface em2
    lvs_sync_daemon_interface em1
    virtual_router_id 51
    priority 100
    advert_int 1                 
    authentication {            
        auth_type PASS           
        auth_pass 2020
    }
    track_interface {
        em1
        em2
    }
    virtual_ipaddress {          
        192.20.0.100/24 dev em1
        192.30.0.100/24 dev em2
    }

}
原文地址:https://www.cnblogs.com/cyleon/p/10338822.html