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