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

  • 需要维护搜索引擎集群
  • 搜索引擎并不能替代数据库,它解决了某些场景下的精准、快速、高效的“读”操作,是否引入搜索引擎,需要综合考虑整个系统的需求 。
    阶段六、用缓存缓解读库的压力
    常用的缓存机制包括页面级缓存、应用数据缓存和数据库缓存 。
    应用层和数据库层的缓存
    随着访问量的增加,逐渐出现了许多用户访问同一部分热门内容的情况,对于这些比较热门的内容,没必要每次都从数据库读取 。我们可以使用缓存技术,例如可以使用Google的开源缓存技术Guava或者使用Memecahed作为应用层的缓存,也可以使用Redis作为数据库层的缓存 。
    另外,在某些场景下,关系型数据库并不是很适合,例如我想做一个“每日输入密码错误次数限制”的功能,思路大概是在用户登录时,如果登录错误,则记录下该用户的IP和错误次数,那么这个数据要放在哪里呢?假如放在内存中,那么显然会占用太大的内容;假如放在关系型数据库中,那么既要建立数据库表,还要简历对应的Java bean,还要写SQL等等 。而分析一下我们要存储的数据,无非就是类似{ip:errorNumber}这样的key:value数据 。对于这种数据,我们可以用NOSQL数据库来代替传统的关系型数据库 。
    页面缓存
    除了数据缓存,还有页面缓存 。比如使用HTML5的localstroage或者Cookie 。除了页面缓存带来的性能提升外,对于并发访问且页面置换频率小的页面,应尽量使用页面静态化技术 。
    • 优点:减轻数据库的压力,大幅度提高访问速度;
    • 缺点:需要维护缓存服务器,提高了编码的复杂性 。
    值得一提的是:
    缓存集群的调度算法不同与上面提到的应用服务器和数据库 。最好采用一致性哈希算,这样才能提高命中率 。
    阶段七、数据库水平拆分与垂直拆分
    我们的网站演进到现在,交易、商品、用户的数据都还在同一个数据库中 。尽管采取了增加缓存和读写分离的方式,但随着数据库的压力继续增加,数据库数据量的瓶颈越来越突出,此时,我们可以有数据垂直拆分和水平拆分两种选择 。
    数据垂直拆分
    垂直拆分的意思是把数据库中不同的业务数据拆分到不同的数据库中,结合现在的例子,就是把交易、商品、用户的数据分开 。
    优点:
    • 解决了原来把所有业务放在一个数据库中的压力问题;
    • 可以根据业务的特点进行更多的优化 。
    缺点:
    • 需要维护多个数据库的状态一致性和数据同步 。
    问题:
    • 需要考虑原来跨业务的事务;
    • 跨数据库的Join 。
    解决问题方案:
    • 应该在应用层尽量避免跨数据库的分布式事务,如果非要跨数据库,尽量在代码中控制 。
    • 通过第三方中间件来解决,如上面提到的MyCat,MyCat提供了丰富的跨库Join方案,详情可参考MyCat官方文档 。
    数据水平拆分
    数据水平拆分就是把同一个表中的数据拆分到两个甚至多个数据库中 。产生数据水平拆分的原因是某个业务的数据量或者更新量到达了单个数据库的瓶颈,这时就可以把这个表拆分到两个或更多个数据库中 。
    优点:
    • 如果能克服以上问题,那么我们将能够很好地对数据量及写入量增长的情况 。
    问题: