企业架构LNMP高可用负载均衡服务器之Nginx

一、背景描述及其方案设计

1、业务背景描述

时间:2011.6.-2013.9

发布产品类型:互联网动态站点 商城

⽤户数量: 4000-8000(用户量猛增)

PV : 16000-100000(24⼩时访问次数总和)

QPS: 50-100*(每秒访问次数)

DAU: 400-800(每日活跃用户数)

随着业务量骤增,之前单点服务器,已经不能够满足业务使用需要,主服务器宕机,备服务器提供服务,因为流量太大,备也宕机。需要多台服务器,同时提供服务

2、模拟运维设计方案

img

以上架构服务器,已经不能够满足以上提到的业务需求。架构发生如下变化

img

二、服务器基本环境部署

1、克隆复制虚拟机

server01 web1 192.168.17.101

server02 mysql 192.168.17.102

server03 web2 192.168.17.103

server04 lb load balance 192.168.17.104

2、FQDN配置

3、网络配置和检测

根据之前的配置方式实现以上配置

在很多配置服务中,需要多台服务器的时间是一致的,不要忘记了ntp服务器校时

三、负载均衡服务器搭建

1、引入负载均衡技术

负载均衡技术 (load blance) 是一种概念 要去把一些资源使用平均分配。

负载均衡:分发流量、请求到不同的服务器。使流量平均分配(理想的状态的)

作用:服务器容灾 流量分发

①流量分发 请求平均 降低单例压力

②安全 隐藏后端真实服务

③屏蔽非法请求(七层负载均衡)

2、负载均衡分类

img

1)二层负载均衡(mac)

根据OSI模型分的二层负载,一般是用虚拟mac地址方式,外部对虚拟MAC地址请求,负载均衡接收后分配后端实际的MAC地址响应

2)三层负载均衡(ip) DNS

一般采用虚拟IP地址方式,外部对虚拟的ip地址请求,负载均衡接收后分配后端实际的IP地址响应

3)四层负载均衡(tcp) 网络层面的负载均衡

在三层负载均衡的基础上,用ip+port接收请求,再转发到对应的机器

4)七层负载均衡(http) 智能型负载均衡

根据虚拟的url或IP,主机接收请求,再转向(反向代理)相应的处理服务器

3、常见实现方式

硬件级别 F5 BIG-IP 性能好 价格高 几万到几十万不等

软件级别 性价比高

lvs linux下分发软件 四层 ip+port NAT lvs内核支持 IPVS配置调度

nginx upstream功能分发 七层应用层分发 http 等等 也可以基于四层

haproxy 四层 七层负载均衡

一般用 LVS 做四层转发,Nginx做七层转发

img

七层可以进行智能的配置,确认图片访问哪个服务器,其他资源访问哪个服务器,对应的图片服务器带宽调整。资源访问服务器也可以对应开启GZIP压缩

四层的网络层数据转发,没有“请求”的概念

img

4、Nginx负载均衡配置

此处负载均衡使用七层的负载均衡方式,nginx的Module ngx_http_upstream_module

请求先去负载均衡服务器,所以要先解析域名到负载均衡

img

配置负载均衡,只需要修改做为负载均衡服务器的nginx即可,也就是在架构中的server04服务器

①在server04 load balance 修改配置

img

负载均衡的nginx不提供页面和php都不进行反回和解析,全部转发代理到后端

img

②查看并确认web服务器配置

识别真实IP ,需要在web服务器上配置set_real_ip_from 代表从哪儿来源的IP需要识别真实IP

set_real_ip_from 语法是ngx_http_realip_module模块提供的,需要编译安装的时候构建。

set_real_ip_from 配置负载均衡的IP

img

5、查看负载均衡效果

为了能够看到分发到不同服务器的效果,可以在server01和server03的访问页面中,写入不同的信息,来测试效果。真实的业务环境中,用户是无需知道访问的是哪个服务器。

①在server01和server03的页面文件写入不同的内容

img

img

img

②测试访问效果

img

img

当web服务器,有宕机,负载均衡服务器会自动切换服务到其他可用服务器

upstream中的分发之后的几个关键字:

backup 备 其他的没有backup标识的都无响应,才分发到backup

img

down 此条配置,不会被分发到

img

访问管理后端页面,登录发现验证码不通过

原因:

①比如分发到web1服务器,生成验证码,存储到session中,默认在服务器本地

②再次校验的时候,请求分发到web2服务器了,所有验证码一直校验不通过

img

解决方案思路:

①生成和验证session都请求同一台服务器

②共享session nfs mysql ==内存缓存软件(memcached、redis)==

6、Nginx的负载均衡算法

Nginx 官方默认3种负载均衡的算法

①==Round-Robin RR轮询(默认)== 一次一个的来(理论上的,实际实验可能会有间隔)

②==weight 权重== 权重高多分发一些 服务器硬件更好的设置权重更高一些

server01 web 1 2 1 1

server03 web 2 6 1 1 1 1 1 1

8次中,server01分发5次,server03分发3次

img

img

③==ip_hash==

同一个IP,所有的访问都分发到同一个web服务器

img

7、实现负载均衡高可用

所有的请求流量,都要经过负载均衡服务器,负载均衡服务器压力很大,防止它宕机,导致后端服务所有都不可用,需要对负载均衡服务器,做高可用

img

配置server04和server05互为高可用

server04是master

img

server05 是backup

img