keepalived知识梳理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了keepalived知识梳理相关的知识,希望对你有一定的参考价值。

文章大纲


  • 前言

  • VRRP介绍

  • Keepalived详解

 

前言


Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以利用其来避免单点故障。我们都知道,在一个LVS集群中,虽然LVS能够对客户端的请求基于IP进行调度,但是LVS自身并不能提供高可靠性,即不能进行容错。并且LVS只能将客户端的服务基于某种调度算法调度至后端服务器进行处理,却不能检查后端服务器的状态,所以我们需要一个工具能够实现这些功能,而keepalived刚好能够提供这些功能,在keepalived与LVS配合组成高可用集群中(HAC),至少需要2台服务器运行Keepalived,一台为主服务器(MASTER),一台为备份服务器(BACKUP),但是对外表现为一个虚拟IP(即LVS中的VIP),主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候, 备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。Keepalived是VRRP的完美实现,因此在介绍keepalived之前,先介绍一下VRRP的原理。

 

VRRP介绍


1 VRRP概念

VRRP是英文”Virtual Router Redundancy Protocol”的缩写,即虚拟路由冗余协议,他是一种容错协议,它保证当主机的下一跳路由器出现故障时,由另一台路由器来代替出现故障的路由器进行工作,从而保持网络通信的连续性和可靠性。VRRP具有如下优点:

简化网络管理。在具有多播或广播能力的局域网(如以太网)中,借助VRRP 能在某台设备出现故障时仍然提供高可靠的缺省链路,有效避免单一链路发生故障后网络中断的问题,而无需修改动态路由协议、路由发现协议等配置信息,也无需修改主机的默认网关配置。

适应性强VRRP 报文封装在 IP 报文中,支持各种上层协议。

网络开销小VRRP 只定义了一种报文——VRRP 通告报文,并且只有处于Master 状态的路由器可以发送 VRRP 报文。

2 VRRP工作过程

1) 虚拟路由器中的路由器根据优先级选举出 Master。Master 路由器通过发送免费 ARP 报文,将自己的虚拟 MAC 地址通知给与它连接的设备或者主机,从而承担报文转发任务;

2) Master 路由器周期性发送 VRRP 报文,以公布其配置信息(优先级等)和工作状况;

3) 如果 Master 路由器出现故障,虚拟路由器中的 Backup 路由器将根据优先级重新选举新的 Master;

4) 虚拟路由器状态切换时,Master 路由器由一台设备切换为另外一台设备,新的 Master路由器只是简单地发送一个携带虚拟路由器的 MAC 地址和虚拟 IP地址信息的免费 ARP报文,这样就可以更新与它连接的主机或设备中的ARP 相关信息。网络中的主机感知不到Master 路由器已经切换为另外一台设备。

5) Backup 路由器的优先级高于 Master 路由器时,由 Backup 路由器的工作方式(抢占方式和非抢占方式)决定是否重新选举 Master。

终上所述,为了保证Master路由器和Backup路由器能够协调工作,VRRP需要实现以下功能:

Master 路由器的选举;

Master 路由器状态的通告;

同时,为了提高安全性,VRRP 还提供了认证功能;

3 MSTER选举方式

VRRP根据优先级来确定虚拟路由器中每台路由器的角色(Master路由器或Backup路由器)。优先级越高,则越有可能成为Master路由器。初始创建的路由器工作在Backup状态,通过VRRP报文的交互获知虚拟路由器中其他成员的优先级:

       如果 VRRP 报文中 Master 路由器的优先级高于自己的优先级,则路由器保持在 Backup 状态;

如果 VRRP 报文中 Master 路由器的优先级低于自己的优先级,采用抢占工作方式的路由器将抢占成为 Master 状态,周期性地发送 VRRP 报文,采用非抢占工作方式的路由器仍保持 Backup 状态;

如果在一定时间内没有收到 VRRP 报文,则路由器切换为 Master

VRRP优先级的取值范围为0到255(数值越大表明优先级越高),可配置的范围是1到254,优先级0为系统保留给路由器放弃Master位置时候使用,255则是系统保留给IP地址拥有者使用。当路由器为IP地址拥有者时,其优先级始终为255。因此,当虚拟路由器内存在IP地址拥有者时,只要其工作正常,则为Master路由器。

4 VRRP的三种认证方式

无认证:不进行任何 VRRP 报文的合法性认证,不提供安全性保障。

简单字符认证:在一个有可能受到安全威胁的网络中,可以将认证方式设置为简单字符认证。发送 VRRP 报文的路由器将认证字填入到 VRRP 报文中,而收到 VRRP 报文的路由器会将收到的 VRRP 报文中的认证字和本地配置的认证字进行比较。如果认证字相同,则认为接收到的报文是合法的 VRRP 报文;否则认为接收到的报文是一个非法报文。

