Lvs是由国防大学章文嵩博士发起的一个开源项目,用来实现服务器之间的负载均衡。全名为linux virtual server
软件包围ipvsadm.tar.gz 随着企业的规模扩大,服务器的访问越来越大。这时候只有两个方案解决服务器的负载能力。
1: 向上扩展服务器的硬件配置。购买昂贵的机器来承担日益繁重的性能要求。
2: 增加服务器的数量,以集群的方式来提高服务器的性能。
第二种方式最好的办法就是使用lvs来进行负载均衡。
lvs负载均衡的三种模式: NAT(network add translation), DR(Direct Route) 和TUN模式
第一种模式NAT:这种模式使用地址转换来进行负载均衡,工作在网络层。所有的请求都经过lvs来进行地址转换,realserver的网关指向lvs服务器,所有的应答由lvs来回送。这样导致lvs的压力非常大,在realserver达到十台时会出现网络瓶颈。 所有的realserver和lvs在一个内网中。
第二种模式DR: 这种模式工作在数据链路层,在进行ARP时,只有lvs服务器对其响应。网关将请求送达至lvs服务器,lvs服务器再通过调度算法发送至realserver,在响应请求时,不需要经过Lvs服务器直接响应客户端,这样大大提高了速率和减轻了Lvs服务器的压力。
keepalived是工作在lvs之上的,所谓的工作在之上,是keepalived通过自身的模块通过配置文件调用ipvsadm命令对LVS进行配置,实现负载均衡。keepalived和LVS是完全不是同一个概念,它们是独立互不影响的完成自己的工作的,lvs通过负载均衡实现对服务器的高扩展性,keepalived通过自身的子进程对lvs进行健康检查实现LVS的高可用性(即防止LVS崩溃和,发送主从服务器的健康状态和通知切换主从lvs)。
keepalived有三个进程,VRRP协议子进程,healthcheck子进程和WatchDog父进程。
VRRP协议子进程负责实现VRRP协议及主从之间的通信,healthcheck负责检查LVS和HTTP的健康状态,
WatchDog进程管理两个子进程。Keepalived的模块都相对独立,可以实现不同复杂的功能,其中就有对LVS
进行配置的模块。
keepalived.conf配置文件详解:
global_defs{
router_id 50 用来标示主从的区域
} 进行全局配置。
vrrp_instance vrrp_name {
state MASTER 表示主服务器
interface eth0 在eth0监控
virtual_router_id 50 区域标示号
priority 50 主从优先级 ,主大于从
advert_int 2 主从互相探测是否工作时间的间隔
authentication{} 主从互相验证配置
virtual_server{
10.0.0.113 配置lvs的VIP(虚拟IP)
}
}用来对lvs主从服务器进行配置的区域,使用vrrp组播方式
virtual_server 10.0.0.114 3 80 {
lb_algo rr 使用的调度算法是rr
lb_kind DR 使用的负载均衡模式为DR模式
persistence_timeout 3 测试realserver存活超时时间间隔为3秒
protocol TCP lvs与realserver之间的通信使用的协议为TCP协议
real_server 10.0.0.2 80{
weight 1 真实服务器调度所占权重
TCP_CHECK{
connect_timeout 3 连接超时时间
connect_port 80
nb_get_retry 3
}
} 配置realserver
} 配置对应的虚拟IP服务器
查看Linux系统的服务和端口对应的配置文件为 /etc/servers文件
设定系统的umask 使用命令umask 或者在配置文件 /etc/profile中设定。
DR模式详解:
要求: realserver lvs_server 在同一个广播域,并且在同一网段。realserver在回环接口上配置VIP,子网
掩码为255.255.255.255 , LVS_server上配置VIP。客户端访问VIP,网关将请求发送给lvs_server,lvs将目的
mac地址换成某一个real_server的MAC地址,通过调度算法确定realserver.源mac为自己的。此时接受到
请求的realserver由于配置了VIP,不会丢弃该请求,将其接收。然后realserver将回应包直接发送给网关
请求网关的mac,最后将回应包发送给客户端。
注意:要使网关只将请求发送到 lvs_server上而不发送给realserver,解决办法就是 网关发送的对VIP的
MAC地址的请求包只有lvs服务器接收。只有在每台realserver上设定内核参数
sysctl -w net.ipv4.conf.all.arp_ignore=2
取值为0: 表示对于进入接口的arp请求包,不管请求的目的IP与自己系统上的ip是否相同,一律
进行回应,这样就会导致网关上的VIP的mac不是lvs_server的mac,会产生混乱。
取值为1:表示对于进入接口的arp请求包,若请求的目的IP地址和从该网络接口进入的IP地址
相同时才回应,否则不回应。
取值为2:除了满足取值为1的条件,还要arp请求的源IP和该arp进入接口的IP在一个网段!。
注意:当real_server自身发送arp请求时,即对网关请求网关mac时,如何选择自己的源IP地址,这个
值会影响网关的VIP与mac表的对应.如果realserver选择VIP作为arp请求的源IP,则当网关接收到
这个请求,会将原来VIP与lvs的MAC地址改变为realserver的MAC,而导致lvs架构失败,
解决方案: sysctl -w net.ipv4.conf.all.arp_announce=2
取值为 0 :表示用回应包的源IP即VIP作为arp请求的源地址,显然是不行的
取值为 1:表示不是回应包的源IP,若回应包的源IP和该网络端口IP为同一网段,则使用,
否则,使用值为 2的规则
取值为 2: 表示不是用回应包的IP,而由系统来决定。