nginx高并发架构

1.前言

对于高并发的流量web架构,单纯的使用nginx是不够用的,nginx做七层代理需要处理数据,在大并发的情况下对主机资源的消耗就非常厉害了,所以此情况下就引入了lvs,使用lvs的四层转发功能,四层转发不需要处理数据只是tcp/udp协议进行端口对端口的数据转发,就算并发在大也不存在资源消耗大的问题,再通过多个nginx进行负载,就能很好的应对高并发的问题,在通过引入keepalived解决lvs单点问题,实现高可用

lvs的负载均衡可以实现后端检查,若是后端的某个nginx挂掉时,会将该nginx地址从负载均衡中剔除,当该nginx恢复后,又会将该地址加入到负载均衡中

lvs的网络模式使用DR模式,负载均衡策略使用rr轮询模式

2.架构

nginx高并发架构_第1张图片

3.主机信息

name ip port service
A(主) 10.1.60.115 80

ipvs、keepalived

B(备) 10.1.60.118 80 ipvs、keepalived
C 10.1.60.112 80 nginx
D 10.1.60.114 80 nginx
VIP 10.1.60.116

4.部署

所有主机关闭selinux与firewalld

systemctl stop firewalld

systemctl disable firewalld

setenforce 0

以下操作在A、B主机上执行

安装keepalived服务

yum -y install keepalived

备份keepalived原配置文件

cp  /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

编辑keepalived配置文件

vi /etc/keepalived/keepalived.conf

A主配置文件

! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id nginx01          #配置路由id,主和备的配置需要配置不同的id
   vrrp_skip_check_adv_addr
  #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER             #主需要设置为MASTER
    interface ens160         #配置网卡,需要根据自己的真实网卡名称配置
    virtual_router_id 51     #配置vrrp的路由id,主和备需要相同
    priority 100             #配置权重值,备节点权重值需要低于MASTER节点
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.1.60.116/24        #设置虚拟ip地址
    }
}

virtual_server 10.1.60.116 80 {     #配置虚拟ip地址和端口,用于接收转发请求
    delay_loop 3                     #定义检测真实服务器可用性的循环周期,单位为秒
    lb_algo rr                       #配置负载均衡的访问策略,配置问轮询模式
    lb_kind DR                       #配置ipvs使用的网络模式,配置为路由模式
    persistence_timeout 0            #定义持久化连接的超时时间,单位为秒。持久化连接可以确保同一个客户端的多个请求都被转发到同一台真实服务器
    protocol TCP                     #指定后端真实服务器的协议为 TCP

    real_server 10.1.60.114 80 {    #配置真实的地址和端口,即被负载的nginx地址和端口,用于将数据转发到该nginx上
        weight 1                     #配置权重,权重大的转发流量就多
        HTTP_GET {                   #配置健康检查
            url {
              path /
              status 200
            }
            connect_timeout 3        #配置检查超时时间
            nb_get_retry 3           #定义在失败的情况下重新尝试的次数
            delay_before_retry 3     #定义重新尝试之间的延迟时间,单位为秒
        }
    }


     real_server 10.1.60.112 80 {   ##配置真实的地址和端口,即被负载的nginx地址和端口,用于将数据转发到该nginx上
        weight 1
        HTTP_GET {
            url {
              path /
              status 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

B备配置文件

! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id nginx02            #更改id与主不一致
   vrrp_skip_check_adv_addr
  #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state BACKUP            #更改为BACKUP
    interface ens160
    virtual_router_id 51   
    priority 90              #更改配置权重
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.1.60.116/24
    }
}

virtual_server 10.1.60.116 80 {
    delay_loop 3
    lb_algo rr
    lb_kind DR
    persistence_timeout 0
    protocol TCP

    real_server 10.1.60.114 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

     real_server 10.1.60.112 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

启动keepalived服务并配置开机启动

systemctl start keepalived

systemctl enable keepalived

查看A主机地址

nginx高并发架构_第2张图片

可以看到vip地址绑到了A主机上

以下操作在C、D主机上执行

安装nginx服务

yum -y install epel   #通过epel的包去安装nginx

yum -y install nginx

更改nginx的默认页面

mv /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.bak

D主机则将C改为D即可

echo "this is C" >> /usr/share/nginx/html/index.html

启动nginx服务并配置开机启动

systemctl start nginx

systemctl enable nginx

新增虚拟网卡并配置为vip地址,用于返回数据,并且不会被用户访问到,lo虚拟网卡中的127.0.0.1就属于回环地址,不会被外部访问,参照lo虚拟网卡配置

cp /etc/sysconfig/network-scripts/ifcfg-lo /etc/sysconfig/network-scripts/ifcfg-lo1

vi /etc/sysconfig/network-scripts/ifcfg-lo1

DEVICE=lo:1   #网卡修改名称
IPADDR=10.1.60.116   #配置为vip地址
NETMASK=255.255.255.255   #更改为32位子网掩码
NETWORK=127.0.0.0
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback

重启网络服务

systemctl restart network

ip add

nginx高并发架构_第3张图片

 添加路由

route add -host 10.1.60.116 dev lo:1   #若是需要删除将add替换为del即可

查看路由

route -n

配置arp响应与通告

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

 在A、B主机上执行以下命令

安装ipvsadm工具

yum -y install ipvsadm

查看ipvs规则

ipvsadm -Ln

nginx高并发架构_第4张图片

 可以看到ipvs规则中显示10.1.60.116:80地址通过rr轮询负载到后端的10.1.60.112:80、10.1.60.114:80两个nginx地址中

5.测试

访问vip地址和端口看看是否能正常转发到后端的两个nginx中

curl 10.1.60.116

nginx高并发架构_第5张图片

可以看到访问 vip地址是可以正常轮询访问到后端的两个nginx中

再来测试一下lvs的负载均衡健康检测功能

将C主机的nginx 80监听端口更改为81

vi /etc/nginx/nginx.conf

nginx高并发架构_第6张图片

 优雅重载nginx配置文件

nginx -s reload

查看A、B主机的keepalived状态与ipvs规则

systemctl status keepalived

ipvsadm -Ln

nginx高并发架构_第7张图片

 可以看到lvs检测到C主机的nginx 80端口有问题就把C主机节点从负载均衡中剔除了

我们现在把C主机的nginx81端口恢复回80端口看看是否会重新加入负载均衡列表

nginx高并发架构_第8张图片

nginx -s reload

 查看keepalived状态和ipvs规则

systemctl status keepalived

ipvsadm -Ln

nginx高并发架构_第9张图片

可以看到C主机的80端口恢复后,lvs将该节点恢复到了负载均衡列表中

再来测试一下keepalived的高可用

 将A主机的keepalived服务停止

systemctl stop keepalived

查看B主机的keepalived服务状态

systemctl status keepalived

ip add |grep ens160

nginx高并发架构_第10张图片

 测试访问vip地址

nginx高并发架构_第11张图片

你可能感兴趣的:(nginx,nginx,架构,java)