Chinaunix首页 | 论坛 | 博客
  • 博客访问: 610973
  • 博文数量: 244
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 130
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-27 09:53
个人简介

记录学习,记录成长

文章分类

全部博文(244)

我的朋友

分类: LINUX

2015-12-01 15:29:36

一.keepalived介绍

1.keepalived是什么
keepalived起初是为LVS设计的专门用来监控集群系统中各个服务节点的状态如果某个服务节点出现异常或者工作出现故障,keepalived将检测到,并将出现故障的服务节点从集群系统中剔除,而在故障节点恢复正常后,keepalived又可以自动将该服务节点重新加入集群中,这些工作全部自动完成;

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

2.VRRP协议与工作原理
在现实的网络环境中,主机之间的通信都是通过配置静态路由(默认网关)完成的,而主机之间的路由器一旦出现故障,通信就会失败,因此,在这种通信模式中,路由器就成为了一个单点故障,就引入了VRRP协议;

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

VRRP可以讲两台或多台物理路由器虚拟成一个虚拟路由器,这个虚拟路由器通过虚拟IP对外提供服务,而在虚拟路由器内部是多个物理路由器协同工作,同一时间只有一台物理路由器对外提供服务,这台物理路由器被称为主路由器(处于MASTER角色);

一般情况下MASTER由选举算法产生,他拥有对外服务的虚拟IP,通过各种网络功能。而其他无路路由器不用有虚拟IP,也不提供网络服务,仅仅接收MASTER的VRRP状态通告信息,这些路由器统称为备份路由器(处于BACKUP角色)。当主路由器失效时,处于BACKUP角色的备份路由器将重新进行选举,产生一个新的路由器进入MASTER角色继续提供对外服务,整个过程对用户来说是完全透明的。

每个虚拟路由器都有一个唯一的标识,成为VRID,一个VRID与一组IP地址构成了一个虚拟路由器。在VRRP协议中,所有的报文都是通过IP多播形式发送的,而在一个虚拟路由器中,只有MASTER角色的路由器会一直发送VRRP数据包,BACKUP角色的路由器只接收MASTER发送过来的报文信息,用来监控MASTER运行状态,因此不会发生BACKUP抢占的现象,除非他的优先级更高。而当MASTER不可用时,BACKUP也就无法收到MASTER发送过来的报文信息,于是就认为MASTER出现故障,接着多台BACKUP就会进行选举,优先级最高的BACKUP将会成为新的MASTER;

3.keepalived工作原理
keepalived工作在TCP/IP参考模型的网络层,传输层和应用层,能实现对集群服务器运行状态的监控及故障隔离,其原理:
3.1在网络层,运行者4个重要的协议:IP协议,ICMP协议,ARP协议和RARP协议。keepalived在网络层采用的最常见的工作方式是通过ICMP协议向集群中的每个节点发送一个ICMP的数据包(类似于Ping),如果某个节点没有返回响应的数据包,那么就认为此节点发生了故障,keepalived将报告此节点失效,并从集群中剔除;

3.2在传输层,提供了两个主要的协议:传输控制协议TCP和用户数据协议UDP。TCP可以提供可靠的数据传输服务,IP地址和端口,代表TCP的一个连接端。要获得TCP服务,需要在发送机的一个端口上和接收机的一个端口上建立连接。而keepalived在传输层就是利用TCP协议的端口连接和扫描技术来判断集群节点是否正常的;

3.3在应用层,可以运行FTP,SMTP,DNS等各种不同类型的高层协议,keeoalived的运行方式也更加全面化和复杂化,用户可以通过自定义keeoalived的工作方式。例如,用户可以通过编写程序来运行keeoalived,而keeoalived将根据用户的设定检测各种程序或服务是否允许正常,如果keeoalived的检测结果域它会的设定不一致时,keeoalived将把对应的服务从服务器中移除;

4.keeoalived的体系结构

keeoalived的体系结构整体上分为两层,即用户空间层和内核空间层;

