Keepalived详解

Keepalived介绍
Keepalived是Linux下一个轻量级的高可用解决方案,它与Hearbeat实现的功能类似,都可以实现服务或者网络的高可用,但是又有差别,Hearbeat是一个专业的,功能完善的高可用软件,它提供HA软件所需的基本功能,如心跳检测和资源接管,检测集群中的服务系统,在集群节点之间转移共享IP地址的所有者,功能强大,部署比较麻烦;Keepalived主要通过虚拟路由冗余来实现高可用功能,虽然功能没有Hearbeat强大,但是部署比较简单,且使用非常简单,只需一个配置文件即可完成。
Keepalived起初是为了LVS设计的,专门用来监控集群系统中各个服务节点的状态。它根据TCP/IP参考模型的第三,第四,和第五层交换机制检测每个服务节点的状态,如果某个服务出现异常,或者工作出现故障,Keepalived将检测到,并将出现故障的服务节点从集群系统重剔除,而在故障节点恢复正常后,有可以自动将此服务节点重新加入服务集群中,这些工作全部自动完成,不需要人工干涉,只需人工完成只是修复出现故障的服务节点。后来Keepalived加入VRRP功能,解决单点故障问题,实现网络不间断稳定运行。

VRRP协议和工作原理
VRRP(虚拟路由冗余协议)是一种主备模式的协议,可以在网络发生故障时透明的进行设备切换而不影响主机间的数据通信。
VRRP可以将两台或者多台物理路由器设备虚拟成一台虚拟路由器,这个虚拟路由器通过虚拟IP向外提供服务,而在虚拟路由器的内部是对个路由器协同工作,同一时间只有一个物理路由器对外提供服务,这台路由器别称为主路由器。主路由器有算法产生,它对外提供虚拟IP,ARP请求,ICMP,数据转发等功能。而备份路由器不对外提供网络功能,仅仅接受来自MASTER的VRRP状态通告信息。

VRRP的工作过程如下:
1. 路由器开启VRRP功能后,会根据优先级确定自己在备份组中的角色。优先级高的路由器成为主用路由器,优先级低的成为备用路由器。主用路由器定期发送VRRP通告报文,通知备份组内的其他路由器自己工作正常;备用路由器则启动定时器等待通告报文的到来。
2. VRRP在不同的主用抢占方式下,主用角色的替换方式不同:
l在抢占方式下,当主用路由器收到VRRP通告报文后,会将自己的优先级与通告报文中的优先级进行比较。如果大于通告报文中的优先级,则成为主用路由器;否则将保持备用状态。
l在非抢占方式下,只要主用路由器没有出现故障,备份组中的路由器始终保持主用或备用状态,备份组中的路由器即使随后被配置了更高的优先级也不会成为主用路由器。
3. 如果备用路由器的定时器超时后仍未收到主用路由器发送来的VRRP通告报文,则认为主用路由器已经无法正常工作,此时备用路由器会认为自己是主用路由器,并对外发送VRRP通告报文。备份组内的路由器根据优先级选举出主用路由器,承担报文的转发功能。

Keepalived工作原理
Keepalived工作在TCP/IP协议的第三,第四,第五层上,即网络层,传输层和应用层。
网络层:运行IP,ICMP,ARP,RARP协议,其中常采用ICMP协议向服务器集群中的每个节点发送一个ICMP的数据包,如果某个节点没有返回响应数据包,则认为此节点发生故障。
传输层:Keepalived利用TCP协议在端口连接和扫描技术来判断集群节点是否正常。
应用层:可以运行FTP,TELNET,SMTP等协议。

Keepalived的体系结构

keepalived reids 高可用 keepalived实现高可用_优先级


从上图看出,Keepalived分为用户空间和内核空间。

> 内核空间包括IPVS和NETLINK两个模块,IPVS模块是Keepalived的一个第三方模块,NETLINK模块主要用于实现一些高级路由框架和一些相关的网络功能,完成用户空间层Netlink Reflector模块发过来的各种请求。
> 用户空间分别有Scheduler-I/O Multiplexer,Memory Manager,Control Plane和Core component组成:
 1. Scheduler-I/O Multiplexer:I/O复用分发调度器,负责安排Keepalived所有内部的任务请求。
 2. Memory Manager:内存管理机制,提供访问内存的一些通用方法。
 3. Control Plane:是Keepalived的控制面板,可以实现对配置文件进行解析和编译。
 4. Core component是Keepalived的核心组件,包括Watchlog,Checkers,VRRP Stack,IPVS wrapper和Netlink Reflector。
    (1).Watchlog:是计算机领域中一个极为简单又非常有效的检测工具,它的工作原理是针对被监视的目标设置一个计数器和一个值,Watchlog会自己增加此计数器,然后等于被监视的目标周期性地重置计数值。一旦被监控目标发生错误,就无法重置此计数值,Watchlog就会检测到,于是采取对应的恢复措施。
    (2).Checkers:实现对服务器运行状态检测和故障隔离
    (3).IPVS wrapper:将设置好的IPVS规则发送到内核空间交给IPVS模块,最终实现IPVS模块的负载均衡功能。
    (4).Netlink Reflector:实现高可用集群中Failover时虚拟IP的设置和切换。这个模块上的请求最后都发送到内核空间层的NETLINK模块来完成。

Keepalived的部署

安装keeplived

  1. yum源安装
    [root@Clone4 ~]# yum install keepalived
  2. 编译安装
下载:
[root@Clone4 ~]# wget http://www.keepalived.org/software/keepalived-1.3.5.tar.gz
安装:
[root@Clone4 ~]# tar -xzf keepalived-1.3.5.tar.gz
[root@Clone4 ~]# cd keepalived
[root@Clone4 ~]# ./configure
[root@Clone4 ~]# make && make install

Keepalived配置文件详解

Keepalived分为三部分,分别为:global_defs(全局配置),vrrp_instance(VRRP配置),virtual_server(LVS配置)

**全局配置:**
    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 LVS_DEVEL             //运行服务的标识
    }

**VRRPD配置:**
    vrrp_instance VI_1 {
        state MASTER             //设置服务器为主服务器还是从服务器
        interface eth0          
        virtual_router_id 51     //虚拟路由ID
        priority 100             //定义节点优先级
        advert_int 1             //MASTER和BACKUP之间同步检查的时间间隔

        authentication {         //设置节点间通信验证类型和密码
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {        //虚拟IP设置
            192.168.200.12
        }
        nopreempt         //采用不抢占,主节点恢复不从备用节点上切换回来
        preemtp_delay 300      //抢占时间延时
        notify_backup  "/path/a.sh"  //状态转化时执行脚本,可以用在vrrp_interface和vrrp_synv_group中
        notify_master  "/path/b.sh"  //keepalived进入BACKUP状态时要执行的脚本
        notify_falut   "/path/c.sh"     //进入FAULT状态时要执行的脚本
        track_script{           //追踪运行的脚本
        script_name
        }
    }
    vrrp_script script_name{      //定义脚本
        script “jiaoben”
        interval 1           //检测几次
        weigth -2            //如果失败weigth-2
        fall 2           //失败检测几次
    }
    定义同步组:
    vrrp_sync_group G1{
        group {
            VI_1
            VI_2
        }
    }

**LVS配置**
    virtual_server 192.168.200.100 443 {  //192.168.200.100为虚拟IP 
        delay_loop 6         //健康监测时间
        lb_algo rr           //LVS调度算法
        lb_kind NAT          //LVS的模型
        nat_mask 255.255.255.0      
        persistence_timeout 50     //会话保持时间,最大无响应保持时间
        protocol TCP
        sorry_server IP PORT      //备用节点,在所有RS失效后,这个节点启用

        real_server 192.168.201.100 443 {    //RS服务器配置
            weight 1              //RS的权重
            SSL_GET | HTTP_GET {       //
                url {                //用于指定HTTP/SSL检查的URL信息
                  path /
                  digest ff20ad2481f97b1754ef3e12ecd3a9cc        //ssl检查后的信息摘要
                }
                url {
                  path /mrtg/
                  digest 9b3a0c85a887a256d6939da88aabd8cd
                }
                connect_timeout 3
                nb_get_retry 3       //重复次数
                delay_before_retry 3     //多长时间间隔之后再次从试
            }
            tcp检测:
        TCP_CHECK{
            connect_port       //检查端口
            connect_timeout    //无响应超时时间
            nb_get_retry       //重复几次
            delay_before_retry   //表示重试间隔
            }           
        }

MATSER和BACKUP的权值计算

若vrrp_script中存在权值weight参数时:
    权值=weight+priority
若不存在时:
    权值=priority
若weight>0时:
    成功:权值=weight+priority
    失败:权值=priority
    MASTER检测失败:priority(主)<weight+priority(备)  发生切换
    MASTER检测成功:weight+priority(主)>weight+priority(备)    不发生切换
若weight<0时:
    成功:权值=priority
    失败:权值=priority-weight
    MASTER检测成功:priority(主)>priority(备)   不发生
    MASTER检测失败:priority-weight(主)<priority(备)  发生

Keepalived的实例演示

实现HTTPD的高可用

  1. 部署环境说明:
    Clone1 192.168.80.129 BUCKUP HTTPD
    Clone4 192.168.80.132 MASTER HTTPD
    VIP:192.168.80.150
  2. Keepalived的配置文件
  3. 启动
    (1).先启动BACKUP服务器

    (2).在启动MATSER服务器