keepalived

简介:

keepalived介绍:

Keepalived的作用是检测服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。

keepalived最初的目的是为ipvs提供高可用。


keepalived的核心:

  vrrp的实现:

  virtual server

  vrrp_script


keepalived工作原理

keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议

虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级选举一个backup当master。这样的话就可以保证路由器的高可用了。

keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。


keepalived的配置文件

keepalived只有一个配置文件keepalived.conf,里面主要包括以下几个配置区域,分别是global_defs、static_ipaddress、static_routes、vrrp_script、vrrp_instance和virtual_server。

keepalived配置文件样例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
! Configuration File  for  keepalived  
global_defs {  
    notification_email {  
          root@localhost
    }  
    notification_email_from kanotify@muuzz.com
    smtp_connect_timeout 3  
    smtp_server 127.0.0.1  
    router_id LVS_DEVEL  
}  
vrrp_script chk_mantaince_down {
    script  "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"  
    #[ -f /etc/keepalived/down ]检查是否有down这个文件,如果真返回1,1代表失败,如果假返回0,0代表成功
    # commadn1 && command2  只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才会被执行
    # commadn1 || command2  只有在 || 左边的命令返回假(命令返回值 $? == 1),|| 右边的命令才会被执行。
    interval 1
    weight -2
    #只要上面exit 1,weight就-2,下面的101 -2 = 99 #BACKUP的100少了,优先级低了,就变成备用状态,再次检测如果down没了,权重又成101了,就又变成MASTER了。这样就可以手动干预vip在节点间切换
}
vrrp_instance VI_1 {  
     interface eth0  
     state MASTER   # BACKUP for slave routers
     priority 101   # 100 for BACKUP
     virtual_router_id 51 
     garp_master_delay 1 
     authentication {  
         auth_type PASS  
         auth_pass password  
     }  
     track_interface {  
        eth0    
     }  
     virtual_ipaddress {  
         192.168.255.100 /24
     }  
     track_script {  
         chk_mantaince_down
     }  
  }



global_defs:全局配置段

主要是配置故障发生时的通知对象以及机器标识

1
2
3
4
5
6
7
8
9
10
11
12
global_defs {
     notification_email {
         a@abc.com
         b@abc.com
         ...
     }
     notification_email_from alert@abc.com
     smtp_server smtp.abc.com
     smtp_connect_timeout 30
     enable_traps
     router_id host163
}


  • notification_email 故障发生时给谁发邮件通知。

  • notification_email_from 通知邮件从哪个地址发出。

  • smpt_server 通知邮件的smtp地址。

  • smtp_connect_timeout 连接smtp服务器的超时时间。

  • enable_traps 开启SNMP陷阱(Simple Network Management Protocol)。

  • router_id 标识本节点的字条串,通常为hostname,但不一定非得是hostname。故障发生时,邮件通知会用到。

static_ipaddress和static_routes区域

static_ipaddress和static_routes区域配置的是是本节点的IP和路由信息。如果你的机器上已经配置了IP和路由,那么这两个区域可以不用配置。其实,一般情况下你的机器都会有IP地址和路由信息的,因此没必要再在这两个区域配置。

1
2
3
4
5
6
7
8
static_ipaddress {
     10.210.214.163 /24  brd 10.210.214.255 dev eth0
     ...
}
static_routes {
     10.0.0.0 /8  via 10.210.214.1 dev eth0
     ...
}

以上分别表示启动/关闭keepalived时在本机执行的如下命令:

1
2
3
4
# /sbin/ip addr add 10.210.214.163/24 brd 10.210.214.255 dev eth0
# /sbin/ip route add 10.0.0.0/8 via 10.210.214.1 dev eth0
# /sbin/ip addr del 10.210.214.163/24 brd 10.210.214.255 dev eth0
# /sbin/ip route del 10.0.0.0/8 via 10.210.214.1 dev eth0

注意: 请忽略这两个区域,因为我坚信你的机器肯定已经配置了IP和路由。

vrrp_script:VRRPD配置段

用来做健康检查的,当时检查失败时会将vrrp_instancepriority减少相应的值。

1
2
3
4
5
vrrp_script chk_http_port {
     script  "</dev/tcp/127.0.0.1/80"
     interval 1
     weight -10
}

以上意思是如果script中的指令执行失败,那么相应的vrrp_instance的优先级会减少10个点。

vrrp_instance和vrrp_sync_group区域

vrrp_instance用来定义对外提供服务的VIP区域及其相关属性。

vrrp_rsync_group用来定义vrrp_intance组,使得这个组内成员动作一致。举个例子来说明一下其功能:

两个vrrp_instance同属于一个vrrp_rsync_group,那么其中一个vrrp_instance发生故障切换时,另一个vrrp_instance也会跟着切换(即使这个instance没有发生故障)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
vrrp_sync_group VG_1 {
     group {
         inside_network    # name of vrrp_instance (below)
         outside_network    # One for each moveable IP.
         ...
     }
     notify_master  /path/to_master .sh
     notify_backup  /path/to_backup .sh
     notify_fault  "/path/fault.sh VG_1"
     notify  /path/notify .sh
     smtp_alert
}
vrrp_instance VI_1 {
     state MASTER
     interface eth0
     use_vmac
     dont_track_primary
     track_interface {
         eth0
         eth1
     }
     mcast_src_ip
     lvs_sync_daemon_interface eth1
     garp_master_delay 10
     virtual_router_id 1
     priority 100
     advert_int 1
     authentication {
         auth_type PASS
         auth_pass 12345678
     }
     virtual_ipaddress {
         10.210.214.253 /24  brd 10.210.214.255 dev eth0
         192.168.1.11 /24  brd 192.168.1.255 dev eth1
     }
     virtual_routes {
         172.16.0.0 /12  via 10.210.214.1
         192.168.1.0 /24  via 192.168.1.1 dev eth1
         default via 202.102.152.1
     }
     track_script {
         chk_http_port
     }
     nopreempt
     preempt_delay 300
     debug
     notify_master
|
     notify_backup
|
     notify_fault
|
     notify
|
     smtp_alert
}


  • notify_master/backup/fault 分别表示切换为主/备/出错时所执行的脚本。

  • notify 表示任何一状态切换时都会调用该脚本,并且该脚本在以上三个脚本执行完成之后进行调用,keepalived会自动传递三个参数($1 = "GROUP"|"INSTANCE",$2 = name of group or instance,$3 = target state of transition(MASTER/BACKUP/FAULT))。

  • smtp_alert 表示是否开启邮件通知(用全局区域的邮件设置来发通知)。

  • state 可以是MASTER或BACKUP,不过当其他节点keepalived启动时会将priority比较大的节点选举为MASTER,因此该项其实没有实质用途。

  • interface 节点固有IP(非VIP)的网卡,用来发VRRP包。

  • use_vmac 是否使用VRRP的虚拟MAC地址。

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

  • track_interface 监控以下网卡,如果任何一个不通就会切换到FALT状态。(可选项)

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

  • lvs_sync_daemon_interface 绑定lvs syncd的网卡。

  • garp_master_delay 当切为主状态后多久更新ARP缓存,默认5秒。

  • virtual_router_id 取值在0-255之间,用来区分多个instance的VRRP组播。

注意: 同一网段中virtual_router_id的值不能重复,否则会出错,相关错误信息如下。  

1
2
3
4
5
Keepalived_vrrp[27120]: ip address associated with VRID not present  in  received packet :
one or  more  VIP associated with VRID mismatch actual MASTER advert
bogus VRRP packet received on eth1 !!!
receive an invalid ip number count associated with VRID!
VRRP_Instance(xxx) ignoring received advertisment...

可以用这条命令来查看该网络中所存在的vrid:tcpdump -nn -i any net 224.0.0.0/8

  • priority 用来选举master的,要成为master,那么这个选项的值最好高于其他机器50个点,该项取值范围是1-255(在此范围之外会被识别成默认值100)。

  • advert_int 发VRRP包的时间间隔,即多久进行一次master选举(可以认为是健康查检时间间隔)。

  • authentication 认证区域,认证类型有PASS和HA(IPSEC),推荐使用PASS(密码只识别前8位)。

  • virtual_ipaddress vip,不解释了。

  • virtual_routes 虚拟路由,当IP漂过来之后需要添加的路由信息。

  • virtual_ipaddress_excluded 发送的VRRP包里不包含的IP地址,为减少回应VRRP包的个数。在网卡上绑定的IP地址比较多的时候用。

  • nopreempt 允许一个priority比较低的节点作为master,即使有priority更高的节点启动。

首先nopreemt必须在state为BACKUP的节点上才生效(因为是BACKUP节点决定是否来成为MASTER的),其次要实现类似于关闭auto failback的功能需要将所有节点的state都设置为BACKUP,或者将master节点的priority设置的比BACKUP低。我个人推荐使用将所有节点的state都设置成BACKUP并且都加上nopreempt选项,这样就完成了关于autofailback功能,当想手动将某节点切换为MASTER时只需去掉该节点的nopreempt选项并且将priority改的比其他节点大,然后重新加载配置文件即可(等MASTER切过来之后再将配置文件改回去再reload一下)。

当使用track_script时可以不用加nopreempt,只需要加上preempt_delay 5,这里的间隔时间要大于vrrp_script中定义的时长。

  • preempt_delay master启动多久之后进行接管资源(VIP/Route信息等),并提是没有nopreempt选项。

virtual_server_group和virtual_server区域

virtual_server_group一般在超大型的LVS中用到,一般LVS用不到这东西,因此不多说。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
virtual_server IP Port {
     delay_loop
     lb_algo rr|wrr|lc|wlc|lblc|sh|dh
     lb_kind NAT|DR|TUN
     persistence_timeout
     persistence_granularity
     protocol TCP
     ha_suspend
     virtualhost
     alpha
     omega
     quorum
     hysteresis
     quorum_up
|
     quorum_down
|
     sorry_server
     real_server
{
         weight
         inhibit_on_failure
         notify_up
|
         notify_down
|
         # HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK
         HTTP_GET|SSL_GET {
             url {
                 path
                 # Digest computed with genhash
                 digest
                 status_code
             }
             connect_port
             connect_timeout
             nb_get_retry
             delay_before_retry
         }
     }
}


  • delay_loop 延迟轮询时间(单位秒)。

  • lb_algo 后端调试算法(load balancing algorithm)。

  • lb_kind LVS调度类型NAT/DR/TUN

  • virtualhost 用来给HTTP_GET和SSL_GET配置请求header的。

  • sorry_server 当所有real server宕掉时,sorry server顶替。

  • real_server 真正提供服务的服务器。

  • weight 权重。

  • notify_up/down 当real server宕掉或启动时执行的脚本。

  • 健康检查的方式,N多种方式。

  • path 请求real serserver上的路径。

  • digest/status_code 分别表示用genhash算出的结果和http状态码。

  • connect_port 健康检查,如果端口通则认为服务器正常。

  • connect_timeout,nb_get_retry,delay_before_retry分别表示超时时长、重试次数,下次重试的时间延迟。

其他选项暂时不作说明。

keepalived主从切换

keepalived采用VRRP(virtual router redundancy protocol),虚拟路由冗余协议,以软件的形式实现服务器热备功能。通常情况下是将两台linux服务器组成一个热备组(master-backup),同一时间热备组内只有一台主服务器(master)提供服务,同时master会虚拟出一个共用IP地址(VIP),这个VIP只存在master上并对外提供服务。如果keepalived检测到master宕机或服务故障,备服务器(backup)会自动接管VIP成为master,keepalived并将master从热备组移除,当master恢复后,会自动加入到热备组,默认再抢占成为master,起到故障转移功能


Keepalive要考虑的问题?

1、如何在状态转换时进行通知?

  通知的指令可以用在vrrp_sync_group中,也可以用在vrrp_instance中

#####1.使用: 
notify_master 
notify_backup 
notify_fault 
可以使用在vrrp_sync_group和vrrp_instance中,较多使用在vrrp_instance中 
如果脚本带有参数,需要用引号“”引起来:notify_fault “/path/fault.sh VG_1” 
当发生状态切换时,会根据切换的状态分配调用MASTER BACKUP FAULT指定的脚本

#####2.使用: 
notify进行通知,notify可以使用在vrrp_sync_group和vrrp_instance中 
此时脚本需要接受三个参数: 
1vrrpsyncgroupvrrpinstance2 组或instance名 
$3 “MASTER”|”BACKUP”|”FAULT”


2、如何配置LVS?

      virtual server配置?

     realserver配置?

         health_check?





3、如何对某特定服务做高可用?




4、如何实现基于多虚拟路由的master/master模型?






参考资料:http://outofmemory.cn/wiki/keepalived-configuration

keepalive 通知:http://blog.csdn.net/ashic/article/details/52140571  










本文转自 曾哥最爱 51CTO博客,原文链接:http://blog.51cto.com/zengestudy/1864514,如需转载请自行联系原作者

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
6月前
|
数据安全/隐私保护 网络架构
Keepalived 安装与配置
安装好之后, 下一步就开始去来写这个配置文件了,就在这里面去建一个 etc 当中,就是在这个 etc 当中建一个这个 Keepalived 的 config 这样的一个文件:
91 1
Keepalived
目录 1.    基础掌握    1 1.1    服务安装    1 1.2    启动说明    1 1.3    配置说明    1 2.    高可用单实例    3 2.
1117 0
|
网络安全 Ubuntu 网络协议
|
应用服务中间件 nginx 网络协议
|
Web App开发 调度 开发工具
|
监控 负载均衡 网络协议
|
负载均衡 数据安全/隐私保护 网络协议