18.6 负载均衡集群介绍

  • 主流开源软件LVS、keepalived、haproxy、nginx等.
  • 其中LVS属于4层(网络OSI 7层模型),nginx属于7层,haproxy既可以认为是4层,也可以当做7层使用.
  • keepalived的负载均衡功能其实就是lvs.
  • lvs这种4层的负载均衡是可以分发除80外的其他端口通信的,比如MySQL的,而nginx仅仅支持http,https,mail,haproxy也支持MySQL这种.
  • 相比较来说,LVS这种4层的更稳定,能承受更多的请求(并发量),而nginx这种7层的更加灵活,能实现更多的个性化需求.

18.7 LVS介绍

  • LVS(Linux Virtual Server)是由国人章文嵩开发.
  • 流行度不亚于apache的httpd,基于TCP/IP做的路由和转发,稳定性和效率很高.
  • LVS最新版本基于Linux内核2.6,有好多年不更新了.
  • LVS有三种常见的模式:NAT、DR、IP Tunnel.
  • LVS架构中有一个核心角色叫做分发器(Load balance),它用来分发用户的请求,还有诸多处理用户请求的服务器(Real Server,简称rs).

** (1) LVS NAT模式**

  • 这种模式借助iptables的nat表来实现.

  • 用户的请求到分发器后,通过预设的iptables规则,把请求的数据包转发到后端的rs上去.rs需要设定网关为分发器的内网ip.

  • 用户请求的数据包和返回给用户的数据包全部经过分发器,所以分发器成为瓶颈.在nat模式中,只需要分发器有公网ip即可,所以比较节省公网ip资源.

  • (2) LVS IP Tunnel模式

  • 这种模式,需要有一个公共的IP配置在分发器和所有rs上,我们把它叫做vip.客户端请求的目标IP为vip,分发器接收到请求数据包后,会对数据包做一个加工,会把目标IP改为rs的IP,这样数据包就到了rs上.rs接收数据包后,会还原原始数据包,这样目标IP为vip,因为所有rs上配置了这个vip,所以它会认为是它自己.

  • (3) LVS DR模式

  • 这种模式,也需要有一个公共的IP配置在分发器和所有rs上,也就是vip.

  • 和IP Tunnel不同的是,它会把数据包的MAC地址修改为rs的MAC地址.

  • rs接收数据包后,会还原原始数据包,这样目标IP为vip,因为所有rs上配置了这个vip,所以它会认为是它自己.

18.8 LVS调度算法

  • 以下4种比较重要: 轮询 Round-Robin rr 加权轮询 Weight Round-Robin wrr 最小连接 Least-Connection lc 加权最小连接 Weight Least-Connection wlc

  • 以下4种要了解: 基于局部性的最小连接 Locality-Based Least Connections lblc 带复制的基于局部性最小连接 Locality-Based Least Connections with Replication lblcr 目标地址散列调度 Destination Hashing dh 源地址散列调度 Source Hashing sh

18.9/18.10 LVS NAT模式搭建

  • (1) 准备工作:

  • 准备三台虚拟机,分别是: 分发器,也叫调度器(简写为dir) 内网:192.168.168.129,外网:192.168.161.130(vmware仅主机模式) 真实服务器1(rs1) 内网:192.168.168.130,设置网关为192.168.168.129 真实服务器2(rs2) 内网:192.168.168.131,设置网关为192.168.168.129

  • 三台机器上关闭防火墙和selinux: 关闭防火墙(以保证实验能成功): systemctl stop firewalld systemctl disable firewalld

  • 安装iptables-services yum install -y iptables-services

  • 启动iptables-services systemctl start iptables systemctl enable iptables

  • 清空规则以不影响后续实验: iptables -F service iptables save

  • 关闭selinux: setenforce 0 vi /etc/selinux/config 设置如下(永久关闭selinux): SELINUX=disabled

  • (2)安装ipvsadm和配置实现LVS NAT模式的脚本

  • 在dir上安装ipvsadm(这是实现lvs的关键工具) yum install -y ipvsadm

  • 在dir上编写脚本(LVS NAT模式以脚本形式来实现,方便维护): vi /usr/local/sbin/lvs_nat.sh

  • 增加内容如下: ------------------------------------------------------------------------------------------------------- #! /bin/bash # director 服务器上开启路由转发功能 echo 1 > /proc/sys/net/ipv4/ip_forward # 关闭icmp的重定向 echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects # 注意区分网卡名字,此处两个网卡分别为ens33和ens37 echo 0 > /proc/sys/net/ipv4/conf/ens33/send_redirects echo 0 > /proc/sys/net/ipv4/conf/ens37/send_redirects # director 设置nat防火墙 iptables -t nat -F #清空防火墙规则 iptables -t nat -X #清空链 # 增加防火墙规则,让同网段的内网能上网 iptables -t nat -A POSTROUTING -s 192.168.168.0/24 -j MASQUERADE # director设置ipvsadm IPVSADM='/usr/sbin/ipvsadm' #定义变量IPVSADM方便之后操作 $IPVSADM -C #清空规则 # 增加大规则(-A), -t表示是lvs nat模式;-s表示算法(有wlc,lc,wrr,rr几种);-p表示持续时间(该时间内让访问指向同一个rs,以确保用户session不变,保证用户体验) $IPVSADM -A -t 192.168.161.130:80 -s lc -p 3 # 增加小规则(-a), -r后跟rs服务器, -m表示NAT模式, -w表示权重. $IPVSADM -a -t 192.168.161.130:80 -r 192.168.168.130:80 -m -w 1 $IPVSADM -a -t 192.168.161.130:80 -r 192.168.168.131:80 -m -w 1 --------------------------------------------------------------------------------------------------------

  • 编辑保存后执行该脚本: sh /usr/local/sbin/lvs_nat.sh 没任何信息输出则表示没出错.

  • (3) NAT模式效果测试

  • 在两台rs上都需要安装nginx

  • 设置两台rs的主页,以做一个区分,也就是说直接curl两台rs的ip时,得到不同的结果

  • 在rs1上执行: echo "test-02" > /usr/share/nginx/html/index.html

  • 在rs2上执行: echo "test-03" > /usr/share/nginx/html/index.html

  • 通过curl或者浏览器里访问192.168.161.130, 多访问几次看结果差异

  • 备注: 为了能更明显看出效果,此处将脚本中的 $IPVSADM -A -t 192.168.161.130:80 -s lc -p 3 修改为: $IPVSADM -A -t 192.168.161.130:80 -s rr 执行脚本后,可看到用curl访问时能分发器能在test-02和test-03切换,达到"负载均衡"之效果(上图).

  • 遇到的问题(---待解决) 测试时发现通过浏览器里访问分发器192.168.161.130不能显示,直接访问两台rs却可以.经检测,防火墙规则已清空,也能ping通分发器, telnet分发器的80端口却失败,具体原因尚不明确.


  • 扩展学习: lvs 三种模式详解
    http://www.it165.net/admin/html/201401/2248.html lvs几种算法 http://www.aminglinux.com/bbs/thread-7407-1-1.html 关于arp_ignore和 arp_announce http://www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html lvs原理相关的
    http://blog.csdn.net/pi9nc/article/details/23380589