LVS+KeepAlived+Nginx高可用实现方案


前言

在大型网站中一般服务端会做集群,同时利用负载均衡器做负载均衡。这样有利于将大量的请求分散到各个服务器上,提升网站的响应速度。当然为了解决单点故障的问题,还会做热备份方案。这里演示利用LVS做负载均衡器,同时利用Keepalived保证其高可用,基于LVS的DR模式构建Nginx集群。

Keepalvied的工作原理我们这里不在赘述,有需要的同学可查看小强之前的文章。

相关文章:
【Nginx-学习nginx这一篇就够了】
【搭建keepalived+nginx热备高可用(主备+双主模式)】

一、LVS是什么?

  LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中。该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案,其体系结构如图1所示,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器,比如,轮询算法可以将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然会被转发到后端真实的服务器,但如果真实服务器连接的是相同的存储,提供的服务也是相同的服务,最终用户不管是访问哪台真实服务器,得到的服务内容都是一样的,整个集群对用户而言都是透明的。最后根据LVS工作模式的不同,真实服务器会选择不同的方式将用户需要的数据发送到终端用户,LVS工作模式分为NAT模式、TUN模式、以及DR模式。

三种模式讲解

1、基于NAT的LVS模式负载均衡

  NAT(Network Address Translation)即网络地址转换,其作用是通过数据报头的修改,使得位于企业内部的私有IP地址可以访问外网,以及外部用用户可以访问位于公司内部的私有IP主机。
