一、 keepalived简介
为后端服务器提供健康检查(keepalived)和为负载均衡器提供失败切换(fail over)从某种意义上构成了服务器负载均衡(SLB, server load balance)的 一部分。以LVS(Linux Virtual Server, 可参考项目主页)为代表的软件负载均衡服务器,以高性价比的方式解决了众多企业的需求。 而LVS + keepalived是常见的一种部署方式。
健康检查和失败切换是keepalived(可参考项目主页)的两大核心功能。 所谓的健康检查, 就是采用tcp三次握手, icmp请求, http请求, udp echo请求等方式对负载均衡器后面的实际的服务器(通常是承载真实业务的服务器)进行保活;而失败切换主要是应用于配置了主备模式的负载均衡器, 利用VRRP(虚拟路由冗余协议, 可参考RFC文档) 维持主备负载均衡器的心跳, 当主负载均衡器出现问题时, 由备负载均衡器承载对应的业务, 从而在最大限度上减少流量损失, 并提供服务的稳定性。
LVS和keepalived都是开源的项目, 这意味着若有自己的个性化需求的话,可以基于两者进行二次开发, 从而以高性价比的方式解决相应的负载均衡的需求。
二、 keepalived的配置文件介绍
下面介绍的是keepalived的配置文件的格式, 以便为接下来从代码级别上分析配置文件的解析过程做准备。可以从源码的keepalived\etc\keepalived/keepalived.conf找到下面摘录的一段配置文件内容。 本文关注的是不是配置文件各选项的内容的含义, 而是该配置文件的特点和如何解析这样关键字分层的配置文件。
! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc … … } notification_email_from Alexandre.Cassen@firewall.loc } vrrp_instance VI_1 { state MASTER … … authentication { auth_type PASS … … }
}
virtual_server 192.168.200.100 443 {
delay_loop 6 … … real_server 192.168.201.100 443 { weight 1 SSL_GET { url { path / digest ff20ad2481f97b1754ef3e12ecd3a9cc } connect_timeout 3 … … } } } #include newfile include filename.conf
如上所示, keepalived采用关键字分层的方式来组织配置文件, 在上面摘取的配置文件片段中,共有4层关键字,位于第零层的关键字有:global_defs, vrrp_instance, vritual_server等, 位于第一层的关键字有:notification_email, state, delay_loop, real_server等, 位于第二层的关键字有weight, SSL_GET, 位于第三层的关键字有url等, 位于第四层的关键字有path, digest等。若把位于同一层的关键字组织成一个列表(或者叫向量vector), 则该列表具有这样的特性:它的每一个元素都是一个关键字, 而该关键字可能指向下一层的关键字列表,如此反复。
keepalived的配置文件还支持include的用法, 可以在当前配置文件中用include newconf的方式包含下一个配置文件, 且下一个配置文件里面也可以用include包含下下一个配置文件。而且一个配置文件里面也可以用多个include语句包含多个配置文件进行。此外, keepalived还支持在传递配置文件名字时, 采用包含正则表达式的记法, 如:你可以传递一个”*.conf”作为配置文件的名字, 对应的是解析当前目录下所有以.conf结尾的文件。
三、如何解析配置文件
如上所述, keepalived在配置文件解析方面拥有非常灵活的方式, 采用关键字分层(每层的关键字数量不限,且关键字的层次也不限制)的方法进行组织一个配置文件, 且支持include语句和正则表达式记法的配置文件名, 要怎么设计才可以实现这样的功能? keepalived是用C语言实现的, 不像python等拥有很多封装好的库可以使用。 具体的解析过程在接下来的文章里面会进行具体地分析。