LVS---3. keepalived.conf文件配置详解
程序员文章站
2022-03-06 11:49:50
...
keepalived的配置文件可以分为三块:
- 全局定义块:对整个 Keepalive 配置生效的,不管是否使用 LVS;
1、email通知。作用:有故障,发邮件报警。
2、Lvs负载均衡器标识(lvs_id)。在一个网络内,它应该是唯一的。
3、花括号“{}”。用来分隔定义块,因此必须成对出现。如果写漏了,keepalived运行时,不会得到预期的结果。由于定义块内存在嵌套关系,因此很容易遗漏结尾处的花括号,这点要特别注意。 - VRRP实际定义块:是keepalived的核心;
1、同步vrrp组vrrp_sync_group。作用:确定失败切换(FailOver)包含的路由实例个数。即在有2个负载均衡器的场景,一旦某个负载均衡器失效,需要自动切换到另外一个负载均衡器的实例是哪些?
2、实例组group。至少包含一个vrrp实例。
3、Vrrp实例vrrp_instance。实例名出自实例组group所包含的那些名字。
(1)实例状态state。只有MASTER和BACKUP两种状态,并且需要大写这些单词。其中MASTER为工作状态,BACKUP为备用状态。当MASTER所在的服务器失效时,BACKUP所在的系统会自动把它的状态有BACKUP变换成MASTER;当失效的MASTER所在的系统恢复时,BACKUP从MASTER恢复到BACKUP状态。
(2)通信接口interface。对外提供服务的网络接口,如eth0,eth1.当前主流的服务器都有2个或2个以上的接口,在选择服务接口时,一定要核实清楚。
(3)lvs_sync_daemon_inteface。负载均衡器之间的监控接口,类似于HA HeartBeat的心跳线。但它的机制优于Heartbeat,因为它没有“裂脑”这个问题,它是以优先级这个机制来规避这个麻烦的。在DR模式中,lvs_sync_daemon_inteface 与服务接口interface 使用同一个网络接口。
(4)虚拟路由标识virtual_router_id。这个标识是一个数字,并且同一个vrrp实例使用唯一的标识。即同一个vrrp_stance,MASTER和BACKUP的virtual_router_id是一致的,同时在整个vrrp内是唯一的。
(5)优先级priority。这是一个数字,数值愈大,优先级越高。在同一个vrrp_instance里,MASTER 的优先级高于BACKUP。若MASTER的priority值为150,那么BACKUP的priority只能是140或更小的数值。
(6)同步通知间隔advert_int。MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位为秒。
(7)验证authentication。包含验证类型和验证密码。类型主要有PASS、AH两种,通常使用的类型为PASS,据说AH使用时有问题。验证密码为明文,同一vrrp实例MASTER与BACKUP 使用相同的密码才能正常通信。
4、 虚拟ip地址virtual_ipaddress。可以有多个地址,每个地址占一行,不需要指定子网掩码。注意:这个ip必须与我们在lvs客户端设定的vip相一致! - 虚拟服务器LVS定义块:LVS 配置只在使用 Keepalived 来配置和管理 LVS 时才需要使用,如果仅仅使用 Keepalived做 HA,LVS 的配置完全是不需要的。
虚拟服务器定义是keepalived框架最重要的项目了,是keepalived.conf必不可少的部分。
1、虚拟服务器virtual_server。这个ip来自于vrrp定义块的第“4”步,后面一个空格,然后加上端口号。定义一个vip,可以实现多个tcp端口的负载均衡功能。
(1)delay_loop。健康检查时间间隔,单位是秒。
(2)lb_algo。负载均衡调度算法,互联网应用常使用wlc或rr。
(3)lb_kind。负载均衡转发规则。一般包括DR、NAT、TUN3种,在我的方案中,都使用DR的方式。
(4)persistence_timeout。会话保持时间,单位是秒。这个选项对动态网站很有用处:当用户从远程用帐号进行登陆网站时,有了这个会话保持功能,就能把用户的请求转发给同一个应用服务器。在这里,我们来做一个假设,假定现在有一个lvs 环境,使用DR转发模式,真实服务器有3个,负载均衡器不启用会话保持功能。当用户第一次访问的时候,他的访问请求被负载均衡器转给某个真实服务器,这样他看到一个登陆页面,第一次访问完毕;接着他在登陆框填写用户名和密码,然后提交;这时候,问题就可能出现了—登陆不能成功。因为没有会话保持,负载均衡器可能会把第2次的请求转发到其他的服务器。
(5)转发协议protocol。一般有tcp和udp两种。实话说,我还没尝试过udp协议类的转发。
2、真实服务器real_server,也即服务器池。Real_server的值包括ip地址和端口号,多个连续的真实ip。
(1)权重weight,权重值是一个数字,数值越大,权重越高。使用不同的权重值的目的在于为不同性能的机器分配不同的负载,性能较好的机器,负载分担大些;反之,性能差的机器,则分担较少的负载,这样就可以合理的利用不同性能的机器资源。
(2)Tcp检查tcp_check。
配置文件都是以块(block)形式组织的,每个块都在{和}包围的范围内。#和!开头的行都是注释。
[[email protected] ~]# cat /usr/local/keepalived/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs { #全局配置
notification_email { #指定keepalived在发生切换时需要发送email到的对象,一行一个
[email protected] #指定收件人邮箱
[email protected]
[email protected]
}
notification_email_from [email protected] #指定发件人
smtp_server 192.168.200.1 #指定smtp服务器地址
smtp_connect_timeout 30 #指定smtp连接超时时间
router_id LVS_DEVEL #此处注意router_id为负载均衡标识,在局域网内应该是唯一的。
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
#如果这块没有,就不用管他
vrrp_sync_group VG_1{ #监控多个网段的实例
group {
inside_network #实例名
outside_network
}
notify_master /path/xx.sh #指定当切换到master时,执行的脚本
netify_backup /path/xx.sh #指定当切换到backup时,执行的脚本
notify_fault "path/xx.sh VG_1" #故障时执行的脚本
notify /path/xx.sh
smtp_alert #使用global_defs中提供的邮件地址和smtp服务器发送邮件通知
}
vrrp_instance inside_network {
state BACKUP #指定那个为master,那个为backup,如果设置了nopreempt这个值不起作用,主备考priority决定
interface eth0 #设置实例绑定的网卡
dont_track_primary #忽略vrrp的interface错误(默认不设置)
track_interface{ #设置额外的监控,里面那个网卡出现问题都会切换
eth0
eth1
}
mcast_src_ip #发送多播包的地址,如果不设置默认使用绑定网卡的primary ip
garp_master_delay #在切换到master状态后,延迟进行gratuitous ARP请求
virtual_router_id 50 #VPID标记
priority 99 #优先级,高优先级竞选为master
advert_int 1 #检查间隔,默认1秒
nopreempt #设置为不抢占 注:这个配置只能设置在backup主机上,而且这个主机优先级要比另外一台高
preempt_delay #抢占延时,默认5分钟
debug #debug级别
authentication { #设置认证
auth_type PASS #认证方式,类型主要有PASS、AH 两种
auth_pass 111111 #认证密码
}
virtual_ipaddress { #设置vip
192.168.36.200
}
}
vrrp_instance VI_1 { #虚拟路由的标识符
state MASTER #状态只有MASTER和BACKUP两种,并且要大写,MASTER为工作状态,BACKUP是备用状态
interface eth0 #通信所使用的网络接口
lvs_sync_daemon_inteface eth0 #这个默认没有,相当于心跳线接口,DR模式用的和上面的接口一样,也可以用机器上的其他网卡eth1,用来防止脑裂。
virtual_router_id 51 #虚拟路由的ID号,是虚拟路由MAC的最后一位地址
priority 100 #此节点的优先级,主节点的优先级需要比其他节点高
advert_int 1 #通告的间隔时间
nopreempt #设置为不抢占 注:这个配置只能设置在backup主机上,而且这个主机优先级要比另外一台高
preempt_delay #抢占延时,默认5分钟
authentication { #认证配置
auth_type PASS #认证方式
auth_pass 1111 #认证密码
}
virtual_ipaddress { #虚拟ip地址,可以有多个地址,每个地址占一行,不需要子网掩码,同时这个ip 必须与我们在lvs 客户端设定的vip 相一致!
192.168.200.16
192.168.200.17
192.168.200.18
}
}
virtual_server 192.168.200.100 443 { #集群所使用的VIP和端口
delay_loop 6 #健康检查间隔,单位为秒
lb_algo rr #lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh
nat_mask 255.255.255.0 #VIP掩码
lb_kind NAT #负载均衡转发规则。一般包括DR,NAT,TUN 3种
persistence_timeout 50 #会话保持时间,会话保持,就是把用户请求转发给同一个服务器,不然刚在1上提交完帐号密码,就跳转到另一台服务器2上了
protocol TCP #转发协议,有TCP和UDP两种,一般用TCP,没用过UDP
persistence_granularity <NETMASK> #lvs会话保持粒度
real_server 192.168.201.100 443 { #真实服务器,包括IP和端口号
weight 1 #默认为1,0为失效
inhibit_on_failure #在服务器健康检查失效时,将其设为0,而不是直接从ipvs中删除
notify_up <string> | <quoted-string> #在检测到server up后执行脚本
notify_down <string> | <quoted-string> #在检测到server down后执行脚本
TCP_CHECK { #通过tcpcheck判断RealServer的健康状态
connect_timeout 3 #连接超时时间
nb_get_retry 3 #重连次数
delay_before_retry 3 #重连间隔时间
connect_port 23 健康检查的端口的端口
bindto <ip>
}
HTTP_GET | SSL_GET { #健康检测方式,可选有 SSL_GET、TCP_CHECK、HTTP_GET
url { #检查url,可以指定多个
path / #检查的url路径
digest ff20ad2481f97b1754ef3e12ecd3a9cc #需要检查到的内容。检查后的摘要信息。
status_code 200 #检查的返回状态码
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout 3 #连接超时时间
nb_get_retry 3 #检测尝试几次
delay_before_retry 3 #检测的时间间隔
}
}
}
Note值得注意的是:
1、你必须向你的服务器所在机房IDC多申请一个IP供VIP使用;多关注/var/log/messages和ipvsadm -ln,利用其有效信息排错。
2、服务器的iptables、Selinux均关闭;在生产环境中,我就遇到了iptables的NAT转发问题,导致了lvs失败。
3、keepalived的启动过程并不会对配置文件进行语法检查,就算没有配置文件,keepalived的守护进程照样能够被运行起来。在默认状态下,即不指定配置文件的位置–keepalived先查找文件/etc/keepalived/keepalived.conf。
4、session的过程默认是以文件的形式存在,在浏览器关闭或重启时删除;会话保持我建议写成120秒,如果这个值设置得不合理,用户将得到非常糟糕的访问效果。
5、keepalived是lvs的扩展项目,因此它们之间具备良好的兼容性,这点应该是keepalived部署比其他类似工具能更简洁的原因吧,lvs+keepalived目前是一个应用于生产环境的成熟架构,实现了真正意义上的负载均衡高可用,尤其适用于bbs和blog(它们均是访问频繁,用户量大的对象),建议熟练掌握。