keepalived控制lvs与实现持久化
用keepalived
来控制lvs的行为而不通过ipvsadm
可以大大简化配置流程。用ipvsadm配置还得通过一些手段 把配置保留下来。keepalived一站式解决lvs、vrrp,实在是太爽啦(就是有些地方UserGuide和Manual会打架)
对于配置keepalived的vrrp实例还是很简单的,就是注意配置文件/etc/keepalived/keepalive.conf
权限不能为执行,否则会报错(远程配置文件的时候还没有搞定su下x转发的问题,我踏马直接肌肉记忆777)
基本配置
部分条目注释将放在备份调度器配置文件
部分条目注释将放在备份调度器配置文件
部分条目注释将放在备份调度器配置文件
主调度器配置
路径/etc/keepalived/keepalived.conf
:
1 | global_defs { |
备份调度器配置
路径同上:
1 | global_defs { |
重启keepalived验证配置是否成功:
1 | [baka@lvs1 ~]$ sudo ipvsadm -L |
可以看到成功配置,符合期望
本配置如下:
Master LVS:192.168.56.51
Backup LVS:192.168.56.52
Real Server1:192.168.56.56
Real Server2:192.168.56.57
关于持久化
以上配置成功后,发现轮询不生效了,即使持久化时间即上述配置文件的persistence_timeout
设置得很短,也无法在此时间后切换rs。百思不得其解,遂发现该行为还和lvs_timeouts
控制的时间有关。如果是DR模式下使用curl直接访问上述配置的vip,在主调度器使用ipvsadm -lnc
查询lvs连接表时,一共有两种条目,则分别为ASSURED
和ESTABLISHED
先下结论:
对于同一个客户端(相同ip),当这个表中还有它的条目时,那么使用该ip的客户端下次将还是连接相同的rs
persistence_timeout设定的时间对应lvs表的条目是ASSURED
tcp连接建立成功后对应的条目是ESTABLISHED
:
lvs_timeouts默认值是tcp 900 tcpfin 120 udp 300
持久化选项开启后,lvs将根据这个表来定义持久化行为。对于同一客户端(用ip区分不同客户端),当这个表对应的条目全部消失了,才会根据负载均衡指定的方式为这个客户端分配下一台rs
一般来说,persistence_time
设定的值要比lvs_timeouts的值要大(如果这个值小于lvs_timeouts那它根本没有意义),否则最后一个连接条目消失前,它会在超时的时候重新刷新倒计时为一分钟
也就是说如果persistence_time
小于lvs_timeouts时,它最长持续时间是表中最后一个连接条目消失后加一分钟
以ip区分不同客户端
每次有新连接刷新或建立时,
persistence_time
将同步刷新lvs_timemouts控制每个连接条目保持的时间,条目保持的时间和persistence_time共同控制客户端保持访问同一台rs
例子
这里有一个超短的lvs_timeouts
和一个比它更短persistence_time
:
建立连接的条目消失后,理应更早一秒消失的persistence_time
居然带着更长的时间回来了:
结论
持久化不但需要看持久化时间(persistence_time),更要看lvs连接条目的保持时间(lvs_timeouts)。真是人不可貌相
本帖参考:
lvs 两个timeout解析
- 标题: keepalived控制lvs与实现持久化
- 作者: 7cmb
- 创建于 : 2024-02-21 22:41:35
- 更新于 : 2024-10-12 23:07:35
- 链接: https://7cmb.com/keepalived控制lvs与实现持久化/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。