内核空间层包括IPVS和NETLINK两个模块:
IPVS模块是keeoalived引入的一个第三方模块,通过IPVS可以实现基于IP的负载均衡集群,而IPVS默认包含在LVS集群软件中,keeoalived最初就是为LVS提供服务的,由于keeoalived可以实现对集群节点的状态检测,而IPVS可以实现负载均衡功能,因此,keeoalived借助于第三方模块IPVS就可以很方便的搭建一套负载均衡集群,但是这不是说keepalived就是一个负载均衡软件;

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

在用户空间层,keepalived又分为四个部分:
        Scheduler I/O Multiplexer:一个I/O复用分发调度器,他负责安排keepalived所有内部的任务请求;

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

        Control Plane:keepalived的控制面板,可以实现对配置进行编译和解析(keepalived的配置文件不是一次解析所有模块的配         置,而是只有在用到某模块时才解析相应的配置)

        Core components:keepalived的核心组件,包含了一系列功能模块,主要有WatchDog,Checkers,VRRP stack,IPVS             wrapper和Netlink  Reflector;

模块实现功能介绍:
WatchDog:针对被监视的目标设置一个计数器和阀值,WatchDog会自己增加此计数值,然后等待被监视的目标周期性的重置该计数器。一旦被监控目标发生错误,就无法重置此计数器,WatchDog就会检测到,于是采取对应的恢复措施,例如重启或关闭;keepalived正是通过WatchDog的运行机制来监控Checkers和VRRP进程的;

Checkers:keepalived的最基础的功能,也是最主要的功能,可实现对服务器运行状态检测和故障隔离;

VRRPStack:可以实现HA集群中失效切换(Failover)功能,keepalived通过VRRP功能再结合LVS负载均衡软件即可部署一个高性能的负载均衡集群

IPVS wrapper:这是IPVS功能的一个实现。IPVS wrapper模块可以将设置好的IPVS规则发送到内核空间并提交给IPVS模块,最终实现IPVS模块的负载均衡功能;

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

二.安装即配置说明
1.安装
yum  install keepalived即可

2.配置文件/etc/keepalived/keeoalived.conf说明
keepalived的配置文件都是以块的形式组织的,每个块的内容包含在{}中,配置分为三类:全局配置,VRRPD配置和LVS配置

