当前位置: > Linux集群 > 负载均衡SLB >

LVS+Keepalived实现高可用负载均衡分发

时间:2016-06-09 23:31来源:linux.it.net.cn 作者:IT

一、概念理解

负载均衡

集群即将相同服务部署在多台服务器上构成一个集群整体对外提供服务。在应用中,内容服务器之前总会有一台负载均衡服务器,负载均衡器的任务就是作为web服务器的流量入口,将客户端的请求分发到后端集群真实服务器,实现客户端到服务端的透明转发。客户端不需要关心真正提供服务的是哪台机器,它面对的是一个集群,集群资源可根据业务量伸缩。
lvs
LVS+集群采用IP负载均衡技术和基于内容请求分发技术。调度分发器具有很好的吞吐率,将请求根据不同算法转发到不同的服务器上执行,且自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。

LVS集群由以下几个部分构成

最前端的负载均衡层,用load balancer表示
中间的服务器集群层,用server array表示
最底端的数据共享存储层,用shared storage表示
在用户看来,所有内部应用的是透明的,用户只是在使用一个虚拟服务器提供的高性能服务。

LVS负载均衡机制

LVS工作在OSI第四层,即传输层。相对于工作在其他高层的负载均衡工具例如nginx,效率更高。

LVS模式

DR模式(Direct routing):直接路由模式。一般用此模式。
NAT模式(Network Address Translaton): NAT转换,所有流量进出必须进过调度器,流量大会形成瓶颈。
TUN模式(IP Tunneling): 应用于远程,尤其是外网等

分发算法

1:轮询算法(RR)就是按依次循环的方式将请求调度到不同的服务器上。
2:加权轮询算法(WRR)主要是对轮询算法的一种优化与补充,LVS会考虑每台服务器的性能,并给每台服务器添加一个权值,权值越高的服务器,处理的请求越多。
3:最小连接调度算法(LC)将把请求调度到连续数量最小的服务器上,
4:加权最小连接算法(WLC)则是给每台服务器一个权值,调度器会尽可能保持服务器连接数量与权值之间的平衡
5:基于局部性的最少连接调度算法(lblc)是请求数据包的目标IP地址的一种调度算法,该算法先根据请求的目标IP地址寻找最近的该目标IP地址所有使用的服务器,如果这台服务器依然可用,并且用能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其他可行的服务器。
6:带复杂的基于局部性最少的连接算法(lblcr)激励的不是一个目标IP与一台服务器之间的连接记录,他会维护一个目标IP到一组服务器之间的映射关系,防止单点服务器负责过高
7:目标地址散列调度算法(DH)也是根据目标IP地址通过散列函数将目标IP与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标IP的请求会固定发给该服务器。
8:源地址散列调度算法(SH)与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源

二、部署策略

准备部分

虚拟机四台:负载均衡分发机器2台主备,后端真实服务机器2台轮询。
VIP:192.168.1.10
虚拟机系统均为:CentOS6.7(final)
lvs-master:192.168.1.33
lvs-slave:192.168.1.34
service01:192.168.1.38
service02:192.168.1.39

以下针对所有服务器设置:

绑定静态地址:/etc/sysconfig/network-scripts/ifcfg-eth0 用static地址
设置主机名:修改配置文件中的额主机名,vim /etc/sysconfig/network 永久修改主机名,临时可用hostname 主机名
IP地址和主机名的绑定:vim /etc/hosts 增加如

  1. 192.168.1.33 lvs-master
  2. 192.168.1.34 lvs-slave
  3. 192.168.1.38 service01
  4. 192.168.1.39 service02

保存后退出,验证 ping lvs-master或者任意一个主机名
关闭防火墙 service iptables stop 关闭开机启动chkconfig iptables off,在实际生产环境中访问一般有单独的前端防火墙。

配置服务提供端

以下不必在负载均衡服务器上进行。本次测试为web服务器,所以安装nginx测试
yum默认安装的nginx版本较低,为了安装最新的稳定版,我们设置一下安装源
在/etc/yum.repos.d/下建立一个nginx.repo

  1. vim /etc/yum.repos.d/nginx.repo
  2. 添加以下内容
  3. [nginx]
  4. name=nginx repo
  5. baseurl=http://nginx.org/packages/centos/6/$basearch/
  6. gpgcheck=0
  7. enabled=1

