Keepalived

简介

Keepalived介绍 Keepalived是一款用于保障服务高可用性的软件,它能自动侦测服务器状态、移出故障服务器、切换到正常运行的服务器、添加恢复后的服务器到集群中。 

 

实现的基本思路 

Keepalived是基于VRRP协议的实现,主要用在IP层、TCP层和应用层。 

1:IP层:Keepalived会定期向服务器群中的服务器发送一个数据包(既Ping),如果发现IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除。

2:TCP层:类似IP层,只不过这里是检测服务的端口 

3:应用层:Keepalived将根据用户的设定来检查服务程序的运行是否正常

 

VRRP协议解决的问题 

在现实网络中,两台服务器之间通常是没有直接连接的,那么A机如何选择到达B机 的路由呢?

 

通常的解决方案有两种: 

1:在A机上使用动态路由协议 (问题:管理维护成本、是否支持等) 

2:在A机上配置静态路由(问题:路由器或默认的网关成单点、需重启网络等) 

VRRP协议的目的就是解决路由单点故障问题。 

 

VRRP协议

 

VRRP (Virtual Router Redundancy Protocol),虚拟路由冗余协议,是解决局域网中配置静态网关出现单点故障的路由协议。 在具有多播或广播能力的局域网中,借助VRRP能在某台路由器出现故障时仍然提供高可靠的缺省链路,有效避免单一链路发生故障后网络中断的问题,而无需修改动态路由协议、路由发现协议等配置信息。

 

名词解释 

1:VRRP路由器:物理的路由器,上面运行了实现VRRP协议的VRRPD程序 

2:VRRP虚拟路由器:逻辑上的路由器,通常由多台路由器组成,可以看成是一个VRRP路由器池,对外看起来是一个路由器,就是那个虚拟的路由器,其标识称为VRID(范围是0-255)

3:Master和Backup:一个虚拟路由里面的多个路由器,并不是同时工作的,工作的那台称为Master,其他的就是Backup。

 

对VRRP协议的理解 

1:VRRP是一种选择协议,它可以把一个虚拟路由器的职责,动态转交给Master进行处理 

2:VRRP是一种路由容错协议,也可以叫做备份路由协议。当Master宕掉后,虚拟路由将启用备份路由器,从而实现网络通信可用

 

VRRP协议工作机制

1:路由器开启VRRP功能后,会根据优先级确定出Master 

2:Master会通过IP多播包的形式来发送公告报文,Backup会接收到这些报文 

3:如果是抢占式:Backup会跟发送报文的Master比较优先级,如果Backup优先级更高,那么Backup会抢占成为Master,而Master会让位成为Backup

4:如果是非抢占式:只要Master没有故障,不会出现新的Master。 

5:如果备份路由器在连续三个公告间隔内收不到VRRP公告,或收到优先级为0的公告的话,就会按照竞选协议来选出新的Master,以保证服务的可用

 

VRRP负载分担 

在实际组网中一般会进行VRRP负载分担方式的设置。负载分担方式是指多 台路由器同时承担业务,避免设备闲置。 

同一台路由器可以加入多个备份组,在不同组中有不同的优先级,使得该 路由器可以在一个组中作为Master,在其他的备份组中作为Backup 

 

 

Keepalived的体系结构

 

 

 

两层结构:用户空间 user space和内核空间 kernel space 

1:IPVS:IP虚拟服务器(IP Virtual Server),是一种提供负载平衡功能的技术 

2:NetLink:提供高级路由及其他相关的网络功能 

3:WatchDog:负责监控checkers和VRRP进程的状况 

4:Checkers:负责真实服务器的健康检查,是keepalived最主要的功能。可以没有 VRRP Stack,但健康检查healthchecking是一定要有的。

5:VRRP Stack:负责负载均衡器之间的失败切换FailOver。如果只用一个负载均衡器,则VRRP不是必须的。

6:IPVS wrapper:用来发送设定的规则到内核的IPVS部分

7:Netlink Reflector:用来设定VRRP的vip地址等 

8:控制面板:对配置文件的编译和解析。Keepalived不是一次性解析所有的配置文件,而是用到一个模块解析一个,因此可以在每个模块看到XXX_parser.c这样的 文件

 

Keepalived的配置

配置概述 Keepalived各种功能的实现是通过设置其配置文件keepalived.conf来完成的。

