负载均衡集群介绍、 LVS介绍、 LVS调度算法、 LVS NAT模式搭建
负载均衡集群介绍、 LVS介绍、 LVS调度算法、 LVS NAT模式搭建
Linux_Anna 发表于3个月前
负载均衡集群介绍、 LVS介绍、 LVS调度算法、 LVS NAT模式搭建
  • 发表于 3个月前
  • 阅读 5
  • 收藏 1
  • 点赞 0
  • 评论 0

 负载均衡集群介绍

1.1 负载均衡介绍

  • 主流开源软件有LVS、keepalived、haproxy、nginx等. 前面讲到keepalived是实现高可用,其实keepalived还可以实现负载均衡.
  • 其中LVS属于4层,指的是(网络OSI 7层模型),Nginx属于7层,所以说这两种负载均衡有本质的区别. haproxy 既可以认为是4层,也可以当做是7层使用.
  • keepalived的负载均衡功能其实就是LVS,keepalived负载均衡是内置的。通常有人说keepalived+LVS,实际上仅仅就一个keepalived而已.
  • 至于4层和7层有这样本质的区别,比如LVS这种四层,它可以分发TCP的这种协议,还可以分发除了80端口外的其他端口通信. 如果做MySQL的负载均衡,是可以使用LVS去实现的,Nginx就不支持了. 而Nginx仅仅支持http、https、mail、haproxy(haproxy也支持MySQL负载均衡
  • Nginx 7层有一定的限制,但有更高级的功能,比如说Nginx可以根据目录,一个网站下面可以去访问二级目录&三级目录,可以根据目录去区分后端真正的服务器,那么Nginx可以做到.但是LVS呢就不做到,LVS没有那么智能,它仅仅是一个4层,4层的话是一个TCP IP的一个数据包分发和转发,对于数据包里面有什么域名或者是主机头之类的,它不关心.
  • 相比较来说,LVS 这种4层的更稳定,能承受更多的请求,而Nginx这种7层的更加灵活,能实现更多的个性化需求.

 

 LVS介绍

1.1 LVS介绍

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

1.2 LVS NAT 模式

这种模式借助iptables的nat表来实现,用户的请求到分发器后,通过预设的iptables规则,把请求的数据包转发到后端的Real Server(真正的服务器),这些服务器接收到了请求之后呢,处理用户请求,再吐给Load Balancer(分发器),这个分发器再返回给用户. 那可想而知Load Balancer(分发器)这个角色其实它成为了一种瓶颈,当访问量非常大的时候,Load Balancer(分发器)请求量也非常大,请求量大,那分发器分发出去的请求,等rs处理完再吐回来的请求,分发器将吐回来的结果继续给用户,那Load Balancer(分发器)严重影响了效率.  使用nat模式,请求量不能太大,Real Server(真正的服务器)十来台,超过十台,分发器就会有点力不从心,除非说分发器这个机器配置很高, 使用的是千兆网卡,使用的网线也是千兆网线,这样的话可以大大提升效率. 

NAT模式,用户请过来到Load balance(分发器),分发器分发到后端的rs,rs处理完请求再返回给分发器,其实只是内网通信,实际上只用了一个公网IP配置在Load balance(分发器)上,这样可以节省很多公网IP资源.


1.3 LVS IP Tunnel模式

在我们看来好像是在load balancer 和rs之间建立了虚拟的隧道,我们把它叫做IP Tunnel. 它实现原理上,实际是更改了数据包的IP(目的IP),比如用户请求过来肯定是到load balancer上,load balancer和rs 有一个特殊的配置叫做VIP,也就是load balancer和rs 角色需要配置一个公共的IP,这个公共的IP的目的是为了给用户提供服务的. 用户访问过来,肯定是知道一个公网IP进行通信,通信的时候这个数据包里面就包含了目的IP,数据包到了load balancer上就需要做一个设置,把目的IP做一个更改,更改到具体的rs上,要不然load balancer上的数据包如何到rs上呢?   把目的IP改成rs ,当然每次改的都不一样,它根据自己的算法,有可能这次是rs 1 ,下一次是rs 2. 目的IP 变成rs,那数据包到rs上,rs会解包,肯定会把数据包传输回去,那rs是如何传输回去呢?  因为每个rs都设置了公网IP,可以和用户直接通信,可以通过公网IP将结果返回给客户端,也就不再需要通过load balancer 再返回给用户,那load balancer 就不存在瓶颈,load balancer 只负责把请求分发到各个rs 上去,rs处理完的结果自己返回给客户端.

 


1.4 LVS DR模式

这种模式和前面IP Tunnel模式很像,但DR模式的Director(分发器)和rs 之间有一个Intemal Network(也就是内网). 
和IP Tunnel模式不同是,它会把数据包的MAC地址修改为rs. MAC地址就涉及到ARP的通信了, 若内部两台机器之间通信,它们是需要通过MAC进行通信的, 更改了MAC地址,最终也会把分发器的数据包转移到Real Server上去,转移到Real Server上后,直接把结果返回给客户端上去,对于分发器来讲也是没有瓶颈了. 也就意味需要配置一个VIP在所有的机器上 .

 

 LVS调度算法 

1. LVS常用的调度算法

  • 1.1 轮询:Round-Robin  简称rr
    用户的请求过来,均衡的分发到每个rs上,没有优劣之分,非常均衡的分配过来,就叫做rr算法。
  • 1.2 加权轮询 Weight Round-Robin  简称wrr
    例如其中一个rs想让它多分担一点,因为它配置好,可以对这台机器设置一个高的权重,比方这台机器权重设置为85,其他的设置为60,那么这样的话,85的机器分发的请求数就会多一些。
  • 1.3 最小连接 Least-Connection 简称lc
    请求量少的,或者是服务器上连接上数比较少的服务器,那么就会新的请求分发这台请求量少的服务器上来,请求量少说明这台服务器比较闲,或是处理请求速度快。
  • 1.4 加权最小连接 Weight Least-Connection  简称wlc
    给请求量少的,或者是服务器上连接上数比较少的服务器加权重,那么权重高的这台服务器就会分发请求分发数就会比较多.这台请求量少的服务器上来,请求量少说明这台服务器比较闲,或是处理请求速度快。

2. LVS不太常用的调度算法

  • 2.1 基于局部性的最小连接 Locality-Based Least Connection 简称 lblc
  • 2.2 带复制的基于局部性最小连接 Locality-Based Least Connection with Replication 简称 lblcr
  • 2.3 目标地址散列调度 Destination Hashing  简称dh
  • 2.4 源地址散列调度 Source Hashing  简称sh

 

 LVS NAT模式搭建

1.NAT模式搭建--准备工作

1.1 准备三台机器
      目前有192.168.2.179 和 192.168.2.180,还需再克隆一台,可以在192.168.2.180上克隆一台出来,
      克隆的机器IP地址为192.168.2.181.

      其中一台作为分发器,也叫调度器(简写为dir)
      另外两台就是Real Server,用来处理用户请求的服务器

1.2 设置第1台机器--192.168.2.179

添加一块网卡: 点击虚拟机 -- 设置 -- 添加-- 网络适配器 --添加 -- 仅主机模式 -- 完成
查看网段:点击编辑-- 虚拟网络编辑器 --  仅主机模式 网段是192.168.18.0  -- 设置网卡IP为192.168.18.128 -- Windows上测试一下能否拼通(能拼通说明就可以通信)

1.3 关闭防火墙三台机都要关闭

[root@root-01 ~]# systemctl stop firewalld
[root@root-01 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 5886 packets, 523K bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 4981 packets, 414K bytes)
 pkts bytes target     prot opt in     out     source               destination   

[root@root-02 ~]# systemctl stop firewalld
[root@root-02 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 5886 packets, 523K bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 4981 packets, 414K bytes)
 pkts bytes target     prot opt in     out     source               destination   

[root@root-03 ~]# systemctl stop firewalld
[root@root-03 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 5886 packets, 523K bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 4981 packets, 414K bytes)
 pkts bytes target     prot opt in     out     source               destination   

 

1.4 设置第2台机器-192.168.2.180

说明: 设置网关为分发器的内网IP,若网关不设置分发器的IP,将会无法通信
           一旦设置成分发器的IP,这台机器就无法网上了.

# 原本GATEWAY=192.168.2.1 现在更改为GATEWAY=192.168.2.179

[root@root-02 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eno16777736

TYPE="Ethernet"
BOOTPROTO="static"
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
NAME="eno16777736"
UUID="b82b23b3-06a7-4752-b2e6-05fef87d4917"
DEVICE="eno16777736"
ONBOOT="yes"
IPADDR=192.168.2.180
NETMASK=255.255.255.0
GATEWAY=192.168.2.179
DNS1=119.29.29.29

[root@root-02 ~]# systemctl restart network

 

1.5 设置第3台机器-192.168.2.181

说明: 设置网关为分发器的内网IP,若网关不设置分发器的IP,将会无法通信
           一旦设置成分发器的IP,这台机器就无法网上了.

# 原本GATEWAY=192.168.2.1 现在更改为GATEWAY=192.168.2.179

[root@root-03 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 

TYPE="Ethernet"
BOOTPROTO="static"
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
NAME="ens33"
UUID="b82b23b3-06a7-4752-b2e6-05fef87d4917"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.2.181
NETMASK=255.255.255.0
GATEWAY=192.168.2.179
DNS1=119.29.29.29

[root@root-03 ~]# systemctl restart network


1.6 在分发器上ipvsadm工具

说明:ipvsadm工具是实现LVS的重要工具,若没有这个工具是无法实现LVS的功能. 
          ipvsadm工具只需要在分发器上安装即可.

[root@root-01 ~]# yum install -y ipvsadm


1.7 在分发器上写一个执行脚本

[root@root-01 ~]# 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
# 注意区分网卡名字
echo 0 > /proc/sys/net/ipv4/conf/eno16777736/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.2.0/24 -j MASQUERADE
# director设置ipvsadm
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t 192.168.18.128:80 -s rr
$IPVSADM -a -t 192.168.18.128:80 -r 192.168.2.180:80 -m -w 1
$IPVSADM -a -t 192.168.18.128:80 -r 192.168.2.181:80 -m -w 1


注:
   echo 1 > /proc/sys/net/ipv4/ip_forward -- 更改内核参数,实现内核转发

   iptables -t nat -A POSTROUTING -S 192.168.2.0/24 -j MASQUERADE -- 这条规则是为了同网段的内网实现上网

   IPVSADM='/usr/sbin/ipvsadm'  -- 把ipvsadm变量

   $IPVSADM -A -- 增加规则   
    
   -t 跟的是分发器的IP (即是外网IP)

   -s 是指定算法  -m 是NAT 的模式

   -w 是设置权重      

   -r 后面跟的Real Server的IP

   rr 把用户的请求均衡的分发到每个rs上
   
执行脚本:
[root@root-01 ~]# sh /usr/local/sbin/lvs.nat.sh


1.8 设置Real Server 的主页,以便区分

#设置第1台Real Server 主页面 (即是默认虚拟主机)

[root@root-02 ~]# vim /data/www/default/index.html 

root-02

#设置第2台Real Server 主页面(即是默认虚拟主机)

[root@root-03 ~]# vim /data/www/default/index.html 

root-03


1.9 测试

说明:使用公网IP测试访问

第一次访问的第1台Real Server
第二次访问的第2台Real Server
依次轮流,

[root@root-01 ~]# curl 192.168.18.128
root-02
[root@root-01 ~]# curl 192.168.18.128
root-03
[root@root-01 ~]# curl 192.168.18.128
root-02
[root@root-01 ~]# curl 192.168.18.128
root-03

说明这样就成功了


 

共有 人打赏支持
粉丝 4
博文 63
码字总数 114622
×
Linux_Anna
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: