大型Web网站架构演变之9大阶段(2)
负载均衡器根据请求的目的IP地址,找出该IP地址最近使用的“服务器组”,注意,并不是具体某个服务器,然后采用最少连接数从该组中挑出具体的某台服务器出来,把请求转发之。若该服务器超载,那么根据最少连接数算法,在集群的非本服务器组的服务器中,找出一台服务器出来,加入本服务器组,然后把请求转发。 3、集群请求返回模式问题 1)、NAT 负载均衡器接收用户的请求,转发给具体服务器,服务器处理完请求返回给均衡器,均衡器再重新返回给用户。 2)、DR 负载均衡器接收用户的请求,转发给具体服务器,服务器出来玩请求后直接返回给用户。需要系统支持IP Tunneling协议,难以跨平台。 3)、TUN 同上,但无需IP Tunneling协议,跨平台性好,大部分系统都可以支持。 4、集群Session一致性问题 1)、Session Sticky Session sticky就是把同一个用户在某一个会话中的请求,都分配到固定的某一台服务器中,这样我们就不需要解决跨服务器的session问题了,常见的算法有ip_hash算法,即上面提到的两种散列算法。
2)、Session Replication Session replication就是在集群中复制session,使得每个服务器都保存有全部用户的session数据。
3)、Session数据集中存储 Session数据集中存储就是利用数据库来存储session数据,实现了session和应用服务器的解耦。
4)、Cookie Base Cookie base就是把Session存在Cookie中,由浏览器来告诉应用服务器我的session是什么,同样实现了session和应用服务器的解耦。
值得一提的是:
解决了以上的问题之后,系统的结构如下: 阶段四、数据库读写分离化 上面我们总是假设数据库负载正常,但随着访问量的的提高,数据库的负载也在慢慢增大。那么可能有人马上就想到跟应用服务器一样,把数据库一份为二再负载均衡即可。 但对于数据库来说,并没有那么简单。假如我们简单的把数据库一分为二,然后对于数据库的请求,分别负载到A机器和B机器,那么显而易见会造成两台数据库数据不统一的问题。那么对于这种情况,我们可以先考虑使用读写分离和主从复制的方式。 读写分离后的系统结构如下: 这个结构变化后也会带来两个问题:
解决方案:
阶段五、用搜索引擎缓解读库的压力 数据库做读库的话,常常对模糊查找力不从心,即使做了读写分离,这个问题还未能解决。以我们所举的交易网站为例,发布的商品存储在数据库中,用户最常使用的功能就是查找商品,尤其是根据商品的标题来查找对应的商品。对于这种需求,一般我们都是通过like功能来实现的,但是这种方式的代价非常大,而且结果非常不准确。此时我们可以使用搜索引擎的倒排索引来完成。 搜索引擎具有的优点:它能够大大提高查询速度和搜索准确性。 引入搜索引擎的开销
搜索引擎并不能替代数据库,它解决了某些场景下的精准、快速、高效的“读”操作,是否引入搜索引擎,需要综合考虑整个系统的需求。 引入搜索引擎后的系统结构如下: 阶段六、用缓存缓解读库的压力 常用的缓存机制包括页面级缓存、应用数据缓存和数据库缓存。 应用层和数据库层的缓存 (编辑:ASP站长网) |