LVS+Keepalived+Nginx实现高可用集群负载均衡

从单体到集群系列目录
从单体到集群(1) - 使用Nginx配置静态资源并搭建Tomcat集群

从单体到集群(2) - keepalived+Nginx实现高可用集群

从单体到集群(3) - LVS+Keepalived+Nginx实现高可用集群负载均衡

--------------------------------------------------------------------------------------------------------------------------

1.素材与软件版本
软件版本:

       IDAE:2019.2.2

       VMware:12.5.2

       虚拟机镜像:CentOs7.3标准版

       Xshell:Xshell6

       Postman:7.33.1

       Tomcat:8.5.41

       Nginx:1.18.0稳定版

       keepalived:2.0.18

       项目素材链接放上,需要的朋友请自行下载。后台项目为foodie-dev,前端项目有两个,foodie-shop为前端商城主体项目,foodie-center为前端商城个人中心项目。具体项目配置的话可以看下我的上篇博文架构篇:从单体到高可用集群(1) - 使用Nginx配置静态资源并搭建Tomcat集群

2.架构演变目标
       在上篇博文中,我们项目的架构由Nginx为静态资源提供服务同时将请求转发到后面Tomcat集群,演变成了keepalived+Nginx高可用集群(双主热备模式)。上篇博文中的项目架构:

LVS+Keepalived+Nginx实现高可用集群负载均衡_第1张图片

       这样确实保证了Nginx的高可用,但也产生了一个问题,如何保证Nginx可以顶得住前端并发请求的压力呢?所以今天的目标是:引入LVS组件并搭建LVS集群代理Nginx集群,来扩展Nginx的负载能力。我们的目标架构如下:LVS+Keepalived+Nginx实现高可用集群负载均衡

LVS+Keepalived+Nginx实现高可用集群负载均衡_第2张图片

3.LVS介绍
     3.1 LVS是什么
       LVS的英文全称是Linux Virtual Server,是我们国家章文嵩博士的一个开源项目。它是一种集群技术,本质为负载均衡调度器,采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。在linux内存2.6中,它已经成为内核的一部分,在此之前的内核版本则需要重新编译内核。

     3.2 LVS的三种模式
       NAT模式:基于网络地址转换模式,用户请求在浏览器上发送给调度者LVS,在后端有三个真实的服务器,后端服务器会去处理用户的请求,处理完毕后会响应给LVS,随后经LVS返回给用,这种模式和Nginx很像。注:LVS会绑定一个虚拟IP,用户请求需要能访问此IP,所以此IP一定要处于公网,后端被代理的服务可以部署在内网里。

LVS+Keepalived+Nginx实现高可用集群负载均衡_第3张图片

       TUN模式:IP隧道模式,此模式下需要的所有的计算机节点必须要有一个网卡,这个网卡就是用于去建立隧道(用于服务器之间的通信),在这种模式下,后台服务所有的响应是不会经过LVS的,会直接把自己的报文响应给用户。注:此模式同样需要LVS虚拟IP处于公网,与此同时要求所有部署的后端服务都要处于公网上。

LVS+Keepalived+Nginx实现高可用集群负载均衡_第4张图片

       DR模式:直接路由模式,用户的请求方式还是和TUN模式一样,但响应方式不同,在DR模式下,后端服务会统一的经由一个路由将响应报文返回给用户。注:此模式下需要给路由也配置一个虚拟IP。

LVS+Keepalived+Nginx实现高可用集群负载均衡_第5张图片

     3.3 为什么要使用LVS+Nginx?
       1.LVS工作在网络层(OSI第四层),性能更高,接收到的请求可以直接进行转发;Nginx工作在应用层(OSI第七层),接收到的请求需要进行处理,会有性能损耗。

       2.Nginx集群需要一个性能更强大的调度者,如果再继续采用Nginx做调度者的话就没有意义了。

       3.LVS可以只接受请求不去响应,Nginx需要接受请求并响应。

4. 搭建LVS+Keepalived+Nginx高可用集群
       搭建之前需要说一下,因为是采用虚拟IP做的负载均衡,本地搭建的环境是虚拟机可以直接配置,如果是自己买的服务器的话,阿里云是不支持虚拟IP的,他自己有个SLB负载均衡服务,需要花钱购买,其他平台我不清楚。我们先来搭建一个单节点LVS架构:

LVS+Keepalived+Nginx实现高可用集群负载均衡_第6张图片

     4.1 在192.168.1.130上配置虚拟IP并安装ipvsadm
       进入/etc/sysconfig/network-scripts路径下,找到网卡配置文件,我的是ifcfg-ens33,拷贝一份重命名为ifcfg-ens33:1

cp ifcfg-ens33 ifcfg-ens33:1

保留以下内容:

BOOTPROTO=static
DEVICE=ens33:1
ONBOOT=yes
IPADDR=192.168.1.120
NETMASK=255.255.255.0

刷新系统网络配置,用ip addr指令查看,发现出现虚拟IP,证明配置成功:

