讲讲Keepalived和LVS这两个家伙的那点事

  在分布式系统中我们经常要对后端服务做成高可用、可负载均衡的这种场景。应对这种场景的解决方案也是很多的,而最近的一个场景我就使用了Keepalived和LVS去做这件事,在使用Keepalived的过程中难免要梳理一些基础的网络知识,才能正确的理解keepalived的工作原理,于是乎就有了这篇随笔记录下当下自己的理解以及整理这个过程参考的一些文章。

一、测试环境:

  操作系统是Debian 8.9、两台机器:A机器(10.1.12.49)、B机器(10.1.12.61)、虚拟IP(10.1.12.50)。Keepalived和LVS将会部署在这2台机器上

二、预热知识

  在配置Keepalived的使用需要配置两个系统参数arp_ignore和arp_announce参数,这2个参数都是和ARP协议有关的。ARP协议是工作在数据链路层的,在一个同一局域网中的一台主机要和另一台主机进行直接通信,必须要知道目标主机的MAC地址,而我们的上层应用只知道通讯对方的IP地址,这个时候要做的一件事件就是把IP地址转换成MAC,通讯双方才能相关通讯,这就是ARP协议要做的事情,概括就是A知道B的IP,想和B通讯,不好意思,你要先有B的MAC地址,于是A问局域网所有机器,谁的IP是10.1.12.61?这时候B看到了广播的IP事自己的IP,于是回复自己MAC地址,最终A就有了B的IP和MAC地址对应关系,就可以开始通讯了。

//为了直观认识,我们做个小实验

1.首先在A机器上清除B机器MAC地址 arp -d 10.1.12.61 2.然后在A机器ping 10.1.12.61 3.在B机器通过抓包tcpdump -nq -s 0 -vvv -A -i eth0 | grep 10.1.12.49,看到如下结果 //A在找10.1.12.61的MAC地址 15:50:36.342844 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.1.12.49 tell 10.1.12.61, length 28 //B把自己的MAC地址回复给A 15:50:36.342921 ARP, Ethernet (len 6), IPv4 (len 4), Reply 10.1.12.49 is-at 50:9a:4c:6b:3e:08, length 46 //开始通讯 10.1.12.61 > 10.1.12.49: ICMP echo reply, id 20614, seq 1, length 64 10.1.12.49 > 10.1.12.61: ICMP echo request, id 20614, seq 2, length 64     

三、Keepalived

  Keepalived是基于VRRP协议实现的一个工具,它主要作用就是用于做热备的,也就是说当主设备出现问题后,能自动使用备设备,就相当与一个主从关系。当使用Keepalived的时候我们需要配置一个虚拟IP,简称VIP。开始了Keepalive的机器会首先会通过一个选举的过程(也可手动配置)选举出一个机器为主设备,其它机器就会自动成为从设备,并且主设备会自动绑定VIP。之后主设置将会通过组播方式对所有从设备发送VRRP数据包,该组播默认IP是244.0.0.8/8,以此表明自己运作正常。通过这样的机制如果主设备挂掉后,从设备将收不到VRRP数据包,就认为主设备不可用了,于是所有从设备又会开始一个选举过程,选出新的主设备并把VIP漂移到这台机器上,从而实现了热备的功能。 

四、LVS

  LVS是Linux Virtual Server的简称,是一个软实现的负载均衡器,从Linux2.4内核之后LVS就完全内置在里面了,也就是说我们不需要安装,便可以直接使用LVS实现高性能的服务器集群功能。使用LVS时候通常由这三个部分共同组成我们的服务器集群(注意我这里讲的事服务器集群不是单只LVS噢):LoadBalancer、Real Server、Shared Storage,按我理解通俗解释。

  LoadBalancer:作负载均衡器的机器,通过一定的调度算法把请求分发到后端的真实服务器(Real Server)

  Real Server:真正处理业务的机器

  Shared Storage:可以理解存储数据源机器,因为分布式系统往往需要共享数据的,这些数据就可以存在这些机器中

            

  通过上面介绍大概就清楚了如何用LVS去搭建我们高可用、负载均衡的系统的。这里我们的重点当然是LoadBalancer这里,也就是我们使用LVS做负载均衡器的机器上。在说白点就是我们的关注点应该是LVS的工作模式和负载均衡算法。关于LVS工作模式和负载均衡算法我下面会给出一些参考链接,篇幅和能力有限我就不累赘了。

