中大型网站的架构是如何演变的?( 二 )


问题二:能确定伙伴之间公平分散请求吗?
这个问题就具体到了Nginx的均衡算法问题,只有通过合适的算法均衡用户请求到每台服务器上才能保证服务器不打架不撂挑子,否则其中某台服务器不高兴突然间罢工,剩下的服务器可就遭殃了 。
其实Nginx均衡算法总共有十种,但是常用的一般是这两种:
1.LC算法(最近最少使用连接算法)
这种算法的规则其实就是判断哪一台服务器一定时间段内的连接数比较少,就把用户请求分发给它,其实就是谁的活少分配给谁,不能让他太闲也不能让其他服务器太忙,否则就会掐架了 。
2.轮询算法
轮询这种算法还是比较公平的,其实类似我们上学的时候排了一张值日表,周一的时候是小红,周二的时候是小明等等等等,这样就把活平均分配给了每一个人也既每一台服务器 。
3.ip_hash算法
这种算法是通过ip取模的方式制定服务器,首先通过ip字段转换成hash值,将取到的hash值与负载服务器的总数取模,按照模值获取负载ip列表中的服务器,最终确定是哪一台服务器来承载这次请求,这种方式因为ip的hash值一致性原因,每一台ip访问的都是固定的服务器,用的是同一台服务器上的session,从而解决了session一致性的问题 。
问题三:这么多服务器怎么返回用户的请求呢?
其实这个问题换一种问法就是通过什么样的集群搭建模式来处理网络问题,常用的包括下面几种:
1.NAT模式
也称为网络地址传输模式,用户在实际访问项目的时候实际上并不是的时候并不是直接去访问tomcat服务器,而首先要经过第一台Nginx服务器,但是这台服务器的ip是虚拟ip,真实要访问的ip其实是后面的tomcat服务器ip,那么在这一步就需要根据均衡算法在配置中取出后面tomcat服务器的真实ip并做网络跳转,已到达访问的目的,在返回用户请求的时候,也是如此,必须通过tomcat服务器的网络跳转访问到Nginx,继而将请求返回到用户方 。
2.DR模式
也称为直接路由模式,这种方式相较于NAT模式有一个区别就是在返回用户请求的时候,不再通过中间服务器进行转发,而是直接转发给了用户,这样做的目的其实也提高了网络传输的速度,降低了Nginx服务器的压力 。
问题四:用户每次都去跟不一样的伙伴勾兑,这次找伙伴1,下次找伙伴2,那怎么保证session一致呢?
这种情况其实是做负载均衡经常遇到的一个问题,如果不做处理,经常会遇到session丢失的问题,处理这个问题一般有下面几种方法:
1.ip_hash算法固定session
就像上面均衡算法所说的,通过ip的hash值取模,固定访问某台服务器,这样就确保了用户的session每次访问都保存在同一台服务器上,不会出现找不到的现象,从而实现session一致性 。
2.session广播
也称为session复制,就是指每个用户登录之后,只要是访问了我的服务器记录了session,就会把session的信息在所有的服务器上复制一份,这样就能保证每台服务器都包含这个用户的session,当然这也是非常浪费的 。
3.session持久化
其实就是将session的信息保存到数据库、文件或者内存中,用这种持久化的方式将其保存到一台公共服务器上,这样就能确保了session一致性,而我们一般采用的方式就是将其保存到redis中,方便存取而且内存读取的效率很高 。
4.客户端存储
基于cookie实现,将session直接存储到cookie中,这种方案其实不是很安全,虽然能够做到加密,但是道高一尺魔高一丈,总会有方法破解,而且cookie最多只能为4K,大小受到限制 。
上面讲到的这种架构方式,确实能够短期内解决个人博客访问量激增带来的问题,但是有没有想过一个问题,Nginx也是一台服务器,如果他挂了怎么办?还有谁能来给我们分配任务呢?难道让这些伙伴干瞪眼嘛?其实这种情况引出了一个面试题:如何避免单点故障?不慌,接着来看下一种方案 。
 
三、HA高可用+负载均衡+服务器集群 
中大型网站的架构是如何演变的?

文章插图
 
想要解决这种问题,大家一定可以想到,再加一台Nginx不就行了嘛?没错,引入HA高可用就能解决这个问题,HA高可用是目前企业防止核心计算机系统因故障停机的最有效手段,但是如何实现这种高可用让两台Nginx互相切换呢?下面还需要了解两个新鲜的技术:LVS+KeepAlived:
1.LVS实现负载均衡
看到这个小标题,有人可能要喷我,说你都用了Nginx做了负载均衡了,为啥还要用LVS这种东西呢?


推荐阅读