大致分两层结构:用户空间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{ }notification_email_from smtp_server 127.0.0.1smtp_connect_timeout 30router_id my_hostnamevrrp_mcast_group4 224.0.0.18vrrp_mcast_group6 ff02::12enable_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::122:静态地址和路由:配置的是是本节点的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_networkoutside_network......}notify_master /path/to/to_master.shnotify_backup /path_to/to_backup.shnotify_fault "/path/fault.sh VG_1“notify /path/notify.shsmtp_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 MASTERinterface eth0use_vmac <VMAC_INTERFACE>vmac_xmit_basedont_track_primarytrack_interface {
eth0eth1 ...}mcast_src_ip <IPADDR>unicast_src_ip <IPADDR>unicast_peer { <IPADDR> ...}lvs_sync_daemon_interface eth1garp_master_delay 10virtual_router_id 51priority 100advert_int 1authentication { auth_type PASSauth_pass 1234}virtual_ipaddress { <IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>192.168.200.17/24 dev eth1192.168.200.18/24 dev eth2 label eth2:1}virtual_ipaddress_excluded {
<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE><IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE>...}virtual_routes { src 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1192.168.110.0/24 via 192.168.200.254 dev eth1192.168.111.0/24 dev eth2192.168.112.0/24 via 192.168.100.254192.168.113.0/24 via 192.168.200.254 or 192.168.100.254 dev eth1blackhole 192.168.114.0/24}nopreemptpreempt_delay 300debugnotify_master <STRING>|<QUOTED-STRING>notify_backup <STRING>|<QUOTED-STRING>notify_fault <STRING>|<QUOTED-STRING>notify <STRING>|<QUOTED-STRING>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 <STRING> { <IPADDR> <PORT> #VIP和端口...<IPADDR RANGE> <PORT> #例如:192.168.200.1-10...fwmark <INT> #经过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 <INT>lb_algo rr|wrr|lc|wlc|lblc|sh|dhopslb_kind NAT|DR|TUNpersistence_timeout <INT>persistence_granularity <NETMASK>protocol TCPha_suspendvirtualhost <STRING>alphaomega
quorum <INT>hysteresis <INT>quorum_up <STRING>|<QUOTED-STRING>quorum_down <STRING>|<QUOTED-STRING>sorry_server <IPADDR> <PORT>sorry_server_inhibitreal_server <IPADDR> <PORT>{ weight <INT>inhibit_on_failurenotify_up <STRING>|<QUOTED-STRING>notify_down <STRING>|<QUOTED-STRING>HTTP_GET|SSL_GET{ url { path <STRING>digest <STRING>status_code <INT>}nb_get_retry <INT>
delay_before_retry <INT>connect_ip <IP ADDRESS>connect_port <PORT>bindto <IP ADDRESS>bind_port <PORT>connect_timeout <INTEGER>fwmark <INTEGER>warmup <INT>} #HTTP_GET|SSL_GETTCP_CHECK{ connect_ip <IP ADDRESS>connect_port <PORT>bindto <IP ADDRESS>bind_port <PORT>connect_timeout <INTEGER>fwmark <INTEGER>warmup <INT>}SMTP_CHECK {
host { connect_ip <IP ADDRESS>connect_port <PORT>bindto <IP ADDRESS>bind_port <PORT>connect_timeout <INTEGER>fwmark <INTEGER>}connect_timeout <INTEGER>retry <INTEGER>delay_before_retry <INTEGER>helo_name <STRING>|<QUOTED-STRING>warmup <INT>}MISC_CHECK { misc_path <STRING>|<QUOTED-STRING>misc_timeout <INT>warmup <INT>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:健康检查失败,权重设为0c:返回2-255:健康检查通过,权重设置为返回的状态码减去2