五、Keepalived和LVS实践

  既然Keepalived可以用来做热备、Linux又内置了LVS这么一个功能强大的软件用于做服务器集群,Keepalived的配置文件也提供了对LVS工作模式和调度算法的配置,两者结合便可成为一个高可用、具备负载能力的解决方案了。

                    

keepalived相关配置(每个配置的具体含义可参考我的参考资料)

 
 

1、安装KeepAlived

 
 

  apt-get install keepalived

 
 

2、配置配置文件(A、B机器Keepalived配置一样即可示例配置#虚拟ip:10.1.12.50 346#负载server 1: 10.1.12.190 346#负载server 2:10.1.12.170 346! Configuration File for keepalived

vrrp_instance VI_1 { interface eth0 virtual_router_id 50  //这个参数用于设置KeepAlived选举组标识,A,B机器一定要一样 nopreempt priority 100 advert_int 1 virtual_ipaddress { 10.1.12.50 } } 
//以下就是配置LVS配置了,工作模式以及调度算法等等 virtual_server
10.1.12.50 346 { delay_loop 6 lb_algo rr lb_kind DR persistence_timeout 50 protocol TCP real_server 10.1.12.190 346 { weight 1 TCP_CHECK { connect_port 346 connect_time 3 nb_get_retry 3 } } real_server 10.1.12.170 346 { weight 1 TCP_CHECK { connect_port 346 connect_time 3 nb_get_retry 3 } } }

3. 相关命令

  启动keepalived
  keepalived -d -D -S 0 -f /etc/keepalived/keepalived.conf
  停止
  killall keepalived
  查看日志
  tail -f /var/log/message
  查看负载均衡信息
  ipvsadm -ln

 

Real Server配置

  配置完A、B机器的keepalived之后,我们基本就具备了Keepalived+LVS的能力的。但是还需要对我们后端真实处理业务的Real Server机器做一些配置,否则是用不起来的。首先要为所有的Real Server都配置VIP,不然Real Server收到A或B机器转发过来的数据,看到目的IP不是自己的IP是不会对数据包做处理的,这里我们把VIP配置到lo这里回环地址上去。

ip addr add 10.1.12.50/32 dev lo

  之后我们还要配置随笔开头所讲的2个内核参数。arp_ignore用于配置机器收到arp请求时的响应策略,由于我们Real Server在lo回环地址上也绑定了VIP,通过设置arp_ignore=1,Real Server收到VIP的arp请求因为此时VIP是绑定在lo上,因此就不会作出响应,保证只有Keepalived维护的主设备才去响应这个arp请求,否则大家都把自己MAC响应arp请求,那就乱大套了。而arp_announce参数用于设置当Real Server需要发起arp请求时候,arp包如何选择源IP的,通过设置arp_announce=2的时候,就可以保证Real Server在发起arp请求时就不会把lo的VIP地址作为arp数据包的源IP发出去,误导其它机器了。

echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
将以上命令写入/etc/rc.local保证机器重启生效

启动KeepAlived

  我们可以从Keepalived日志中可以看出选举结果,B机器成为了主设备,此时VIP会自动飘逸到B机器中,另外我们在A机器通过抓包就可以发现从B机器发过来VRRP数据包了。

     

     

  至此,这个Keepalived+LVS就完成了,访问VIP:346端口的请求就会经由LVS负载到后端的RealServer上,通过ipvsadm -ln即可查看目前LVS负载情况和连接数。

六、参考资料

  Linux负载均衡软件LVS之一                        http://ixdba.blog.51cto.com/2895551/552947
  Keepalived原理与实战精讲--VRRP协议       https://blog.csdn.net/u010391029/article/details/48311699
  LVS负载均衡之session解决方案-持久连接    http://blog.51cto.com/minux/1744761
  LVS 工作模式以及工作原理                         https://blog.csdn.net/caoshuming_500/article/details/8291940
  Linux内核参数之arp_ignore和arp_announce  https://www.jianshu.com/p/734640384fda

  

猜你喜欢

转载自www.cnblogs.com/yipaihushuo/p/9247622.html