本文下载

keepalived快速入门(已排好版)

参考文档

Keepalived详细介绍简介

Linux高可用之Keepalived

Keepalived基础知识

Keepalived configuration synopsis

 

keeplived是什么

KeepalivedLinux下一个轻量级别的高可用解决方案。高可用(High Avalilability,HA),其实两种不同的含义:广义来讲,是指整个系统的高可用性,狭义的来讲就是指主机的冗余和接管。

    Keepalived主要是通过虚拟路由冗余来实现高可用功能,且部署和使用非常的简单,所有配置只需要一个配置文件即可以完成。

    Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。

后来Keepalived又加入了VRRP的功能,VRRPVritrual Router Redundancy Protocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied 一方面具有服务器状态检测和故障隔离功能,另外一方面也有HA cluster功能,下面介绍一下VRRP协议实现的过程。

keeplived工作原理

VRRP协议与工作原理

为什么要引入VRRP协议

LAN客户端判定哪个路由器应该为其到达目标主机的下一跳网关的方式有动态及静态决策两种方式,其中,常见的动态路由发现方式有如下几种:

1Proxy ARP —— 客户端使用ARP协议获取其想要到达的目标,而后,由某路由以其MAC地址响应此ARP请求;

2Routing Protocol —— 客户端监听动态路由更新(如通过RIPOSPF协议)并以之重建自己的路由表;

3ICMP IRDP (Router Discovery Protocol) 客户端 —— 客户端主机运行一个ICMP路由发现客户端程序;

动态路由发现协议的不足之处在于它会导致在客户端引起一定的配置和处理方面的开销,并且,如果路由器故障,切换至其它路由器的过程会比较慢。解决此类问题的一个方案是为客户端静态配置默认路由设备,这大大简化了客户端的处理过程,但也会带来单点故障类的问题。默认网关故障时,LAN客户端仅能实现本地通信。因此为了解决这个问题,就引入了VRRP协议。

工作模式

VRRP是一种主备模式的协议,通过VRRP可以在网络发生故障时透明的进行设备切换而不影响主机之间的数据通信,这其中涉及到两个概念:物理路由器和虚拟路由器。

spacer.gif

VRRP可以将两台或者多台物理路由器设备虚拟成一个虚拟路由,这个虚拟路由器通过虚拟IP(一个或者多个)对外提供服务,而在虚拟路由器内部的多个物理路由器协同工作,同一时间只有一台物理路由器对外提供服务,这台物理路由设备被成为:主路由器(Master角色)

一般情况下Master是由选举算法产生,它拥有对外服务的虚拟IP,提供各种网络功能,如:ARP请求,ICMP 数据转发等。而其它的物理路由器不拥有对外的虚拟IP,也不提供对外网络功能,仅仅接收MASTERVRRP状态通告信息,这些路由器被统称为“BACKUP的角色”。

当主路由器失败时,处于BACKUP角色的备份路由器将重新进行选举,产生一个新的主路由器进入MASTER角色,继续提供对外服务,整个切换对用户来说是完全透明的。

VRID

每个虚拟路由器都有一个唯一的标识号,称为VRID,一个VRID与一组IP地址构成一个虚拟路由器,在VRRP协议中,所有的报文都是通过IP多播方式发送的,而在一个虚拟路由器中,只有处于Master角色的路由器会一直发送VRRP数据包,处于BACKUP角色的路由器只会接受Master角色发送过来的报文信息,用来监控Master运行状态。

一般不会发生BACKUP抢占的情况,除非它的优先级更高,而当MASTER不可用时,BACKUP也就无法收到Master发过来的信息,于是就认定Master出现故障,接着多台BAKCUP就会进行选举,优先级最高的BACKUP将称为新的MASTER,这种选举角色切换非常之快,因而保证了服务的持续可用性。

 

Keeplived的工作原理

Keepalived可通过VRRP实现高可用性,而Keepalived作为一个高性能集群软件,它还能实现对集群中服务器运行状态的监控以及故障隔离,下面我们介绍一下Keepalived对服务器运行状态和故障隔离的工作原理。

