负载均衡集群介绍
● 主流开源软件LVS、keepalived、haproxy、nginx等实现
● 其中LVS属于4层(网络OSI 7层模型),nginx属于7层,haproxy既可以认为是4层,也可以当做7层使用
● lvs这种4层的负载均衡是可以分发除80外的其他端口通信的,比如MySQL的,而nginx仅仅支持http,https,mail,haproxy也支持MySQL这种
● 相比较来说,LVS这种4层的更稳定,能承受更多的请求,而nginx这种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)
LVS NAT模式 //分发量不能太大
● 这种模式借助iptables的nat表来实现;
● 用户的请求到分发器后,通过预设的iptables规则,把请求的数据包转发到后端的rs上去;
● rs需要设定网关为分发器的内网ip;
● 用户请求的数据包和返回给用户的数据包全部经过分发器,所以分发器成为瓶颈;
● 在nat模式中,只需要分发器有公网ip即可,所以比较节省公网ip资源;
LVS IP Tunnel模式
● 这种模式,需要有一个公共的IP配置在分发器和所有rs上,我们把它叫做vip;
● 客户端请求的目标IP为vip,分发器接收到请求数据包后,会对数据包做一个加工,会把目标IP改为rs的IP,这样数据包就到了rs上;
● rs接收数据包后,会还原原始数据包,这样目标IP为vip,因为所有rs上配置了这个vip,所以它会认为是它自己;
LVS DR模式
● 这种模式,也需要有一个公共的IP配置在分发器和所有rs上,也就是vip
● 和IP Tunnel不同的是,它会把数据包的MAC地址修改为rs的MAC地址
● rs接收数据包后,会还原原始数据包,这样目标IP为vip,因为所有rs上配置了这个vip,所以它会认为是它自己
LVS的调度算法
调度器吧客户端发来的请求均衡地分发给后端的真实服务器,这个是依靠预先设定好的调度算法实现的,在LVS中支持的调度算法主要有一下八种:
1. 轮询 Round-Robin rr (重点)
非常简单的一种高度算法,就是按顺序把请求依次发送给后端的服务器,它不管后端服务器的处理速度和响应时间怎样。当后端服务器性能不一致时,用这种调度算法就不合适过了。
2. 加权轮询 Weight Round-Robin wrr (重点)
比第一种算法多了一个权重的设置,权重越高的服务器被分配到的请求就越多,这样后端服务器被分配到的请求就越多,这样后端服务器性能不一致时,就可以给配置低的服务器较小的权重。
3. 最小连接 Least-Connection lc (重点)
这种算法会根据各真实服务器上的连接数来决定把新的请求分配给谁,连接数少说明服务器是空闲的,这样把新的请求分配到空闲服务器上才更加合理。
4. 加权最小连接 Weight Least-Connection wlc (重点)
在最小连接高度的基础上再增加一个权重设置,这样就可以人为地去控制哪些服务上多分配请求,哪些少分配请求。
5. 基于局部性的最小连接 Locality-Based Least Connections lblc
这种算法简称LBLC,是针对请求报文的目标IP地址的负载均衡调度,目前主要用于Cache集群系统,因为在Cache集群客户请求报文的目标IP地址是变化的。算法的设计目标是在服务器的负载基本平衡的情况下,将相同目标IP地址的请求调度到同一台服务器,来提高各台服务器的访问局部性和主存Cache命中率。
6. 带复制的基于局部性最小连接 Locality-Based Least Connections with Replication lblcr
该算法简称LBLCR,也是针对目标IP地址的负载均衡,它与LBLC算法的不同之处是:它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法是维护从一个目标IP地址到一台服务器的映射。LBLCR算法先根据请求的目标IP地址找出该目标IP地址对应的服务器组,按“最小连接”原则从该服务器组中选出一台服务器,若服务器没有超载,则将请求发送到该服务器;若服务器超载,则按“最小连接”原则从整个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
7. 目标地址散列调度 Destination Hashing dh
该算法也是针对目标IP地址的负载均衡的,但它是一种静态映射算法,通过一个散列(hash)函数将一个目标IP地址映射到一台服务器。目标地址散列调度算法先根据请求的目标IP地址,作为散列键(hash key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
8. 源地址散列调度 Source Hashing sh
该算法正好与目标地址散列调度算法相反,它根据请求的源IP地址,作为散列键从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。它的算法流程与目标地址散列调度算法的基本相似,只不过将请求的目标IP地址换成请求的源IP地址。
LVS NAT模式搭建(上)
1、准备工作
准备三台机器
分发器,也叫调度器(简写为dir) 内网:192.168.5.7,外网:192.168.106.128(vmware仅主机模式)
真实服务器rs1 内网:192.168.5.8,
真实服务器 rs2内网:192.168.5.9,
设置网关为5.7
三台机器上都执行执行
#systemctl stop firewalld;
# systemctl disable firewalldRemoved symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
Removed symlink /etc/systemd/system/basic.target.wants/firewalld.service.
如果服务不存在则安装
# yum install -y iptables-services
# systemctl start iptables
# iptables -F;
# service iptables save
2、配置分发器dir
安装LVS核心工具ipvsdam
#yum install -y ipvsdam
在dir上编写脚本,vim /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.5.0/24 -j MASQUERADE # director设置ipvsadm IPVSADM='/usr/sbin/ipvsadm' $IPVSADM -C $IPVSADM -A -t 192.168.106.128:80 -s wlc -p 3 $IPVSADM -a -t 192.168.106.128:80 -r 192.168.5.6:80 -m -w 1 $IPVSADM -a -t 192.168.106.128:80 -r 192.168.5.9:80 -m -w 1
执行该脚本
[root@ahao01 ~]# sh /usr/local/sbin/lvs_nat.sh //执行该脚本
3、测试
两台rs上都安装nginx
[root@ahao02 ~]# yum install -y epel-release
[root@ahao02 ~]# yum install nginx -y
设置两台rs的主页,做一个区分,也就是说直接curl两台rs的ip时,得到不同的结果
# vi /usr/share/nginx/html/index.html //编辑yum安装的nginx默认站点文件
测试两台小机请求出来的结果
[root@ahao02 ~]# curl 192.168.5.6ahao02
[root@ahao03 ~]# curl 192.168.5.9ahao03
监测是否有数据
[root@ahao01 ~]# ipvsadm -ln
访问外网ip192.168.106.128测试
[root@ahao01 ~]# curl 192.168.106.128
ahao02
[root@ahao01 ~]# curl 192.168.106.128
ahao03
[root@ahao01 ~]# curl 192.168.106.128
ahao02
[root@ahao01 ~]# curl 192.168.106.128
ahao03
[root@ahao01 ~]# curl 192.168.106.128
ahao02
ps:此处你要开启rr均衡模式才可以出现这种效果哦。