之前我们讲的是用nginx做一个简单的helloworld功能,帮助大家了解一下nginx中的基本框架,今天我们就来学习下如何用nginx实现一个负载均衡服务器。
为什么要先讲nginx的负载均衡模块呢?主要是nginx现在在各个大厂的应用场景主要就是做7层负载均衡和一些CDN能力了。我们还是先不急讲如何开发,先来聊聊什么是负载均衡,大厂都是怎么做负载均衡的。
首先什么是负载均衡呢?很简单,就是服务器(后面我们称之为server_proxy)收到client的消息请求后,并不做处理,而是根据一定的策略将其转发给负载列表内的一台子服务器,由子服务器将这个请求处理完后再将结果返回给client。这个过程server_proxy扮演的角色就叫负载均衡器(LB,load balancer),这个功能也叫反向代理。
为什么需要负载均衡呢?由于当client并发数量到达一定程度后,单个服务器是没有办法支撑这么多业务的,那么我们首先想到的办法是增加服务器数量,那么这一堆服务器我们就叫他集群,但服务器多了,总不能每个服务器都给个ip,然后申请个域名让用户去访问吧,这个时候就衍生出了负载均衡技术,给LB一个ip,然后DNS服务器记录的域名对应ip就是LB的ip了,可以看到,负载均衡就是做了一道转发嘛,nginx的负载均衡能力怎么样呢?出于epoll的高效,可以做到单机上万QPS。
问题又来了,单机上万就够了吗?首先这个单机百万就是个理想数字,实际上LB还要随时处理负载的集群下的各个子服务器的心跳包,还要和子服务器各种打交道。实际处理client的QPS达到理想状态一半就很不错了。想想双11的时候,可不止几十万人在等着12点那一波吧。
怎么解决,我们首先想到的就是多个集群,但是多个集群又怎么负载均衡呢?这就需要转发能力更强的软件了。这里给大家说一下LVS,LVS的出现比nginx还要早的多,但是LVS是做的4层负载均衡(所谓四层就是工作在OSI七层模型的第四层,传输层),现在用的比较多的就是LVS-tunnel或者LVS-DR模式,关于LVS这里就不展开讲了,大致说下,LVS-tunnel是在收到的ip数据包上再包一层ip数据包,目的ip变成根据负载策略选取的子服务器ip,LVS-DR则是修改数据包中的目的MAC地址为根据负载策略选取的子服务器的MAC地址。
其实这样还是无法满足所有需求,还有一种负载均衡方式,DNS负载均衡,DNS负载均衡就更简单了,当你在浏览器输入域名后,需要去公司DNS服务器下找对应的ip,一般大厂的DNS服务器下,一个域名都挂着几个公网ip,在DNS服务器这里根据你的地理位置或者干脆就随机给你个ip,也做到了一定的负载均衡,其实这是最早的负载均衡策略,由于浏览器会缓存一段时间的DNS消息,所有这种策略作为单个的负载均衡策略是很不靠谱的。
我们来看一下,一般一个大厂的整个服务器架构是怎么样的
Nginx的角色就是7层负载均衡,所谓7层负载均衡,就是根据应用层的数据来做负载均衡,也就是根据业务做请求分发了,由于https的普及和规范化,Nginx还承担着ssl卸载的责任,同时,nginx也是一个良好的CDN建设工具,所谓CDN(内容分发网络),就是,在一些离用户地理位置比较近的地方的服务器缓存一些静态消息。这样达到的效果是,在用户加载浏览器页面时。首先先显示一些静态的页面,然后再显示出一些ajax数据等等,提升用户的体验。
下一篇文章我们就正式开始学习如何用Nginx搭建一个负载均衡器。