Keepalived工作在TCP/IP 参考模型的三层、四层、五层,也就是分别为:网络层

传输层和应用层,根据TCPIP参数模型隔层所能实现的功能,Keepalived运行机制如下。

网络层

    在网络层:我们知道运行这4个重要的协议,互联网络IP协议互联网络可控制报文协议ICMP地址转换协议ARP反向地址转换协议RARP

Keepalived在网络层采用最常见的工作方式是通过ICMP协议向服务器集群中的每一个节点发送一个ICMP数据包(有点类似与Ping的功能),如果某个节点没有返回响应数据包,那么认为该节点发生了故障,Keepalived将报告这个节点失效,并从服务器集群中剔除故障节点。

传输层

    在传输层:提供了两个主要的协议:传输控制协议TCP用户数据协议UDP,传输控制协议TCP可以提供可靠的数据输出服务、IP地址和端口,代表TCP的一个连接端,要获得TCP服务,需要在发送机的一个端口和接收机的一个端口上建立连接。

 Keepalived在传输层里利用了TCP协议的端口连接和扫描技术来判断集群节点的端口是否正常,比如对于常见的WEB服务器80端口。或者SSH服务22端口,Keepalived一旦在传输层探测到这些端口号没有数据响应和数据返回,就认为这些端口发生异常,然后强制将这些端口所对应的节点从服务器集群中剔除掉。

应用层

    在应用层:可以运行FTPTELNETSMTPDNS等各种不同类型的高层协议,Keepalived的运行方式也更加全面化和复杂化。

用户可以自定义Keepalived工作方式,例如:可以通过编写程序或者脚本来运行Keepalived,而Keepalived将根据用户的设定参数检测各种程序或者服务是否允许正常,如果Keepalived的检测结果和用户设定的不一致时,Keepalived将把对应的服务器从服务器集群中剔除

keeplived的体系架构

spacer.gif

Keepalived起初是为LVS设计的,由于Keeplalived可以实现对集群节点的状态检测,而IPVS可以实现负载均衡功能,因此,Keepalived借助于第三方模块IPVS就可以很方便地搭建一套负载均衡系统,在这里有个误区,由于Keepalived可以和IPVS一起很好的工作,会误以为Keepalived就是一个负载均衡软件,这种理解是错误的。

Keepalived当中IPVS模块是可配置的,如果需要负载均衡功能,可以在编译Keepalived时开打负载均衡功能,也可以通过编译参数关闭。

由图中我们可以看到keeplived的体系架构分为了内核层和用户空间层。

内核层

IPVS

LVSIP负载均衡技术就是通过IPVS模块来实现的。

它的主要作用是:安装在Director Server上,同时在Director Server上虚拟出一个IP地址,用户必须通过这个虚拟的IP地址访问服务。这个虚拟IP一般称为LVSVIP,即Virtual IP。访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务节点响应用户的请求

NETLINK

    NETLINK模块主要用于实现一些高级路由框架和一些相关参数的网络功能,完成用户空间层Netlink Reflector模块发来的各种网络请求。

   

用户空间层

Scheduler I/O Multiplexer

是一个I/O复用分发调度器,它负载安排Keepalived所有内部的任务请求,

 

Memory Mngt

是一个内存管理机制,这个框架提供了访问内存的一些通用方法      

 

Control Plane

keepalived的控制版面,可以实现对配置文件编译和解析

 

Core componets

Watchdog

是计算机可靠领域中极为简单又非常有效的检测工具,Keepalived正是通过它监控CheckersVRRP进程的。

Checkers

这是Keepalived最基础的功能,也是最主要的功能,可以实现对服务器运行状态检测和故障隔离。

VRRP Stack

这是keepalived后来引用的VRRP功能,可以实现HA集群中失败切换功能。

IPVS wrapper

