Linux集群架构——LVS负载均衡集群

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

负载均衡集群介绍

 主流开源软件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层的更加灵活,能实现更多的个性化需求

LVS介绍

 LVS是由国人章文嵩开发  

流行度不亚于apache的httpd,基于TCP/IP做的路由和转发,稳定性和效率很高  

LVS最新版本基于Linux内核2.6,有好多年不更新了  

LVS有三种常见的模式:NAT、DR、IP Tunnel  LVS架构中有一个核心角色叫做分发器(Load balance),它用来分发用户的请求,还有诸多处理用户请求的服务器(Real Server,简称rs)

LVS NAT模式

Linux集群架构——LVS负载均衡集群_第1张图片

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

用户的请求到分发器后,通过预设的iptables规则,把请求的数据包转发到后端的rs上去  

rs需要设定网关为分发器的内网ip  

用户请求的数据包和返回给用户的数据包全部经过分发器,所以分发器成为瓶颈  

在nat模式中,只需要分发器有公网ip即可,所以比较节省公网ip资源

请求量不能太大,一般规模10台以内

LVS IP Tunnel模式

Linux集群架构——LVS负载均衡集群_第2张图片

这种模式,需要有一个公共的IP配置在分发器和所有rs上,我们把它叫做vip  

客户端请求的目标IP为vip,分发器接收到请求数据包后,会对数据包做一个加工,会把目标IP改为rs的IP,这样数据包就到了rs上  

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

LVS DR模式

Linux集群架构——LVS负载均衡集群_第3张图片

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

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

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

LVS调度算法

 轮询 Round-Robin  rr
 加权轮询 Weight Round-Robin wrr
 最小连接 Least-Connection lc
 加权最小连接 Weight Least-Connection wlc
 基于局部性的最小连接 Locality-Based Least Connections lblc
 带复制的基于局部性最小连接 Locality-Based Least Connections with Replication  lblcr
 目标地址散列调度 Destination Hashing dh
 源地址散列调度 Source Hashing  sh

NAT模式的的搭建

 三台机器  分发器,也叫调度器(简写为dir)  

dir  内网:109.130,外网:209.147(vmware仅主机模式)  

rs1  内网:109.131   设置网关为109.130

rs2  内网:109.132   设置网关为109.130

三台机器上都执行执行  

systemctl stop firewalld;systemctl disable firewalld  

systemctl start  iptables;iptables -F;service iptables save

在dir上安装ipvsadm  yum install -y ipvsadm  

在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.109.0/24  -j MASQUERADE
# director设置ipvsadm
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t 192.168.209.147:80 -s rr
$IPVSADM -a -t 192.168.209.147:80 -r 192.168.109.131:80 -m -w 1
$IPVSADM -a -t 192.168.209.147:80 -r 192.168.109.132:80 -m -w 1

sh /usr/local/sbin/lvs_nat.sh  //执行脚本

两台rs上都安装nginx

设置两台rs的主页,做一个区分,然后curl外网测试

Linux集群架构——LVS负载均衡集群_第4张图片

这里我们能看到我们的访问不断在rs2和rs3之间切换,从而达到负载均衡的效果。

注:nat模式10台以内比较有优势

DR模式搭建

三台机器  分发器,也叫调度器(简写为dir)  

dir  109.130  

rs1  109.131  

rs2  109.133  

vip  109.200

dir上编写脚本 vim /usr/local/sbin/lvs_dr.sh //内容如下

#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/usr/sbin/ipvsadm
vip=192.168.109.200
rs1=192.168.109.131
rs2=192.168.109.133
#注意这里的网卡名字
ifdown ens33
ifup ens33
ifconfig ens33:2 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip dev ens33:2
$ipv -C
$ipv -A -t $vip:80 -s wrr
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1

两台rs上也编写脚本 vim /usr/local/sbin/lvs_rs.sh//内容如下

#/bin/bash
vip=192.168.109.200
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifdown lo
ifup lo
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
#参考文档www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce

分别在dir上和两个rs上执行这些脚本

测试:

Linux集群架构——LVS负载均衡集群_第5张图片

浏览器访问时,可能不会变,因为访问量不够,或者自己测试是在一台机器上,但是从上图中我们能看到还是有负载均衡的。

Keepalived+LVS DR

 完整架构需要两台服务器(角色为dir)分别安装keepalived软件,目的是实现高可用,但keepalived本身也有负载均衡的功能,所以本次实验可以只安装一台keepalived  

keepalived内置了ipvsadm的功能,所以不需要再安装ipvsadm包,也不用编写和执行那个lvs_dir的脚本  

三台机器分别为:  

dir(安装keepalived)109.130  

rs1 109.131  

rs2 109.133  

vip 109.200

 编辑keepalived配置文件

vim /etc/keepalived/keepalived.conf  //内容如下

vrrp_instance VI_1 {
    #备用服务器上为 BACKUP
    state MASTER
    #绑定vip的网卡为ens33,你的网卡和阿铭的可能不一样,这里需要你改一下
    interface ens33
    virtual_router_id 51
    #备用服务器上为90
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass aminglinux
    }
    virtual_ipaddress {
        192.168.109.200
    }
}
virtual_server 192.168.109.200 80 {
    #(每隔10秒查询realserver状态)
    delay_loop 10
    #(lvs 算法)
    lb_algo wlc
    #(DR模式)
    lb_kind DR
    #(同一IP的连接60秒内被分配到同一台realserver)
    persistence_timeout 60
    #(用TCP协议检查realserver状态)
    protocol TCP

    real_server 192.168.109.131 80 {
        #(权重)
        weight 100
        TCP_CHECK {
        #(10秒无响应超时)
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
    real_server 192.168.109.132 80 {
        weight 100
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
     }
}

执行ipvsadm -C  把之前的ipvsadm规则清空掉  

systemctl restart network 可以把之前的vip清空掉  

两台rs上,依然要执行/usr/local/sbin/lvs_rs.sh脚本  

keepalived有一个比较好的功能,可以在一台rs宕机时,不再把请求转发过去  测试

当听到rs3的nginx服务时,dir上会自动踢掉rs3,如下图

9a47743ab4c106c0eb1a5afdab327f3361b.jpg

当启动rs3的nginx服务时,dir会立马把rs3加回来,如下图:

08a1113e6a1cde55635ff65a9048b6de36f.jpg

这里我们就搭建成功了~~~~~~

 

 

转载于:https://my.oschina.net/ccLlinux/blog/1976162

你可能感兴趣的:(数据库,开发工具,python)