MD5 认证:在一个非常不安全的网络中,可以将认证方式设置为 MD5 认证。发送 VRRP 报文的路由器利用认证字和 MD5 算法对 VRRP 报文进行加密,加密后的报文保存在 Authentication Header(认证头)中。收到 VRRP报文的路由器会利用认证字解密报文,检查该报文的合法性。

 

Keepalived


1 keepalived工作原理

Keepalived是基于vrrp的原理开发的可实现高可用的服务软件,并且就有health-check功能,可以使用它提供双机浮动的vip(vrrp虚拟路由功能),这样可以简单实现一个双机热备高可用功能;keepalived在VRRP虚拟路由冗余协议为基础实现高可用,也可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到VRRP包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。下面是官方给出的KeepAlived组件图

 

技术分享


由上图可以看出,keepalived也是模块化设计,不同模块实现不同的功能,它主要有三个模块,分别是core、check和VRRP,其中:

  • core模块:为keepalived的核心组件,负责主进程的启动、维护以及全局配置文件的加载和解析;

  • check模块:负责健康检查,包括常见的各种检查方式;

  • VRRP模块:是来实现VRRP协议的。

  • system call:系统调用

  • watch dog:监控check和vrrp进程的管理进程,他是用来对check和vrrp进程实现高可用的。

  • checkers:负责检测器子进程的健康状态,当其检测到master上的服务不可用时则通告vrrp将其转移至backup服务器上。

2 keepalived作用

Keepalived主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现。Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。

3 keepalived配置文件

Keepalived是一个相对轻量级的服务,而且与LVS配合的非常好,它只有一个配置文件,主要包括global_defs、static_ipaddress、static_routes、VRRP_script、VRRP_instance和virtual_server的设置,而这个这些配置又可分为三大类:全局配置,VRRP的配置以及LVS配置。

1)全局配置

global_defs {                    # Block id
    notification_email {         
        [email protected]             # 指明接收keepalived信息的邮箱
    ...
    }
    notification_email_from [email protected]              # 邮箱名
    smtp_server 127.0.0.1            # 收邮件的主机地址
    smtp_connect_timeout 30          # integer, seconds
    router_id my_hostname            # 一个标记该主机的字符串,可以不是主机名,建议使用主机名
    vrrp_mcast_group4 224.0.0.18     # 多播组地址, 默认是 224.0.0.18
    vrrp_mcast_group6 ff02::12       # ipv6多播组地址, 默认是 ff02::12
    enable_traps                     # 启用SNMP陷阱,可以不启用
}

2)VRRP配置

    VRRPD配置包括三个类:VRRP同步组(synchroization group)、VRRP实例(VRRP Instance)、VRRP脚本

******VRRP instance(s)*******
    # describes  the moveable IP for each instance of a group in vrrp_sync_group.  Here are described two IPs 
    # (on inside_network and on outside_network), on machine "my_hostname", which belong to the group VG_1 and which 
    # will  transition  together  on any state change.

    vrrp_instance inside_network {
        state MASTER                             # 
        interface eth0                            # 
        use_vmac <VMAC_INTERFACE> # Use VRRP Virtual MAC.        # 
        vmac_xmit_base                             # VMAC interface
        dont_track_primary                        # 

        track_interface {
            eth0
            eth1
            ...
        }

        mcast_src_ip <IPADDR>                     # 多播组源ip
        unicast_src_ip <IPADDR>
        unicast_peer {
            <IPADDR>
            ...
        }
        lvs_sync_daemon_interface eth1
        garp_master_delay 10                     # secs, default 5
        virtual_router_id 51
        priority 100                             # 优先级
        advert_int 1

        authentication {                         # 认证信息模块
            auth_type PASS                         
            auth_pass 1234                         # 认证密码,建议使用"openssl rand -hex 4"生成8位随机密码
        }

        virtual_ipaddress {                     # vrrp实例
                <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>         # 地址定义格式
                172.18.14.77/24 dev eth1                     # 地址+interface
                172.18.14.66/24 dev eth2 label eth2:1     
                172.18.14.55/24                             # 也可以直接写地址即可
            }

           virtual_ipaddress_excluded {
            <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE>
            <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE>
               ...
           }

           virtual_routes {         # 虚拟网关,在配置中可不定义
                src 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1
                192.168.110.0/24 via 192.168.200.254 dev eth1
                192.168.111.0/24 dev eth2
                192.168.112.0/24  via  192.168.100.254  or 192.168.113.0/24  via  192.168.200.254  or  192.168.100.254  dev eth1
                blackhole 192.168.114.0/24
            }

            nopreempt
            nopreempt
            preempt_delay 300    # waits 5 minutes
            debug                  # Debug level, not implemented yet.

            # notify scripts, alert as above

            notify_master <STRING>|<QUOTED-STRING>
            notify_backup <STRING>|<QUOTED-STRING>
            notify_fault <STRING>|<QUOTED-STRING>
            notify <STRING>|<QUOTED-STRING>
            smtp_alert
    }