这个是IPVS功能的一个实现,IPVS warrper模块将可以设置好的IPVS规则发送的内核空间并且提供给IPVS模块,最终实现IPVS模块的负载功能。

Netlink Reflector

用来实现高可用集群Failover时虚拟IP(VIP)的设置和切换,Netlink Reflector的所有请求最后都发送到内核空间层的NETLINK 模块来完成。

文件位置

主配置文件:/etc/keepalived/keepalived.conf

主程序文件:/usr/sbin/keepalived

提供校验码:/usr/bin/genhash

Unit Filekeepalived.service

Unit File的环境配置文件:/etc/sysconfig/keepalived

 

 

keeplived配置文件详解

keepalived.conf中有三类配置区域。

l  全局配置(Global Configuration)

l  VRRPD配置

l  LVS配置

全局配置

全局配置又包括两个子配置:

n  全局定义(global definition)

n  静态路由配置(static ipaddress/routes)

global

spacer.gif

static

spacer.gif

这里实际上和系统里面命令配置IP地址和路由一样例如:

192.168.1.1/24 dev eth0 scope global

就是给eth0配置IP地址,路由同理

一般这个区域不需要配置。这里实际上就是给服务器配置真实的IP地址和路由的,在复杂的环境下可能需要配置,一般不会用这个来配置,我们可以直接用vi /etc/sysconfig/network-script/ifcfg-eth0来配置,切记这里可不是VIP

VRRPD配置

VRRPD配置包括三个类

l  VRRP同步组(synchroization group)

l  VRRP实例(VRRP Instance)

l  VRRP脚本

VRRP同步组(synchroization group)

vrrp_sync_group VG_1 {              #定义一个故障组,组内有一个虚拟路由出现故障另一个也会一起跟着转移,适用于LVSNAT模型。

        group {

            VI1     # name of vrrp_instance (below)        

            VI2     # One for each moveable IP

 

             }

    }

VRRP实例(VRRP Instance)

vrrp_instance VI_1 {        #定义一个虚拟路由

    state MASTER|BACKUP     #当前节点在此虚拟路由器上的初始状态;只能有一个是MASTER,余下的都应该为BACKUP

    interface eth0          #绑定为当前虚拟路由器使用的物理接口;

    virtual_router_id 51    #当前虚拟路由器的惟一标识,范围是0-255

    priority 100            #当前主机在此虚拟路径器中的优先级;范围1-254

    advert_int 1            #通告发送间隔,包含主机优先级、心跳等。

    authentication {        #认证配置  

        auth_type PASS      #认证类型,PASS表示简单字符串认证。还有HA认证

        auth_pass 1111      #密码,PASS密码最长为8

    }

   virtual_ipaddress {

    192.168.200.16          #虚拟路由IP地址,以辅助地址方式设置

    192.168.200.18/24 dev eth2 label eth2:1 #以别名的方式设置

    }

 

track_interface {

        eth0

        eth1

 

}             #配置要监控的网络接口,一旦接口出现故障,则转为FAULT状态;

nopreempt                   #定义工作模式为非抢占模式;

preempt_delay 300        #抢占式模式下,节点上线后触发新选举操作的延迟时长;

   virtual_routes {     #配置路由信息,可选项

               # src [to] / via|gw [or ] dev scope

       tab

               src 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1

               192.168.112.0/24 via 192.168.100.254       192.168.113.0/24  via  192.168.200.254  or 192.168.100.254 dev eth1      blackhole 192.168.114.0/24

           }

 

 

    notify_master |       #当前节点成为主节点时触发的脚本。

    notify_backup |       #当前节点转为备节点时触发的脚本。

    notify_fault |        #当前节点转为“失败”状态时触发的脚本。

    notify |              #通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知。

    smtp_alert                                   #如果加入这个选项,将调用前面设置的邮件设置,并自动根据状态发送信息

}

VRRP脚本

vrrp_script check_running {

  script "/usr/local/bin/check_running"

  interval 10

  weight 10

}

 

