keepalived详解

一、keepalived架构

keepalived基于VRRP协议的软件,其原发起是为了解决LVS的HA问题而衍生的一个软件,所以其对LVS支持比较好,目前和其他软件像haproxy等也可以比较好的结合。主要实现的功能是作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover。其可以实现基于端口、基于hash值、基于页面返回码或自定义方式的后端健康检测。其架构如下:

keepalived详解

从 kernel 空间来看,其主机分为ipvs模块与netlink 模块两部分。netlink主要实现各种网络功能及vrrp的实现,ipvs模块主要实现lvs ipvs功能 。其在启动的时候会生成三个进程。一个主进程,fork两个子进程,其中一个为VRRP子进程,另一个为后端健康检查 。

keepalived详解

二、keepalived配置

keepalived服务的主配置文件为keepalived.conf,其配置主要分为如下几部分(具体可以参考keepalived包中的keepalived.conf.SYNOPSIS):

 

 
  1. * Globals configurations
  2. * Global definitions
  3. * Static addresses
  4. * Static routes
  5. * VRRP configuration
  6. * VRRP scripts
  7. * VRRP synchronization group
  8. * VRRP instance
  9. * LVS configuration
  10. * Virtual server group
  11. * Virtual server

1、全局配置(Globals configurations)

全局配置在官方文档里分两部分:全局定义和静态路由。实际在配置的时候,这个大的静态路由配置下又分为,静态地址配置和路由配置两部分。所以我上面将其划分成了三部分 。

1.1、全局定义(Global definitions)

 
  1. global_defs { # Block identification
  2. notification_email { # Email to send alertes to
  3. [email protected] # 邮件接收人员信息,可以为多个
  4. [email protected]
  5. ...
  6. }
  7. notification_email_from [email protected] # 邮件发送者地址
  8. smtp_server 127.0.0.1 # SMTP server IP address
  9. smtp_connect_timeout 30 # 邮件发送连接超时时间,单位秒
  10. router_id node1 # 机器标识,发送邮件时会知会此id
  11. vrrp_mcast_group4 <IPv4 ADDRESS> # optional, default 224.0.0.18
  12. vrrp_mcast_group6 <IPv6 ADDRESS> # optional, default ff02::12
  13. }

global_defs全局配置标识,表面这个区域{}是全局配置。notification_email配置的是keepalived在发生诸如切换操作时需要email接收者的地址,邮件地址可以多个,每行一个 。

1.2、静态地址与静态路由

 

 
  1. static_ipaddress { # block identification
  2. <IP ADDRESS>/<MASK> brd <IP ADDRESS> dev <STRING> scope <SCOPE>
  3. 10.210.214.163/24 brd 10.210.214.255 dev eth0
  4. ...
  5. }
  6. static_routes { # block identification
  7. src <IP ADDRESS> [to] <IP ADDRESS>/<MASK> via|gw <IP ADDRESS> dev <STRING> scope <SCOPE> table <TABLE-ID> # to is optional
  8. 10.0.0.0/8 via 10.210.214.1 dev eth0
  9. src <IP ADDRESS> [to] <IP ADDRESS>/<MASK> via|gw <IP ADDRESS> or <IP ADDRESS> dev <STRING> scope <SCOPE> table <TABLE-ID> # will use multipath route
  10. blackhole <IP ADDRESS>[/<MASK>]
  11. ...
  12. }

上面这个配置一般用不到,这里是要你主机没有配置IP的时候,可以通过keepalived帮我们配置IP,这点需要和VIP区分开,这里配置的并不是VIP 。上面括号SCOPE里的值可以是site、link、host、nowhere、global 。

2、VRRP配置

VRRP配置分三部分:VRRP同步组、VRRP实例、VRRP脚本三部分。

2.1、VRRP同步组

 

 
  1. vrrp_sync_group <STRING> { # VRRP sync group declaration
  2. group { # group of instance to sync together
  3. tomcat # 这里定义的tomcat和mysql是实例名,和下面的VRRP实例配置对应
  4. mysql
  5. ...
  6. }
  7. notify_master /path/to/to_master.sh # 切换到master状态时,要执行的脚本
  8. notify_backup /path_to/to_backup.sh # 切换到backup状态时,要执行的脚本
  9. notify_fault <STRING>|<QUOTED-STRING> # Script to run during FAULT transit
  10. notify <STRING>|<QUOTED-STRING> # 任意状态切换,都执行后面的脚本
  11. smtp_alert # 有切换时,进行全局配置中的邮件发送通知
  12. }

2.2、VRRP实例配置

 

 
  1. vrrp_instance tomcat { # 实例名和上面的同步组对应
  2. use_vmac # Use VRRP Virtual MAC
  3. vmac_xmit_base # Send/Recv VRRP messages from base
  4. # interface instead of VMAC interface
  5. native_ipv6 # Force instance to use IPv6
  6. # when using mixed IPv4&IPv6 conf
  7. state MASTER|BACKUP # 默认启动时,作为 MASTER还是BACKUP
  8. interface eth0 # 监听接口
  9. track_interface { # 哪些接口状态需要监控
  10. eth0
  11. eth1
  12. <STRING> weight <INTEGER:-254..254>
  13. ...
  14. }
  15. track_script { # Scripts state we monitor
  16. <STRING>
  17. <STRING> weight <INTEGER:-254..254>
  18. ...
  19. }
  20. dont_track_primary # (default unset) ignore VRRP interface faults.
  21. # useful for cross-connect VRRP config.
  22. mcast_src_ip <IP ADDRESS> # src_ip to use into the VRRP packets
  23. unicast_src_ip <IP ADDRESS> # src_ip to use into the VRRP packets (alias to mcast_src_ip)
  24. unicast_peer { # Do not use multicast, instead send VRRP
  25. <IP ADDRESS> # adverts to following list of ip address
  26. ... # in unicast design fashion
  27. }
  28. lvs_sync_daemon_interface <STRING> # Binding interface for lvs syncd
  29. garp_master_delay 10 # delay for gratuitous ARP after MASTER
  30. # state transition
  31. garp_master_refresh <INTEGER> # Periodic delay in seconds sending
  32. # gratuitous ARP while in MASTER state
  33. virtual_router_id <INTEGER-0..255> # VRRP VRID
  34. priority <INTEGER-0..255> # VRRP PRIO
  35. advert_int <INTEGER> # VRRP Advert interval (use default)
  36. authentication { # Authentication block
  37. auth_type PASS|AH # Simple Passwd or IPSEC AH
  38. auth_pass <STRING> # Password string (up to 8 characters)
  39. }
  40. virtual_ipaddress { # VRRP IP addres block
  41. 192.168.200.17/24 dev eth1
  42. <IP ADDRESS>/<MASK> brd <IP ADDRESS> dev <STRING> scope <SCOPE> label <LABEL>
  43. ...
  44. }
  45. virtual_ipaddress_excluded { # VRRP IP excluded from VRRP
  46. <IP ADDRESS>/<MASK> brd <IP ADDRESS> dev <STRING> scope <SCOPE> # packets
  47. ...
  48. }
  49. virtual_routes { # VRRP virtual routes
  50. src <IP ADDRESS> [to] <IP ADDRESS>/<MASK> via|gw <IP ADDRESS> dev <STRING> scope <SCOPE> table <TABLE-ID> metric <METRIC> # to is optional
  51. src <IP ADDRESS> [to] <IP ADDRESS>/<MASK> via|gw <IP ADDRESS> or <IP ADDRESS> dev <STRING> scope <SCOPE> table <TABLE-ID> # will use multipath route
  52. ...
  53. blackhole <IP ADDRESS>[/<MASK>]
  54. }
  55. nopreempt # Override VRRP RFC preemption default
  56. preempt_delay # Seconds after startup until
  57. # preemption. 0 (default) to 1,000
  58. debug # Debug level
  59. notify_master <STRING>|<QUOTED-STRING> # Same as vrrp_sync_group
  60. notify_backup <STRING>|<QUOTED-STRING> # Same as vrrp_sync_group
  61. notify_fault <STRING>|<QUOTED-STRING> # Same as vrrp_sync_group
  62. notify_stop <STRING>|<QUOTED-STRING> # Script to launch when stopping vrrp
  63. notify <STRING>|<QUOTED-STRING> # Same as vrrp_sync_group
  64. smtp_alert # Same as vrrp_sync_group
  65. }

