keepalived体系结构及相关配置

keepalived体系结构及相关配置_第1张图片

大致分两层结构:用户空间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_INTERFACE>
vmac_xmit_base
dont_track_primary

track_interface {
eth0
eth1 ...
}
mcast_src_ip <IPADDR>
unicast_src_ip <IPADDR>
unicast_peer {
<IPADDR> ...
}
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 {
<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>
192.168.200.17/24 dev eth1
192.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 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 <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|dh
ops
lb_kind NAT|DR|TUN
persistence_timeout <INT>
persistence_granularity <NETMASK>
protocol TCP
ha_suspend
virtualhost <STRING>
alpha

omega
quorum <INT>
hysteresis <INT>
quorum_up <STRING>|<QUOTED-STRING>
quorum_down <STRING>|<QUOTED-STRING>
sorry_server <IPADDR> <PORT>
sorry_server_inhibit
real_server <IPADDR> <PORT>
{
weight <INT>
inhibit_on_failure
notify_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_GET
TCP_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:健康检查失败,权重设为0
c:返回2-255:健康检查通过,权重设置为返回的状态码减去2

你可能感兴趣的:(keepalived体系结构及相关配置)