service network restart

 LVS+Keepalived+Nginx实现高可用集群负载均衡_第7张图片

 安装ipvsadm,安装好后可以用ipvsadm -Ln指令查看一下是否安装成功:

yum install ipvsadm
ipvsadm -Ln

4.2 为192.168.1.150和192.168.1.151两台RS节点配置虚拟IP

       进入/etc/sysconfig/network-scripts路径下,找到ifcfg-lo,拷贝一份重命名为ifcfg-lo:1

cp ifcfg-lo ifcfg-lo:1

   前三行做如下修改,其他行保持不变:

DEVICE=lo:1
IPADDR=192.168.1.120
NETMASK=255.255.255.255

刷新系统网络配置,用ip addr指令查看,发现出现虚拟IP,证明配置成功,192.168.1.151也是同样操作:

service network restart

 LVS+Keepalived+Nginx实现高可用集群负载均衡_第8张图片

4.3 为192.168.1.150和192.168.1.151两台RS节点配置arp

     打开sysctl.conf:

vi /etc/sysctl.conf

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

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

刷新配置文件:

sysctl -p

增加一个网关,用于接收数据报文,当有请求到本机后,会交给lo去处理:

echo "route add -host 192.168.1.120 dev lo:1" >> /etc/rc.localecho "route add -host 192.168.1.120 dev lo:1" >> /etc/rc.local

 4.4 使用ipvsadm配置集群规则()

      创建集群并添加配置,-A:创建集群,-t:处理http请求,-s:负载均衡算法

ipvsadm -A -t 192.168.1.120:80 -s rr

  为集群添加服务,-a:真实服务器节点,-t:处理http请求,-r:真实服务节点,-g:DR模式

ipvsadm -a -t 192.168.1.120:80 -r 192.168.1.150:80 -g
ipvsadm -a -t 192.168.1.120:80 -r 192.168.1.151:80 -g

通过ipvsadm -Ln指令查看配置是否生效: 

ipvsadm -Ln

LVS+Keepalived+Nginx实现高可用集群负载均衡_第9张图片

 接着我们去用浏览器访问,发现转发成功(记得关闭防火墙哦):

LVS+Keepalived+Nginx实现高可用集群负载均衡_第10张图片

 以前我们的项目是90端口,现在只需要在创建一个调度器就可以了:

LVS+Keepalived+Nginx实现高可用集群负载均衡_第11张图片

4.5 搭建LVS+Keepalived集群
      搭建LVS+Keepalived集群需要额外再增加一台LVS备机,这里我的虚拟机IP是192.168.1.131,目前一共六台虚拟机:

      接下来我们需要在130和131两台LVS虚拟机上都安装keepalived,安装步骤省略,如果有小伙伴不会安装的话可以参考我这篇博文:从单体到集群(2) - keepalived+Nginx实现高可用集群。安装之后我们先配置主节点192.168.1.130这台虚拟机,先把之前的ifcfg-ens33:1文件删除掉,因为我们使用keepalived就不需要手动配置虚拟ip了,然后进入/etc/keepalived,修改keepalived配置文件:
 


global_defs {
   router_id LVS_130
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.120
    }
}
virtual_server 192.168.1.120 80 {
    #健康检查时间
    delay_loop 6
    #负载均衡算法
    lb_algo rr
    #设置LVS模式
    lb_kind DR
    #设置会话持久时间
    persistence_timeout 5
    #设置协议方式
    protocol TCP
 
    real_server 192.168.1.150 80 {
       weight 1
       #设置健康检查
       TCP_CHECK {                     
              #超时时间10s
              connect_timeout 10   
              #重试次数
              retry 3
              #间隔时间
              delay_before_retry 3
              #检查80端口
              connect_port 80
        }
    }
    real_server 192.168.1.151 80 {
        weight 1
        #设置健康检查
        TCP_CHECK {                     
             #超时时间10s
              connect_timeout 10   
              #重试次数
              retry 3
              #间隔时间
              delay_before_retry 3
              #检查80端口
              connect_port 80
        }
    }
}

 接着用指令清除ipvsadm以前的配置,并重启keepalived:

ipvsadm -C

LVS+Keepalived+Nginx实现高可用集群负载均衡_第12张图片

 注:切记切记要等待keepalived启动完成之后再调试(同一个错误又栽了一次,我淦)。

      接着修改备机的keepalived配置文件,并启动服务:


global_defs {
   router_id LVS_131
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.120
    }
}
virtual_server 192.168.1.120 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 5
    protocol TCP
 
    real_server 192.168.1.150 80 {
        weight 1
       TCP_CHECK {                     
                        connect_timeout 10   
                        retry 3
                        delay_before_retry 3
                        connect_port 80
        }
    }
    real_server 192.168.1.151 80 {
        weight 1
        TCP_CHECK {                     
                        connect_timeout 10   
                        retry 3
                        delay_before_retry 3
                        connect_port 80
        }
    }
}

 至此LVS+Keepalived+Nginx实现高可用集群负载均衡搭建完成。

你可能感兴趣的:(分布式架构系列,分布式,nginx)