![在这里插入图片描述](https://img-blog.csdnimg.cn/dce0de47684c4f618c11368da35a0b25.png

2、基于TUN的LVS负载均衡

  在LVS(NAT)模式的集群环境中,由于所有的数据请求及响应的数据包都需要经过LVS调度器转发,如果后端服务器的数量大于10台,则调度器就会成为整个集群环境的瓶颈。我们知道,数据请求包往往远小于响应数据包的大小。因为响应数据包中包含有客户需要的具体数据,所以LVS(TUN)的思路就是将请求与响应数据分离,让调度器仅处理数据请求,而让真实服务器响应数据包直接返回给客户端。

在这里插入图片描述

3、基于DR的LVS负载均衡

  DR模式也叫直接路由模式,其体系结构如图4所示,该模式中LVS依然仅承担数据的入站请求以及根据算法选出合理的真实服务器,最终由后端真实服务器负责将响应数据包发送返回给客户端。
在这里插入图片描述

LVS常用调度算法

1.轮询调度

  轮询调度(Round Robin 简称’RR’)算法就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是实现简单。轮询算法假设所有的服务器处理请求的能力都一样的,调度器会将所有的请求平均分配给每个真实服务器。

2.加权轮询调度

  加权轮询(Weight Round Robin 简称’WRR’)算法主要是对轮询算法的一种优化与补充,LVS会考虑每台服务器的性能,并给每台服务器添加一个权值,如果服务器A的权值为1,服务器B的权值为2,则调度器调度到服务器B的请求会是服务器A的两倍。权值越高的服务器,处理的请求越多。

3.最小连接调度

  最小连接调度(Least Connections 简称’LC’)算法是把新的连接请求分配到当前连接数最小的服务器。最小连接调度是一种动态的调度算法,它通过服务器当前活跃的连接数来估计服务器的情况。调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1;当连接中断或者超时,其连接数减1。
(集群系统的真实服务器具有相近的系统性能,采用最小连接调度算法可以比较好地均衡负载。)

4.加权最小连接调度

  加权最少连接(Weight Least Connections 简称’WLC’)算法是最小连接调度的超集,各个服务器相应的权值表示其处理性能。服务器的缺省权值为1,系统管理员可以动态地设置服务器的权值。加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

LVS拓扑图

在这里插入图片描述

二、环境搭建

1.环境准备(此处都是使用的centos7系统)

HOSTNAMEIP说明
nginx192.168.92.100nginx服务器
nginx192.168.92.101nginx服务器
Lvs+keepalived(主)192.168.92.102Lvs+keepalived(VIP:192.168.92.150)
Lvs+keepalived(备)192.168.92.103Lvs+keepalived(VIP:192.168.92.150)

所有计算机节点关闭网络配置管理器,因为有可能会和网络接口冲突:

systemctl stop NetworkManager
systemctl disable NetworkManager

2.Lvs服务器虚拟ip配置

1.网卡配置

1. 进入到网卡配置目录,找到咱们的ens33:

cd /etc/sysconfig/network-scripts/

![在这里插入图片描述](https://img-blog.csdnimg.cn/b8ed73b0811a4195b1c40af8344600cf.png

2. 拷贝并创建子接口,修改接口配置:

#数字1为别名,可以取其他数字
cp ifcfg-ens33 ifcfg-ens33:1
vim ifcfg-ens33:1

3. 配置参考如下:
在这里插入图片描述

  • 注:配置中的192.168.92.150就是咱们的vip,是提供给外网用户访问的ip地址,道理和nginx+keepalived那时讲的vip是一样的。

4. 重启网络服务,或者重启linux:

service network restart

在这里插入图片描述

5. 重启成功后,ip addr查看一下,你会发现多了一个ip,也就是虚拟ip(vip)

在这里插入图片描述

2.安装ipvsadm(Lvs服务器)

  现如今的centos都是集成了LVS,所以ipvs是自带的,相当于苹果手机自带ios,我们只需要安装ipvsadm即可(ipvsadm是管理集群的工具,通过ipvs可以管理集群,查看集群等操作),命令如下:

yum install ipvsadm

安装成功后,可以检测一下:

 ipvsadm -Ln

在这里插入图片描述

图中显示目前版本为1.2.1,此外是一个空列表,啥都没。

  • 注:关于虚拟ip在云上的事儿
    1.阿里云不支持虚拟IP,需要购买他的负载均衡服务
    2.腾讯云支持虚拟IP,但是需要额外购买,一台节点最大支持10个虚拟ip

3.为两台RS配置虚拟ip(nginx服务器)

两台服务器配置一样,以下已一台服务器配置作为演示

1.配置虚拟网络子接口(回环接口)

  配置虚拟网络子接口可以理解为构建一个虚拟ip,这个ip只能返回数据,不能被访问。

1.进入到网卡配置目录,找到 lo(本地环回接口,用户构建虚拟网络子接口),拷贝一份新的随后进行修改:
在这里插入图片描述

2.修改内容如下:
在这里插入图片描述

3.重启后通过ip addr 查看如下,表示ok:
通过命令刷新网卡

ifup lo

在这里插入图片描述

2.ARP响应级别与通告行为的概念

1.arp-ignore:ARP响应级别(处理请求)

  • 0:只要本机配置了ip,就能响应请求

  • 1:请求的目标地址到达对应的网络接口,才会响应请求

2.arp-announce:ARP通告行为(返回响应)

  • 0:本机上任何网络接口都向外通告,所有的网卡都能接受到通告
  • 1:尽可能避免本网卡与不匹配的目标进行通告
  • 2:只在本网卡通告

3.配置ARP

1.打开sysctl.conf

vim /etc/sysctl.conf

2.配置所有网卡、默认网卡以及虚拟网卡的arp响应级别和通告行为,分别对应:all,default,1o:

#configration for lvs
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.default.arp_ignore=1
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.default.arp_announce=2
net.ipv4.conf.lo.arp_announce=2

3.刷新配置

sysctl -p

在这里插入图片描述
4.增加一个网关,用于接收数据报文,当有请求到本机后,会交给lo去处理

route add -host 192.168.92.150 dev lo:1

在这里插入图片描述

5.防止重启失效,做如下处理,用于开机自启动
在这里插入图片描述

4.搭建LVS-DR模式-使用ipvsadm配置集群规则

1.创建LVS节点,用户访问的集群调度者

ipvsadm -A -t 192.168.92.150:80 -s rr 
  • -A:添加集群
  • -t:tcp协议
  • ip地址:设定集群的访问ip,也就是LVS的虚拟ip
  • -s:设置负载均衡的算法,rr表示轮询
  • -p:设置连接持久化的时间(可不加,默认300秒)

2.创建2台RS真实服务器
把nginx添加到集群

ipvsadm -a -t 192.168.92.150:80 -r 192.168.92.100:80 -g
ipvsadm -a -t 192.168.92.150:80 -r 192.168.92.101:80 -g
  • -a:添加真实服务器
  • -t:tcp协议
  • -r:真实服务器的ip地址
  • -g:设定DR模式

到这一步,Lvs搭建DR模式已经完成,VIP地址已经可以正常访问

在这里插入图片描述
3.为什么多次刷新后还是访问的同一个节点呢?(我们配置的轮询)

在配置中:

  1. LVS默认轮询有一个持久化连接, 如下, 默认为 300 秒.

在这里插入图片描述

  1. 我们可以进行修改这个值:
ipvsadm -E -t 192.168.92.150:80 -s rr -p 5
ipvsadm -Ln

在这里插入图片描述

到这一步,请求5秒一次后会进行轮训
在这里插入图片描述

  • expire:过期时间
  • source:本机访问网络
  • virtual:vip地址
  • destination:真实的服务器ip
  1. 还有一个 tcp, udp 超时时间的默认配置

    #设置超时时间都为1秒 (为了测试轮询方便而设置, 一般保持默认即可)
    ipvsadm --set 1 1 1
    
    #查看当前ipvs模块中记录的连接(可用于观察转发情况)
    ipvsadm -lnc
    

    ps:查看ipvs模块的转发情况统计

    ipvsadm -Ln --stats | --rate
    

    --stats选项是统计自该条转发规则生效以来的包

    Conns (connections scheduled) 已经转发过的连接数
    InPkts (incoming packets) 入包个数
    OutPkts (outgoing packets) 出包个数
    InBytes (incoming bytes) 入流量(字节)
    OutBytes (outgoing bytes) 出流量(字节)
    --rate选项是显示速率信息

    CPS (current connection rate) 每秒连接数
    InPPS (current in packet rate) 每秒的入包个数
    OutPPS (current out packet rate) 每秒的出包个数
    InBPS (current in byte rate) 每秒入流量(字节)
    OutBPS (current out byte rate) 每秒入流量(字节)

4.保存到规则库,否则重启失效

ipvsadm -S

5.检查集群

  • 查看集群列表

    ipvsadm -Ln
    

    在这里插入图片描述

  • 查看集群状态

    ipvsadm -Ln --stats
    

6.其他命令:

#清除所有纪录
ipvsadm -C
#重启ipvsadm,重启后需要重新配置
service ipvsadm restart
#查看持久化连接
ipvsadm -Ln --persistent-conn
#查看连接请求过期时间以及请求源ip和目标1p
ipvsadm -Lnc
#设置tcp tcpfin udp的过期时间(一般保持默认)
ipvsadm --set 111
#查看过期时间
ipvsadm -Ln --timeout

6.更详细的帮助文档:

ipvsadm -h
man ipvsadm

三、Keepalived+Lvs+Nginx高可用集群负载均衡的搭建

keepalived这里不在赘述,有需要的同学可跳转链接
centos7.9搭建keepalived+nginx热备高可用(主备+双主模式)】
在这里插入图片描述

这种架构目前在很多公司都在采用的高可用高性能架构, 优点如下:

  1. 使用Keepalived + Lvs 后可以实现主备切换高可用
  2. 结合了Lvs 后, 针对于后台的Real Server 这些真实的服务器做健康检查, 如果某台真实的服务器宕机后, Lvs就会自动剔除, 如果恢复后也可以自动加入.
  3. 其实 Keepalived 本身就是为 Lvs 定做了, 他们的匹配度, 结合度非常高, 通过 keepalivd 就可以配置 Lvs与 RS 的关系, 如负载均衡算法, 健康检查配置等.

1. 配置 Master (192.168.19.102节点)

  1. 进入keepalived配置文件, 修改配置信息, 修改如下即可(注意观察注释匹配自己的信息节点)
cd /etc/keepalived
vim keepalived.conf

配置文件如下:

! Configuration File for keepalived

global_defs {
   router_id LVS_102
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 41
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.92.150
    }
}
# LVS 配置: 配置集群访问的 IP+端口, 端口和nginx保持一致, 都是80, IP与端口是空格而不是冒号
virtual_server 192.168.92.150 80 {
    # 健康检查的时间, 单位是秒
    delay_loop 6
    # 配置负载均衡的算法, 默认是 轮询
    lb_algo rr
    # 设置LVS的工作模式 NAT|TUN|DR  lb是load_balance 负载均衡的缩写
    lb_kind DR
    # 会话持久化的时间, 默认是 50 秒
    persistence_timeout 5
    # 协议 -t
    protocol TCP

    # Real Server 配置  nginx服务ip+端口
    real_server 192.168.92.100 80 {
        # 轮询的权重, 默认有多少台, 就设置为多少个 1
        weight 1
        # 设置健康检查, 基于 tcp
        TCP_CHECK {
            # 检查的80端口
            connect_port 80
            # 检查的超时时间 2秒
            connect_timeout 2
            # 重试的次数 我们设置为2, 一般是5-7
            nb_get_retry 2
            # 设置间隔时间 3s
            delay_before_retry 3
        }
    }

    real_server 192.168.92.101 80 {
        weight 1
        # 设置健康检查, 基于 tcp
        TCP_CHECK {
            # 检查的80端口
            connect_port 80
            # 检查的超时时间 2秒
            connect_timeout 2
            # 重试的次数 我们设置为2, 一般是5-7
            nb_get_retry 2
            # 设置间隔时间 3s
            delay_before_retry 3
        }
    }
}


  1. 清除负载均衡的规则

    ipvsadm -C
    

    在这里插入图片描述

  2. 重启keepalived, 使得配置生效

    systemctl restart keepalived
    

2. 配置Lvs Backup (192.168.19.103节点)

步骤同 Master ,只有配置文件不一样

! Configuration File for keepalived
global_defs {
  #主服务器配置不同,名称随便起
   router_id LVS_103
}

vrrp_instance VI_1 {
    #主服务器配置不同
    state BACKUP
    interface ens33
    virtual_router_id 41
    #主服务器配置不同,权重需要比主服务器低
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.92.150
    }
}
# LVS 配置: 配置集群访问的 IP+端口, 端口和nginx保持一致, 都是80, IP与端口是空格而不是冒号
virtual_server 192.168.92.150 80 {
    # 健康检查的时间, 单位是秒
    delay_loop 6
    # 配置负载均衡的算法, 默认是 轮询
    lb_algo rr
    # 设置LVS的工作模式 NAT|TUN|DR  lb是load_balance 负载均衡的缩写
    lb_kind DR
    # 会话持久化的时间, 默认是 50 秒
    persistence_timeout 5
    # 协议 -t
    protocol TCP

    # Real Server 配置  nginx服务ip+端口
    real_server 192.168.92.100 80 {
        # 轮询的权重, 默认有多少台, 就设置为多少个 1
        weight 1
        # 设置健康检查, 基于 tcp
        TCP_CHECK {
            # 检查的80端口
            connect_port 80
            # 检查的超时时间 2秒
            connect_timeout 2
            # 重试的次数 我们设置为2, 一般是5-7
            nb_get_retry 2
            # 设置间隔时间 3s
            delay_before_retry 3
        }
    }

    real_server 192.168.92.101 80 {
        weight 1
        # 设置健康检查, 基于 tcp
        TCP_CHECK {
            # 检查的80端口
            connect_port 80
            # 检查的超时时间 2秒
            connect_timeout 2
            # 重试的次数 我们设置为2, 一般是5-7
            nb_get_retry 2
            # 设置间隔时间 3s
            delay_before_retry 3
        }
    }
}

