注意事项
- 以三个线程来介绍
- 每个线程忽略一层循环,原因是过多嵌套,不易学习
- 流程图与keepalived代码不完全一致
流程图
PlantUML
代码
@startuml keepalived
title keepalived & vrrp
start
fork
while (接收到包 ?) is (接收到包)
if (包的优先级 > 自身优先级 ?) then(包的优先级高)
if (自己状态是主 ?) then (自身是Master)
:自身状态从Master从切换成Backup;
:自身停止发送vrrp包;
else (非Master)
:保持自身状态,不做处理;
endif
else if (包的优先级 < 自身优先级 ?) then (包优先级小)
:ignore;
else (包的优先级相等)
if (发包主机IP > 本机IP ?) then(发包IP高)
if (自己状态是主 ?) then (自身是Master)
:自身状态从Master从切换成Backup;
:自身停止发送vrrp包;
else (自身是Backup)
:保持自身状态,不做处理;
endif
else (发包IP低)
:ignore;
endif
endif
endwhile (未接收到包)
if (自身是Backup ?) then (Backup)
if (未收到包的时间 > T1) then (> T1)
:将自身状态置为Master;
else (<= T1)
:ignore;
endif
else (Master)
:ignore;
endif
detach
fork again
if (自身是Master ?) then (是Master)
:发送vrrp包;
else (不是Master)
:ignore;
endif
detach
fork again
if (检查脚本返回值为0 ?) then (检查脚本执行成功)
if (自身是Master ?) then (Master)
:ignore;
elseif (自身是FAULT ?) then (FAULT)
:自身状态改为BACKUP;
else (BACKUP)
:自身状态为BACKUP;
endif
detach
else (检查脚本执行失败)
if (自身是Master ?) then (Master)
:自身状态改为FAULT;
:发送优先级为0的通告;
elseif (自身是FAULT ?) then (FAULT)
:自身状态为FAULT;
else (BACKUP)
:自身状态改为FAULT;
endif
endif
detach
endfork
end
@enduml