vrrp_instance http {

  state BACKUP

  smtp_alert

  interface eth0

  virtual_router_id 101

  priority 90

  advert_int 3

  authentication {

  auth_type PASS

  auth_pass whatever

  }

  virtual_ipaddress {

  1.1.1.1

  }

  track_script {

  check_running weight 20

  }

}

首先在vrrp_script区域定义脚本名字和脚本执行的间隔和脚本执行的优先级变更

vrrp_script check_running {

script "/usr/local/bin/check_running"

interval 10     #脚本执行间隔

weight 10      #脚本结果导致的优先级变更:10表示优先级+10-10则表示优先级-10

}

然后在实例(vrrp_instance)里面引用,有点类似脚本里面的函数引用一样:先定义,后引用函数名

track_script {

     check_running weight 20

  }

注意:VRRP脚本(vrrp_script)VRRP实例(vrrp_instance)属于同一个级别

LVS配置

如果你没有配置LVS+keepalived那么无需配置这段区域,这里的LVS配置是专门为keepalived+LVS集成准备的。

注意,这里LVS配置并不是指真的安装LVS然后用ipvsadm来配置他,而是用keepalived的配置文件来代替ipvsadm来配置LVS,这样会方便很多。

LVS配置也有两个配置

n  虚拟主机组配置

n  虚拟主机配置

虚拟主机组配置

这个配置是可选的,可根据需求来配置,这里配置主要是为了让一台realserver上的某个服务可以属于多个Virtual Server,并且只做一次健康检查。

virtual_server_group {

# VIP port

fwmark

}

虚拟主机配置

virtual server可以以下面三种的任意一种来配置。这里主要介绍第一种

1. virtual server IP port

2. virtual server fwmark int

3. virtual server group string

 

 

virtual_server 192.168.200.100 443 {    #LVS配置段 ,设置LVSVIP地址和端口

    delay_loop                          #服务轮询的时间间隔;检测RS服务器的状态。

    lb_algo rr                          #调度算法,可选rr|wrr|lc|wlc|lblc|sh|dh

    lb_kind NAT                         #集群类型

    nat_mask 255.255.255.0              #子网掩码,可选项

    persistence_timeout 50              #是否启用持久连接,连接保存时长

    protocol TCP                        #协议,只支持TCP

    sorry_server         #备用服务器地址,可选项

 

    real_server 192.168.201.100 443 {   #配置RS服务器的地址和端口

        weight 1                        #权重

     SSL_GET {                      #检测RS服务器的状态,发送请求报文

            url {

              path /                    #请求的URL

              digest ff20ad2481f97b1754ef3e12ecd3a9cc  #对请求的页面进行hash运算,然后和这个hash码进行比对,如果hash码一样就表示状态正常

              status_code          #判断上述检测机制为健康状态的响应码,digest二选一即可

 

            }                           #这个hash码可以使用genhash命令请求这个页面生成

            connect_timeout 3           #连接超时时间

            nb_get_retry 3              #超时重试次数

            delay_before_retry 3        #每次超时过后多久再进行连接

            connect_ip      #向当前RS的哪个IP地址发起健康状态检测请求

            connect_port          #向当前RS的哪个PORT发起健康状态检测请求

            bindto          #发出健康状态检测请求时使用的源地址;

            bind_port             #发出健康状态检测请求时使用的源端口;

        }

    }

}

 

健康状态检查

1.   HTTP_GET

2.   SSL_GET

3.   TCP_CHECK

4.   SMTP_CHECK

5.   MISS_CHECK #调用自定义脚本进行检测

TCP_CHECK {        

connect_ip        #向当前RS的哪个IP地址发起健康状态检测请求;        

connect_port              #向当前RS的哪个PORT发起健康状态检测请求;         bindto              #发出健康状态检测请求时使用的源地址;         bind_port                 #发出健康状态检测请求时使用的源端口;         connect_timeout        #连接请求的超时时长; }

实例

CentOS7 haproxy+keepalived实现高可用集群搭建