然后执行安装,当前稳定版本为1.8.0

  1. yum install -y nginx

两台提供服务的机器都安装一下。访问测试
为了区分测试结果,我们把默认页面的内容修改一下。
222

编辑脚本文件,配置WEB服务器loIP
vim /etc/init.d/realserver

  1. SNS_VIP=192.168.1.10
  2. /etc/rc.d/init.d/functions
  3. case "$1" in
  4. start)
  5.        ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
  6.        /sbin/route add -host $SNS_VIP dev lo:0
  7.        echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
  8.        echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
  9.        echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
  10.        echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
  11.        sysctl -p >/dev/null 2>&1
  12.        echo "RealServer Start OK"
  13.        ;;
  14. stop)
  15.        ifconfig lo:0 down
  16.        route del $SNS_VIP >/dev/null 2>&1
  17.        echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
  18.        echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
  19.        echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
  20.        echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
  21.        echo "RealServer Stoped"
  22.        ;;
  23. *)
  24.        echo "Usage: $0 {start|stop}"
  25.        exit 1
  26. esac
  27. exit 0

添加执行权限并开启

  1. chmod +x /etc/init.d/lvs
  2. chmod +x /etc/rc.d/init.d/functions
  3. service realserver start

配置负载均衡服务器

安装ipvsadm和keepalived软件,本次测试使用yum快速安装。

  1. yum install ipvsadm keepalived
  2. #编辑配置文件,测试使用rr轮询算法以便更好看出效果
  3.  
  4. global_defs {
  5.    notification_email {
  6.     xxx@163.com
  7.    }
  8.    notification_email_from sns-lvs@qq.com
  9.    smtp_server smtp.qq.com
  10.    smtp_connect_timeout 30
  11.    router_id LVS_DEVEL
  12. }
  13.  
  14. vrrp_instance VI_1 {
  15.     state BACKUP
  16.     interface eth0
  17.     virtual_router_id 51
  18.     priority 90
  19.     advert_int 1
  20.     authentication {
  21.         auth_type PASS
  22.         auth_pass 1111
  23.     }
  24.     virtual_ipaddress {
  25.         192.168.1.10
  26.     }
  27. }
  28.  
  29. virtual_server 192.168.31.10 80 {
  30.     delay_loop 6
  31.     lb_algo wlc
  32.     lb_kind DR
  33.     nat_mask 255.255.255.0
  34.     persistence_timeout 60
  35.     protocol TCP
  36.  
  37.     real_server 192.168.1.38 80 {
  38.         weight 3
  39.     TCP_CHECK {
  40.     connect_timeout 10         
  41.         nb_get_retry 3  
  42.         delay_before_retry 3  
  43.         connect_port 80
  44.     }
  45.     }
  46.     real_server 192.168.1.39 80 {
  47.         weight 3
  48.         TCP_CHECK {
  49.         connect_timeout 10
  50.         nb_get_retry 3
  51.         delay_before_retry 3
  52.         connect_port 80
  53.         }
  54.     }
  55. }

从服务器只要改二个地方就行,priority的权重调小一点,state改成BACKUP。

开启keepalived服务 并设置开机启动 service keepalived start && chkconfig keepalived on。

所有配置已经完毕。可以通过浏览器进行访问,但是发现一个问题,浏览器缓存会影响效果。我们可以使用curl来测试

  1. curl 192.168.1.10

不出意外可以看到均衡轮询,每个页面交替显示。

问题总结

lvs仅依靠/etc/keepalived/keepalived.conf配置,ipvsadm无需任何设置
如果出现问题,请查看/var/log/message日志,keepalived日志包含在其中。
虚拟iP能ping通,但是无法访问站点,可以检查ipvsadm是否正常工作。内核版本是否支持。
使用命令 ipvsadm -ln 如果无任何输出则分发有问题,检查一下配置文件是否有问题。
如果有显示但是无法连接,请检查服务提供端是否正确绑定了VIP,分发服务例如nginx是否正常工作




(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容