配置大致分成如下几类:全局配置、VRRPD配置、LVS配置 

全局配置 包含全局定义和静态地址路由。

1:全局定义主要设置Keepalived的通知机制和标识 global_defs{ 

notification_email{
       [email protected]

}

notification_email_from [email protected]

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id my_hostname

vrrp_mcast_group4 224.0.0.18

vrrp_mcast_group6 ff02::12

enable_traps

}

 

(1)notification_email:在有事件时,比如切换的时候,发消息到哪些email, 可以多个,一行一个 

(2)notification_email_from:通知邮件从哪个地址发出 

(3)smpt_server:通知邮件的smtp地址 

(4)smtp_connect_timeout:连接smtp服务器的超时时间,单位秒 

(5)enable_traps:开启SNMP陷阱 

(6)router_id:运行Keepalived的机器的标识,一个网络内应该是唯一的,通常为hostname,但不一定非得是hostname。故障发生时,邮件通知会用到。VRRP协议中不传输这个字段,传输的是Vritual route id,在vrrp instance中配置

(7)vrrp_mcast_group4:vrrp心跳的多播组,如果广播域中有多个Keepalived HA 组的话,不同的组建议使用不同的多播地址,同时使用不同的虚拟路由器ID,可选, 缺省是224.0.0.18 

(8)vrrp_mcast_group6:可选, default ff02::12 

 

2:静态地址和路由:配置的是是本节点的IP和路由信息,也就是不随VRRP实例变化而变化的 地址和路由。如果你的机器上已经配置了IP和路由,那么这两个区域可以不用配置。其 实,一般情况下你的机器都会有IP地址和路由信息的,因此没必要再在这两个区域配置可以不配置,

配置如下: 

static_ipaddress{

192.168.1.1/24 brd + dev eth0 scope global

... }

static_routes{

192.168.2.0/24 via 192.168.1.100 dev eth0 ...

}

每行设置一个ip,格式符合linux下ip命令参数的格式,比如上面的: 

brd:目的是广播地址(broadcast) 

dev:指定设备名称 

scope:设置地址的有效范围 

via:指定下一跳路由器的地址 

 

VRRPD配置 包含VRRP同步组和VRRP实例两个部分。 

1:VRRP同步组 用来保证组里面任何一个实例出问题,都会导致切换。比如某个机器在两个网段,当一个网段出问题的时候,就应该切换。例如: 

vrrp_sync_group VG_1 {

   group {
         inside_network

         outside_network

...... }

notify_master /path/to/to_master.sh

notify_backup /path_to/to_backup.sh

notify_fault "/path/fault.sh VG_1“ notify /path/notify.sh

smtp_alert

 } 

 

(1)inside_network:具体的VRRP实例名

(2)outside_network:对外的ip 

(3)notify_master:指定当切换到Master时执行的脚本,可以传入参数,用“”括起来,notify_backup和notify_fault类似

(4)notify:任何状态的切换变化都会触发并运行的脚本,参数自动添加:$1 = “GROUP”|“INSTANCE”;$2 = 组或实例的名字; $3 = 切换成的目标状态 ("MASTER"|"BACKUP"|"FAULT") 

(5)smtp_alert:使用全局定义的设置,在切换后发送邮件通知 

 

2: VRRP实例 用来定义对外提供服务的VIP区域及其相关属性 

vrrp_instance inside_network {

state MASTER

interface eth0

use_vmac vmac_xmit_base dont_track_primary

 

track_interface {
  eth0

  eth1 ... } 

mcast_src_ip
unicast_src_ip
unicast_peer {

      ...
}
 lvs_sync_daemon_interface eth1 garp_master_delay 10 virtual_router_id 51

priority 100

advert_int 1
authentication {

    auth_type PASS

    auth_pass 1234
}

virtual_ipaddress {

/ brd dev scope label

192.168.200.18/24 dev eth2 label eth2:1

}

 

virtual_ipaddress_excluded {

/ brd dev scope

/ brd dev 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

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

}

}

nopreempt

preempt_delay 300

debug

notify_master |

notify_backup |

notify_fault |

notify | smtp_alert

 

(1)state:指定实例的初始状态,运行起来后,会动态的改变。只有MASTER和 BACKUP两种状态,并且需要大写这些单词。 

(2)interface:实例绑定的网卡,用来发VRRP包 

(3)use_vmac:是否使用VRRP的虚拟MAC地址 

(4)vmac_xmit_base:发送和接收VRRP包的虚拟MAC地址 

(5)dont_track_primary:忽略VRRP网卡错误。(默认未设置) 

(6)track_interface:监控以下网卡,任何一个不通就会切换到FALT(可选) 

(7)mcast_src_ip:修改vrrp组播包的源地址,默认源地址为master的IP。(由于是组播,因此即使修改了源地址,该master还是能收到回应的) (8)unicast_src_ip:不使用组播的源地址 

(9)unicast_peer:不使用多播发送vrrp心跳包, 而改为使用单播发送。这里要配置的是单播组的IP, 即在这个单播组的机器会收到vrrp心跳包,所以主备的 Keepalived都需要加进来 

(10)lvs_sync_daemon_interface:lvs同步服务绑定的网卡

(11)garp_master_delay:角色转换成master后, 延迟多长时间发送免费ARP包. 宣告IP和 MAC对应关系, 主要用于告诉广播域的其他主机或路由器当前虚拟IP对应的MAC地址是什么 

(12)virtual_router_id:虚拟路由标识,是一个数字,整个VRRP内唯一 

(13)priority:优先级,是一个数字,数值愈大,优先级越高 

(14)advert_int:MASTER与BACKUP之间同步检查的时间间隔,单位为秒 

(15)authentication:验证,包含验证类型和验证密码。类型主要有PASS、AH两种,常用 

PASS,密码是明文,同一VRRP实例MASTER与BACKUP使用相同的密码才能正常通信。AH为 ipsec 认证头认证,不需要配置密码 。

(16)virtual_ipaddress:虚拟ip地址,可多个,每个地址占一行,不需要指定子网掩码。 

注意:如果用LVS的话,这个ip必须与LVS客户端设定的vip一致 

(17)virtual_ipaddress_excluded:排除心跳包发送的IP地址 

(18)virtual_routes:路由配置, 当角色为主时, 自动添加这些路由, 当角色为备时, 自动删除这些路由 

(19)nopreempt:非抢占式 

(20)preempt_delay:抢占延迟,默认300秒 

(21)debug:debug级别 

 

LVS配置

跟LVS相关的配置, 如果不使用LVS的话, 不需要配置。包含虚拟服务器组和虚拟服务器两个部分。 

1:虚拟服务器组 

    用来实现一台真实服务器上的某个服务,可以属于多个虚拟服务器,并且只做一次健康检查,是可选的。

形如:

 virtual_server_group

#VIP和端口

...

#例如:192.168.200.1-10

...

fwmark #经过iptables 标记过的服务类型,这样利于按标记进行处理, 

... }

#比如:ip rule add fwmark 3 table 3 (fwmark 3是标记,table 3 是 #路由表3。意思就是凡是标记了 3 的数据使用table3 路由表) 

 

2:虚拟服务器 可以有下面三种定义方式: 

(1)virtual_server IP port

(2)virtual_server fwmark int

(3)virtual_server group string

形如:

virtual_server IP port | virtual_server fwmark int | virtual_server group string{

delay_loop

lb_algo rr|wrr|lc|wlc|lblc|sh|dh ops

lb_kind NAT|DR|TUN persistence_timeout persistence_granularity protocol TCP

ha_suspend

virtualhost

alpha

omega

quorum

hysteresis

quorum_up | quorum_down | sorry_server sorry_server_inhibit

real_server

   {
       weight

inhibit_on_failure

notify_up | notify_down | HTTP_GET|SSL_GET

{

        url {
          path
          digest
          status_code

}

nb_get_retry delay_before_retry connect_ip connect_port bindto bind_port connect_timeout fwmark

        warmup
    } #HTTP_GET|SSL_GET
    TCP_CHECK
    {

connect_ip connect_port bindto bind_port connect_timeout fwmark

        warmup
    }

SMTP_CHECK {
    host {

connect_ip connect_port bindto bind_port connect_timeout fwmark

}

connect_timeout

retry

delay_before_retry helo_name | warmup

}
MISC_CHECK  {

misc_path | misc_timeout

warmup

misc_dynamic

} }}

 

(1)delay_loop:延迟轮询时间(单位秒) 

(2)lb_algo:负载均衡调度算法,互联网应用常使用wlc或rr 