3)LVS配置

    如果你没有配置LVS+keepalived,那么无需配置这段区域,如果你用的是nginx来代替LVS,这无需配置这项,这里的LVS配置是专门为keepalived+LVS集成准备的。它是用keepalived的配置文件来代替ipvsadm来配置LVS,并不是利用ipvsadm来配置,这样会方便很多,一个配置文件搞定这些,维护也方便。这里LVS配置也有两个配置:一个是集群的定义,即VIP指定;二是添加真实服务器地址

************Virtual server(s)***********

fwmark <INT>     #防火墙标记,如果你是基于防火墙标记的LVS需要设置这一项
    
virtual_server group string {              # 配置虚拟服务器,可以是virtual_server IP port | virtual_server fwmark int 
    delay_loop <INT>                       # delay timer for service polling
    lb_algo rr|wrr|lc|wlc|lblc|sh|dh     # LVS scheduler
    ops                                 # Enable One-Packet-Scheduling for UDP (-O in ipvsadm)
    lb_kind NAT|DR|TUN                   # LVS forwarding method
    persistence_timeout <INT>            # LVS persistence timeout, sec
    persistence_granularity <NETMASK>   # LVS granularity mask (-M in ipvsadm)
    protocol TCP                           # Only TCP is implemented
    ha_suspend                          # If VS IP address is not set,suspend healthchecker‘s activity
    virtualhost <STRING>                 # VirtualHost string for HTTP_GET or SSL_GET,eg virtualhost www.firewall.loc

    alpha
    omega
    quorum <INT>
    hysteresis <INT>
    quorum_up <STRING>|<QUOTED-STRING>
    quorum_down <STRING>|<QUOTED-STRING>
    
    sorry_server <IPADDR> <PORT>                 # RS to add when all realservers are down


    real_server <IPADDR> <PORT> {
        weight <INT>                             # relative weight to use, default: 1
        notify_up <STRING>|<QUOTED-STRING>
        notify_down <STRING>|<QUOTED-STRING>
        
        HTTP_GET|SSL_GET {                         # 如果是http则选择HTTP_GET,https时选择SSL_GET
            url {                                 # 做做健康性检查时访问的url,可以定多个url
                
                digest <STRING>                    # A url to test can have multiple entries here
                status_code <INT>                  # status code returned in the HTTP headereg status_code 200
             }

            delay_before_retry <INT>             # 失败后判断为宕机的延时
            connect_ip <IP ADDRESS>                # 连接IP地址
            connect_port <PORT>                    # 连接端口
            bindto <IP ADDRESS>
            bind_port <PORT>
            connect_timeout <INTEGER>             # 连接超时时间
            fwmark <INTEGER>
            warmup <INT>
        } 

        TCP_CHECK {                             # 基于TCP_CHECK的健康性检测模块定义
            connect_ip <IP ADDRESS>
            connect_port <PORT>
            bindto <IP ADDRESS>
            bind_port <PORT>
            connect_timeout <INTEGER>
            fwmark <INTEGER>
            warmup <INT>
        }

        SMTP_CHECK {                             # 基于邮件服务的健康性检查模块

                host {
                    connect_ip <IP ADDRESS>
                    connect_port <PORT>
                    bindto <IP ADDRESS>
                    bind_port <PORT>
                    connect_timeout <INTEGER>
                    fwmark <INTEGER>
                }

                retry <INTEGER>
                delay_before_retry <INTEGER>
                helo_name <STRING>|<QUOTED-STRING>
                warmup <INT>
            } 


        MISC_CHECK {             
            misc_path <STRING>|<QUOTED-STRING>
            misc_timeout <INT>
            warmup <INT>
            misc_dynamic
        }
        
    }
}


本章小结


上面分析几乎所有keepalived.conf的配置信息,有些地方我直接援引的官方说明,而没有翻译,我感觉英文说的更为准确。当然还有一些选项没有做详细的说明,我会在随后的文章中加以说明,接下来的文章会从实例出发,从实际案例中领悟这些指令的含义,当然了,在实际生产中并不是所有的指令都会使用,我们会选取最主要的进行定义,那时在看就会想得很轻松。




本文出自 “vinsent” 博客,请务必保留此出处http://vinsent.blog.51cto.com/13116656/1977635

以上是关于keepalived知识梳理的主要内容,如果未能解决你的问题,请参考以下文章

Haproxy+Keepalived高可用环境部署梳理(主主和主从模式)

Haproxy+Keepalived高可用环境部署梳理(主主和主从模式)

Javascript知识点梳理

android小知识点代码片段

常用python日期日志获取内容循环的代码片段

keepalived基础知识及扩展讲解