state:state指定instance(Initial)的初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定,里如果这里设置为master,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为master
interface:实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的
dont track primary:忽略VRRP的interface错误
track interface:跟踪接口,设置额外的监控,里面任意一块网卡出现问题,都会进入故障(FAULT)状态,例如,用nginx做均衡器的时候,内网必须正常工作,如果内网出问题了,这个均衡器也就无法运作了,所以必须对内外网同时做健康检查
mcast src ip:发送多播数据包时的源IP地址,这里注意了,这里实际上就是在那个地址上发送VRRP通告,这个非常重要,一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址
garp master delay:在切换到master状态后,延迟多少秒进行ARP(gratuitous ARP)请求
virtual router id:这里设置VRID,这里非常重要,相同的VRID为一个组,他将决定多播的MAC地址
priority 100:设置本节点的优先级,优先级高的为master
advert int:检查间隔,默认为1秒
virtual ipaddress:这里设置的就是VIP,也就是虚拟IP地址,他随着state的变化而增加删除,当state为master的时候就添加,当state为backup的时候删除,这里主要是有优先级来决定的,和state设置的值没有多大关系,这里可以设置多个IP地址
virtual routes:原理和virtual ipaddress一样,只不过这里是增加和删除路由
lvs sync daemon interface:lvs syncd绑定的网卡
nopreempt:设置不抢占,这里只能设置在state为backup的节点上,而且这个节点的优先级必须别另外的高
preempt delay:抢占延迟
debug:debug级别
notify master:和sync group这里设置的含义一样,可以单独设置,例如不同的实例通知不同的管理人员,tomcat实例发给业务管理员,mysql的就发邮件给DBA

2.3、VRRP脚本

 
  1. vrrp_script check_running { # VRRP script declaration
  2. script "/usr/local/bin/check_running" # 该脚本将定期的执行
  3. interval <INTEGER> # 脚本执行间隔
  4. weight <INTEGER:-254..254> # 权限偏移量,5表示权重增加10,-5表示权重减少5
  5. fall <INTEGER> # required number of failures for KO switch
  6. rise <INTEGER> # required number of successes for OK switch
  7. }

该脚本主要是监控VRRP实例用的,上面配置的脚本将后定期的执行,并将结果汇报 。我们可以定义多个VRRP脚本,该脚本真正需要用时,需要在VRRP_INSTANCE(实例)中进行调用 。如下:

 

 
  1. track_script {
  2. check_running weight 20
  3. }

两者类似于函数与函数调用 。

三、LVS配置

这里的LVS配置是专门为keepalived+LVS集成准备的,这里LVS配置并不是指真的安装LVS然后用ipvsadm来配置他,而是用keepalived的配置文件来代替ipvsadm来配置LVS,这样会方便很多,一个配置文件搞定这些,维护方便,配置方便。LVS配置部分也分两部分:虚拟服务器组与虚拟服务器。

1、虚拟主机组

 

 
  1. virtual_server_group <STRING> {
  2. <IP ADDRESS> <PORT> # VIP VPORT
  3. ...
  4. <IP ADDRESS RANGE> <PORT> # VIP range VPORT
  5. ...
  6. fwmark <INTEGER> # fwmark
  7. ...
  8. }

这个配置是可选的,这里配置主要是为了让一台realserver上的某个服务可以属于多个Virtual Server,并且只做一次健康检查。

2、虚拟主机配置

 

 
  1. virtual_server 192.168.1.2 80 { #设置一个virtual server: VIP:Vport
  2. delay_loop 3 # service polling的delay时间,即服务轮询的时间间隔
  3. lb_algo rr|wrr|lc|wlc|lblc|sh|dh #LVS调度算法
  4. lb_kind NAT|DR|TUN #LVS集群模式
  5. persistence_timeout 120 #会话保持时间(秒为单位),即以用户在120秒内被分配到同一个后端realserver
  6. persistence_granularity <NETMASK> #LVS会话保持粒度,ipvsadm中的-M参数,默认是0xffffffff,即每个客户端都做会话保持
  7. protocol TCP #健康检查用的是TCP还是UDP
  8. ha_suspend #suspendhealthchecker’s activity
  9. virtualhost <string> #HTTP_GET做健康检查时,检查的web服务器的虚拟主机(即host:头)
  10. sorry_server <IPADDR> <PORT> #备用机,就是当所有后端realserver节点都不可用时,就用这里设置的,也就是临时把所有的请求都发送到这里啦
  11. real_server <IPADDR> <PORT> #后端真实节点主机的权重等设置,主要,后端有几台这里就要设置几个
  12. {
  13. weight 1 #给每台的权重,0表示失效(不知给他转发请求知道他恢复正常),默认是1
  14. inhibit_on_failure #表示在节点失败后,把他权重设置成0,而不是冲IPVS中删除
  15. notify_up <STRING> | <QUOTED-STRING> #检查服务器正常(UP)后,要执行的脚本
  16. notify_down <STRING> | <QUOTED-STRING> #检查服务器失败(down)后,要执行的脚本
  17. ………………后面是健康检查部分,后面会单独做一个篇幅介绍

先到这里吧,查看配置文件的每项信息远比真实操作麻烦。