(3)ops:为UDP开启One-Packet-Scheduling 

(4)lb_kind:负载均衡转发规则。一般包括DR,NAT,TUN3种 

(5)persistence_timeout:LVS会话保持的超时时间 

(6)persistence_granularity:LVS会话保持粒度,也就是ipvsadm中的-M参数,默认是 0xffffffff,即为每个客户端保持会话 

(7)protocol:转发使用的协议,TCP或UDP 

(8)ha_suspend:暂停健康检查活动 

(9)virtualhost:健康检查时,检查的web服务器的头信息 

(10)alpha:开启后,当健康检查程序启动失败时,可以预防误报,缺省关闭 

(11)omega:当守护进程关闭时,做出合适的处理,缺省关闭 

(12)quorum:所有运行的服务器的总权重数的最小值,缺省是1 

(13)hysteresis:缺省是0 

(14)quorum_up:quorum达到多少就启动脚本 

(15)quorum_down: quorum丢失多少就启动脚本 

(16)sorry_server:当所有real server宕掉时,sorry server顶替 

(17)sorry_server_inhibit:在sorry_server直接应用inhibit_on_failure的行为 

(18)real_server:真正提供服务的服务器

(19)weight:权重,默认为1,0表示失效 

(20)inhibit_on_failure:健康检查失败时,将weight设置为0,而不是从ipvs里面删除 

(21)notify_up/down:当real server宕掉或启动时执行的脚本 

(22)HTTP_GET:健康的检查方式,HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK

(23)url:HTTP/SSL检查的URL,可以指定多个 

(24)path:请求real serserver上的路径 

(25)digest/status_code:检查后的摘要信息,和检查后返回的http状态码 

(26)nb_get_retry:重试次数 

(27)delay_before_retry:下次重试的时间延迟 

(28)connect_ip:健康检查的ip 

(29)connect_port:健康检查,如果端口通则认为服务器正常 

(30)bindto:以此地址发送请求,来对服务器进行健康检查 

(31)bind_port:绑定的端口 

(32)connect_timeout:表示超时时长

(33)fwmark:经过iptables 标记过的服务类型 

(34)warmup:开始健康检查前,随机延迟的最大时间数,单位秒 

(35)TCP_CHECK:TCP健康检查

(36)SMTP_CHECK:SMTP健康检查

(37)retry:重试次数

(38)delay_before_retry:重连接的间隔时间,单位秒

(39)helo_name:”smtp helo “请求命令的参数

(40)MISC_CHECK:MISC健康检查

(41)misc_path:外部程序或脚本路径

(42)misc_timeout:脚本执行的超时时间 

(43)misc_dynamic:如果设置了这个参数,健康检查程序的退出状态码会用来动态调整服务器的权重,如下:

a:返回0:健康检查通过,不修改权重 b:返回1:健康检查失败,权重设为0 c:返回2-255:健康检查通过,权重设置为 返回的状态码 减去 2 

 

LVS

简介

LVS(Linux Virtual Server),可用来实现LINUX下的简单负载均衡。 LVS工作在TCP/IP协议的四层,其转发是依赖于四层协议的特征进行转发的,由于其转发要依赖于协议的特征进行转发,因此需要在内核的TCP/IP协议栈进行过滤筛 选,而这样的过滤转发规则可由管理员对内核进行定义。 

LVS在内核空间中工作的是“ipvs”,而在用户空间中工作的,用来定义集群服 务规则的是“ipvsadm”。 

 

三种负载均衡转发的机制

1:NAT(Network Address Translation)网络地址翻译技术。 

当用户请求到达调度器时,调度器将改写请求的地址为真实Server地址。在服 务器端处理后,需要再次经过负载调度器将报文的源地址和源端口改成虚拟IP地址和 相应端口,然后把数据发送给用户,完成整个负载调度过程。 

2:TUN(IP Tunneling)IP隧道技术 调度器采用IP隧道技术将用户请求转发到某个Real Server,而这个Real Server将直接响应用户的请求,不再经过调度器。 

 

3:DR(Direct Routing)直接路由技术 DR通过改写请求报文的MAC地址,将请求发送到真实Server,而真实Server将响应直接返回给客户,比TUN少了IP隧道开销。这种方式是三种负载调度机制中性能最高最好的,但是要求调度器与真实服务器在同一物理网段上

 

负载调度的算法