改完配置文件,进行重启keeplivaed,命令同上!
重启完出现相同路由规则标识已配置成功
在这里插入图片描述

3. 测试

1.测试Lvs

  1. 停掉 LVS 的 Master 节点 (102节点操作)

    keepalived stop keepalived
    ip addr
    
  2. 观察主节点130 LVS节点 IP
    此时发现102节点的 ens33中150ip已经没有了在这里插入图片描述

  3. 观察备用节点 131 LVS 节点 IP
    在这里插入图片描述
    在Backup上通过ipvsadm -Lnc命令查看网站链接情况
    在这里插入图片描述
    网站还可以正常访问
    在这里插入图片描述

  4. 重启Master 节点,我们发现ip有漂移回来了
    在这里插入图片描述

1.测试nginx

  1. 我们关闭100节点的Nginx服务器(假如宕机状态)

    cd /usr/local/nginx/sbin
    ./nginx -s stop
    
  2. 进入102 LVS 节点进行查看集群信息

    ipvsadm -Ln
    

    只剩下了101节点, 即可以做到自动剔除宕机节点
    在这里插入图片描述

  3. 我们启动100节点nginx,进入102 LVS 节点进行查看集群信息,发现节点已自动恢复到集群在这里插入图片描述
    到此LVS+KeepAlived+Nginx高可用实现方案已经搭建完毕!!!!!

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值