大型网站架构演变之9大阶段 什么是大型网站( 三 )


4、集群Session一致性问题
1、Session Sticky

Session sticky就是把同一个用户在某一个会话中的请求,都分配到固定的某一台服务器中,这样我们就不需要解决跨服务器的session问题了,常见的算法有ip_hash算法,即上面提到的两种散列算法 。
  • 优点:实现简单;
  • 缺点:应用服务器重启则session消失 。
2、Session Replication
Session replication就是在集群中复制session,使得每个服务器都保存有全部用户的session数据 。
  • 优点:减轻负载均衡服务器的压力,不需要要实现ip_hasp算法来转发请求;
  • 缺点:复制时网络带宽开销大,访问量大的话Session占用内存大且浪费 。
3、Session数据集中存储
Session数据集中存储就是利用数据库来存储session数据,实现了session和应用服务器的解耦 。
  • 优点:相比Session replication的方案,集群间对于宽带和内存的压力大幅减少;
  • 缺点:需要维护存储Session的数据库 。
4、Cookie Base
Cookie base就是把Session存在Cookie中,由浏览器来告诉应用服务器我的session是什么,同样实现了session和应用服务器的解耦 。
  • 优点:实现简单,基本免维护 。
  • 缺点:cookie长度限制,安全性低,带宽消耗 。
值得一提的是:
  • Nginx目前支持的负载均衡算法有wrr、sh(支持一致性哈希)、fair(lc) 。但Nginx作为均衡器的话,还可以一同作为静态资源服务器 。
  • Keepalived + ipvsadm比较强大,目前支持的算法有:rr、wrr、lc、wlc、lblc、sh、dh
  • Keepalived支持集群模式有:NAT、DR、TUN
  • Nginx本身并没有提供session同步的解决方案,而Apache则提供了session共享的支持 。
阶段四、数据库读写分离化
上面我们总是假设数据库负载正常,但随着访问量的的提高,数据库的负载也在慢慢增大 。那么可能有人马上就想到跟应用服务器一样,把数据库一份为二再负载均衡即可 。
但对于数据库来说,并没有那么简单 。假如我们简单的把数据库一分为二,然后对于数据库的请求,分别负载到A机器和B机器,那么显而易见会造成两台数据库数据不统一的问题 。那么对于这种情况,我们可以先考虑使用读写分离和主从复制的方式 。
这个结构变化后也会带来两个问题:
  • 主从数据库之间数据同步问题 。
  • 应用对于数据源的选择问题 。
解决方案:
  • 使用MySQL自带的Master + Slave的方式实现主从复制 。
  • 采用第三方数据库中间件,例如MyCat 。MyCat是从Cobar发展而来的,而Cobar是阿里开源的数据库中间件,后来停止开发 。MyCat是国内比较好的MySql开源数据库分库分表中间件 。
阶段五、用搜索引擎缓解读库的压力
数据库做读库的话,常常对模糊查找力不从心,即使做了读写分离,这个问题还未能解决 。以我们所举的交易网站为例,发布的商品存储在数据库中,用户最常使用的功能就是查找商品,尤其是根据商品的标题来查找对应的商品 。对于这种需求,一般我们都是通过like功能来实现的,但是这种方式的代价非常大,而且结果非常不准确 。此时我们可以使用搜索引擎的倒排索引来完成 。
搜索引擎具有的优点:它能够大大提高查询速度和搜索准确性 。
引入搜索引擎的开销