全局配置:对整个keepalived都生效的配置
global_defs {
     notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
其中:
notification_email:设置报警邮件地址即报警邮件接收者,可设置多个,每行一个;如果要开启邮件报警功能,需要开启本机的postfix或者sendmail服务;

notification_email_from:用于设置邮件的发送地址,即报警邮件发送者;

smtp_server:用于设置邮件的SMTP Server地址;

smtp_connect_timeout:设置连接SMTP Server的超时时间;

router_id:表示运行keepalived服务器的一个标识,是发邮件时显示在邮件主题中的信息;

3.VRRPD配置
这时keepalived的核心,主要用来实现keepalived的高可用功能。VRRPD配置又可分为VRRP同步组配置和VRRP实例配置
3.1 VRRP同步组
同步组是相对于多个VRRP实例而言的,在多个VRRP实例的环境中,每个VRRP实例所对应的网络环境会有所不同,假设一个实例处于网段A,另一个实例处于网段B,而如果VRRPD只配置了A网段的检测,那么当B网段主机出现故障时,VRRPD会认为自己仍处于正常状态,不会进行主备节点切换,这样问题就出现了。而同步组会将所有VRRP实例都加入同步组中,这样任何一个实例出现问题,都会导致keepalived进行主备切换;
如:两个同步组的配置样例
vrrp_sync_group G1 {
group {
    VI_1
    VI_2
    VI_5
   }
    notify_backup "/usr/local/bin/vrrp.bak arg1 arg2"
    notify_master "/usr/local/bin/vrrp.mast arg1 arg2"
    notify_fault "/usr/local/bin/vrrp.fault arg1 arg2"
    notify_stop "/usr/local/bin/vrrp.stop arg1 arg2"
  }
vrrp_sync_group G2 {
    group {
    VI_3
    VI_4
     }
  }
其中:
G1同步组包含VI_1,VI_2,VI_5三个VRRP实例,G2同步组包含VI_3,VI_4两个实例,这5个实例将在vrrp_instance段进行定义

keepalived配置中的一个通知机制,也是keepalived包含的四种状态:
notify_master:指定当keepalived进入MASTER状态时要执行的脚本,这个脚本可以是一个状态报警脚本,也可以是一个服务管理脚本,允许传入参数;

notify_backup:指定当keepalived进入BACKUP状态时要执行的脚本;

notify_fault:指定当keepalived进入FAULT状态时要执行的脚本;

notify_stop:指定当keepalived程序终止时需要执行的脚本;

3.2 VRRP实例配置即keepalived的高可用功能
VRRP实例段主要用来配置节点角色(主从),实例绑定端口,节点间验证机制,集群服务IP等
如:
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
mcast_src_ip
garp_master_delay 10

track_interface {
eth0
eth1
}

    authentication {
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {
        192.168.200.16
        192.168.200.17 dev eth1
        192.168.200.18 dev eth2
    }

virtual_routers {
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
192.168.113.0/24 via 192.168.100.252 or 192.168.100.253
}

nopreempt
preemtp_delay 300
}
其中:
vrrp_instance:是VRRP实例的标识,后跟VRRP实例名称;

state:用于指定keepalived的角色,MASTER表示主服务器,BACKUP表示备用服务器;

interface:用于指定HA监测网络的接口;

virtual_router_id:虚拟路由标识,是一个数字,同一个VRRP实例使用唯一的标识,即在同一个vrrp_instance下,MASTER和BACKUP必须是一致的;

priority:节点优先级,数字越大优先级越高(在一个VRRP_instance下,MASTER的优先级必须大于BACKUP的优先级);

advert_int:用于设定MASTER与BACKUP主机之间同步检查的时间间隔,单位秒;

mcast_src_ip:用于设置发送多播包的地址,若不设置,将使用绑定网卡对应的IP地址;

garp_master_delay:用于设置在切换到MASTER状态后延时进行Gratuitous arp请求的时间;

track_interface:用于设置一些额外的网络监控接口,其中任何一个接口出现故障,keepalived都会进入FAULT状态;

authentication:用于设定节点间通信验证码类型和密码 ,主要类型有PASS和AH两种,在一个vrrp_instance下,MASTER和BACKUP必须使用相同的密码才能正常通信;

virtual_ipaddress:用于设置虚拟IP地址(VIP),可设置多个,每行一个;keepalived通过ip address add命令的形式将VIP添加进系统中,而且IP形式可多样;

virtual_routers:和virtual_ipaddress段一样,用来设置在切换时添加或删除相关路由信息;

nopreempt:设置高可用集群不抢占功能;在使用不抢占时,只能在state状态为BACKUP的节点上设置,而且这个节点的优先级必须高于其他节点

preemtp_delay:用于设置抢占的延时时间,单位秒,如系统启动或重启之后网络需要经过一段时间才能正常工作,这时进行主备切换是没有必要的,此选项就是来设置这种情况发生的时间间隔;

4.keepalived的LVS配置
4.1  keepalived配置文件中关于LVS配置段的配置方法:
LVS配置段以virtual_server为开始标识,此段分为两部分:real_server段和健康检测段
virtual_server 192.168.12.200 80 {
delay_loop 6 
lb_algo rr
lb_kind DR
persistence_timeout 50 
persistence_granularity
protocol TCP
ha_suspend
virtualhost
sorry_server
  }
其中:
virtual_server:设置虚拟服务器开始的标识,后跟虚拟IP地址空格符服务端口;

delay_loop:设置健康检查的时间间隔,单位秒;

lb_algo:设置负载调度算法,常用的有rr,wrr,lc,wlc等;

lb_kind:设置LVS实现负载均衡的机制,有NAT,TUN和DR模式;

persistence_timeout:会话保持时间,单位秒,该选项使用户的请求会一直分发到某个服务节点,直到超过这个会话的保持时间;

persistence_granularity:配合persistence_timeout使用,后面跟的值是子网掩码,表示持续连接的粒度,默认是255.255.255.255即一个单独的客户端IP,如果改为255.255.255.0那么客户端所在的整个网段的请求都会分发到同一台realserver上;

protocol:指定转发协议类型,有TCP和UDP两种选型;

ha_suspend:节点状态从MASTER到BACKUP切换时,暂不启用real server节点的健康检查;

virtualhost:再通过HTTP_GET/SSL_GET做健康检测时,指定的web服务器的虚拟主机地址;

sorry_server:相当于一个备用节点,在所有realserver失效后,启用这个节点,
其配置示例:
real_server 192.168.12.132 80 {
weight 3
inhibit_on_failure
notify_up |
notify_down |
}
其中:
real_server:谁知real_server段开始的标识,用来指定real server节点,后跟real server的真实IP地址和端口(有空格)

weight:配置real server节点的权值,数字越大权值越高;

inhibit_on_failure:表示在检测到real server节点失效后,把他的weight值置为0,而不是从IPVS中删除;

notify_up:和notify_master相同,后跟一个脚本,表示在检测到real server节点服务处于UP状态后只执行的脚本;

notify_down:表示在检测到real server节点服务处于DOWN状态后只执行的脚本;

4.2健康检测段的检查方式:
常见的有HTTP_GET,SSL_GET,TCP_CHECK,SMTP_CHECK,MISC_CHECK

如TCP_CHECK检测方式示例:
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
其中:
connect_port:健康状态检查的端口,如果不指定,默认是real_server指定的端口;

connect_timeout:表示无响应超时时间,单位秒;

nb_get_retry:重试次数;

delay_before_retry:重试间隔时间;

如HTTP_GET和SSL_GET检测方式示例:
HTTP_GET | SSL_GET {
url {
path /index.html
digest e6c271eb5f017f280cf97ec2f51b02d3
status_code 200 
    }
connect_port 80
bindto 192.168.12.80
connect_timeout 3
nb_get_retry 3
    delay_before_retry 2
  }
其中:
url:用来指定HTTP/SSL检查的URL信息,可指定多个URL;

path:后跟详细的URL路径;

digest:SSL检查后的摘要信息,可通过genhash命令获取,如genhash -s 192.168.12.80 -p 80 -u /index.html

status_code:指定HTTP检查返回正常状态吗的类型,一般为200;

bindto:表示通过此地址来发送请求对服务器进行健康检查;  

补充:keepalived集群中MASTER和BACKUP角色选举策略
1.在keepalived集群中,其实并没有严格意义上的主备节点,虽然可以在配置文件中设置MASTER状态,但是这并不意味着此节点一直就是MASTER状态。控制节点角色的是配置文件中的priority值,但它并不控制所有节点的角色,另一个能改变角色的是在vrrp_script模块中设置的weight值,这两个选项的值嗾使整数值(weight可以为负整数),一个节点在集群中的角色就是通过这两个值的大小决定的;在vrrp_script模块中,如果不设置weight的值,那么集群优先级的选择将由配置文件中的priority值决定;

2.使用vrrp_script模块时集群角色的选举算法

2.1 weight值为正数时
在vrrp_script中指定的脚本如果检测成功,那么MASTER节点的权值将是weight值与priority值之和;如果检测失败,那么MASTER节点的权值保持为priority值,因此,切换策略为:
        MASTER节点vrrp_script脚本检测失败时,如果MASTER节点priority值小于BACKUP节点weight值与priority值之和,将发生主备切换;

        MASTER节点vrrp_script脚本检测成功时,如果MASTER节点weight值与priority之和大于BACKUP节点weight值与priority值之和,主节点依然为主节点,不发生切换;

2.2 weight值为负数时
在vrrp_script中指定的脚本如果检测成功,那么MASTER节点的权值仍是priority值;如果检测失败,那么MASTER节点的权值将是priority值与weight值之差,因此,切换策略为:

        MASTER节点vrrp_script脚本检测失败时,如果MASTER节点priority值与weight值之差小于BACKUP节点的priority值,将发生主备切换;

        MASTER节点vrrp_script脚本检测成功时,如果MASTER节点priority值大于BACKUP节点priority值时,主节点依然为主节点,不发生切换;


集群配置在:http://blog.chinaunix.net/uid-30212356-id-5558055.html
资料来源:
高性能Linux服务器构建实战(高俊峰著)第11章
阅读(6621) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~