1:rr(Round Robin )轮循,这种算法平等地对待每一台真实服务器,而不管服务器上实际的负载状况和连接状态

2:wrr(Weighted Round Robin )加权轮循,根据真实服务器的不同处理能力来调度请求 

3:lc(Least Connections )最少连接,动态地将请求调度到已建立的链接数最少的服务器 

4:wlc(Weighted Least Connections )加权最少连接,每个服务节点可以用相应的权值表示其处理能力,较高权值的服务器将承受较大比例的活动连接负载

5:dh(Destination hashing )目标地址Hash,根据请求的目标IP,作为散列键从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空

6:SH(Source hashing)源地址hash,根据请求的源IP,作为散列键从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空 

7:SED(Shortest Expected Delay)最短期望的延迟,基于wlc算法,计算每个真实服务器的 请求延迟,把请求转发给最短延迟的服务器 

8:NQ(Never Queue)最少排队,某台真实服务器没有连接时,就直接转发过去 

9:LBLC(Locality-Based Least-Connection)基于局部的最少连接,根据请求的目标IP,找出该地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器; 若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用“最少链接” 的原则选出一个可用的服务器,将请求发送到该服务器 

10:LBLCR(Locality-Based Least-Connection with replication Scheduling)带复制的基 于局部最少连接,它与LBLC算法的不同之处是它要维护从一个目标 IP到一组服务器的映 射,而LBLC是维护从一个目标IP到一台服务器的映射。根据请求的目标IP,找出该目标IP 对应的服务器组,按“最小连接”原则从服务器组中选出一台服务器,若服务器没有超 载,将请求发送到该服务器;若服务器超载,则按“最小连接”原则从这个集群中另外选 出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器 

 

LVS+Keepalived

简介

LVS+Keepalived是一个常见的组合,使用LVS来实现负载均衡,使用Keepalived来实 

现HA。 由于Keepalived是基于LVS的,因此这两部分功能,都可以通过Keepalived来实现, 

配置也基本上在Keepalived上配置。

n 配置Keepalived.conf (1)全局配置和VRRPD的配置跟以前是一样的,只需要添加LVS的配置就可以了。 (2)主服务器和备用服务器的配置是一样的。 (3)LVS+DR模式中,只支持IP的转发,不支持端口转发,也就是说virtual_server和 

real_server的配置节点中端口必须一样 virtual_server 192.168.1.77 8080 { 

    delay_loop 6
    lb_algo wrr
    lb_kind DR
    persistence_timeout 60
    protocol TCP

real_server 192.168.1.201 8080 { weight 3

#TCP_CHECK {

        #     connect_timeout 10

        #     nb_get_retry 3

        #     delay_before_retry 3

        #     connect_port 80
        #}
        HTTP_GET {
url {
path / 
                status_code 200
          }
          connect_timeout 10
          nb_get_retry 3
          delay_before_retry 3
 }

 

 }

}

 

真实服务器上的配置 真实服务器上需要对VIP进行绑定,并进行路由设置等一系列操作,这里整理为一个 

脚本供参考:lvs_real.sh: #!/bin/sh 

VIP=192.168.1.77
/etc/rc.d/init.d/functions
case "$1" in
start)

echo " start tunl port"

ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP up echo "2">/proc/sys/net/ipv4/conf/all/arp_announce

echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore

echo "2">/proc/sys/net/ipv4/conf/lo/arp_announce

echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignore

;;

stop)

echo " stop tunl port" ifconfig lo:0 down

echo "0">/proc/sys/net/ipv4/conf/all/arp_announce echo "0">/proc/sys/net/ipv4/conf/all/arp_ignore echo "0">/proc/sys/net/ipv4/conf/lo/arp_announce echo "0">/proc/sys/net/ipv4/conf/lo/arp_ignore

;;

*)
    echo "Usage: $0 {start|stop}"
    exit 1

esac

说明

1:基本的使用方法:sh lvs_real.sh start,如果没有权限的话,需要授权 

2:VIP被绑定在环回接口lo:0上,其广播地址是其本身,子网掩码是 255.255.255.255。采用这种可变长掩码方式可以避免IP地址冲突 

3:echo “1”,echo “2” 这段的作用是抑制ARP(地址广播协议)广播 

 

你可能感兴趣的:(keepalive,集群,lvs,负载均衡,反向代理,server,tools)