《大型网站系统与Java中间件实践》--大型网站及其架构的演进过程(下)

1.数据读压力变大,读写分离吧

1.1采用数据库作为读库

  对于大型网站而言,有不少业务是读多写少的,这中情况也是直接反映都数据库上,那么对于这样的情况,我们可以采取读写分离的形式,这个结构的变化会带来两个问题:

  • 数据复制到读库的问题
  • 应用对于数据源的选择问题

  数据库系统一般都提供了数据复制的功能,这一机制可以解决数据复制的问题,但是这一机制可能会存在一定的延迟的问题,导致短期内数据不一致,同时复制过程中数据的源和目标之间的映射关系以及过滤条件的支持问题,
  对于应用来说,增加一个读库对结构变化有一个影响,即我们的应用需要针对不同的情况选择不同的数据源。写操作要走主库,事务中的读操作也要走主库,而我们也要考虑到备库数据相对于主库数据的延迟。就是说即便不是在事务中的读,考虑到备库的数据延迟,不同业务下的选择也会有差异。

2 加入数据读取的利器——缓存

  缓存,也就是我们常说的Cache,下面我们会讨论大型网站里起到缓存作用的一些系统,以及缓存的一些用法,并看看缓存是否可以看做一个读库

2.1 数据缓存

  大型网站系统中的数据缓存主要用于分担数据库的读的压力,类似于上文的分离读库,以及搜索引擎。
  缓存系统一般是用来保存和查询键值对的,而一般情况下,我们在缓存中存放的是“热”数据,而不是全部数据。因此,缓存的填充方式就是通过应用去完成的。即应用访问缓存,如果数据不存在,则从数据库中读取数据后放入缓存。当缓存容量不够时,最近不被访问的数据就被清除了。当然,在数据库数据发生变化时,我们需要及时更新缓存中的数据,这样就不会造成数据读取失效。

2.2. 页面缓存

  数据缓存可以加速应用在响应请求时的速度读取速度。但是最终反馈给用户的还是页面,有些动态产生的页面或是其中的一部分特别“热”,我们就可以对这些内容进行缓存,这种缓存方式就是页面缓存。

2.3 小结

  对于使用缓存内加速数据读取的情况,一个很关键的指标是缓存命中率,如果缓存命中率比较低的话,大部分请求还是必须去查询数据库。此外,数据的分布与更新策略也需要结合具体的场景考虑,从分布上来说,我们主要考虑的问题是需要有机制的去避免局部的热点。 并且缓存服务器扩容或者缩容要尽量平滑(一致性Hash会是不错的选择)。而在缓存数据的更新上,会有定时失效,数据变更时失效,数据变更时更新等不同的选择。

3 弥补关系型数据库的不足,引入分布式存储系统

  在有些场景下,我们所习惯使用的关系型数据库并不是很合适,这个时候,分布式存储系统就孕育而生了。分布式存储系统在大型网站中具有非常广泛的用途。常见的分布式存储系统包括以下三种

  • 分布式文件系统:就是在分布式环境中由多个节点组成的功能与单机系统一样的文件系统,它是弱格式的。内容的格式需要使用者自己来组织。例如MongoDB。解决大文件和小文件的存储问题
  • 分布式Key -Value系统:相对分布式文件系统会更加格式化一些。提供了高性能的半结构化的数据存储支持
  • 分布式数据库:最格式化的方式。能够支持大数据量和高并发。

      分布式存储系统通过集群提供了一个高容量,高并发访问,数据冗余容灾的支持。可以帮助我们有效解决大型网站中的大数据量和高并发的问题。

4 读写分离后,数据库又遇到新瓶颈

  尽管上述读写分离,分布式存储系统,缓存等方式能够降低主库的压力,解决数据存储方面的问题,但是随着业务的发展,我们的主库也会遇到瓶颈。对此,我们有数据垂直拆分和水平拆分两种选择

4.1 专库专用,数据垂直拆分

  垂直拆分的意思就是把数据库中不同的业务数据拆分到不同的数据库中。但是这增加了我们的数据源配置,不过也同时减少了每个数据库连接池的连接数量,。同时我们需要考虑的是如何处理原来单机中跨业务的事务。一种办法是采用分布式事务,其性能明细要低于之前的单机事务。另一种方式是去掉事务或者不去追求强事务支持。则原来在单库中可以使用的表关联查询也就需要改变实现了。
  对数据进行垂直拆分后,解决了把所有业务数据放在一个数据库中的压力问题,并且也可以根据不同业务的特点,进行更多的优化。

4.2 垂直拆分之后的单机遇到瓶颈,数据水平拆分

  数据水平拆分就是把同一个表中的数据拆分到两个数据库中,产生数据水平拆分的原因是某个业务的数据表的数据量或者更新量达到了单个数据库的瓶颈。数据水平拆分之后

  • 访问用户信息的应用系统,需要解决SQL路由问题,即我们在操作数据时,需要知道我们需要操作的数据在那个数据库中。
  • 主键的处理也会不同。原来依赖单个数据库的一些机制例如oracle的Sequence或是自增字段无法继续使用。
  • 由于同一个业务的数据被拆分到不同的数据库中,因此一些查询需要从两个数据库中取数据,如果数据量大需要分页,就比较难处理了。

5 数据库问题解决后,应用面对的新的挑战

  随着业务发展,应用的功能会越来越多,应用也会越来越大,到这个时候,我们就需要将应用拆分开。这里也有两种方式

5.1 拆分应用

  根据业务的特性把应用拆分开,这样这些业务应用之间不存在直接对的调用。不过这样会使得不同的系统中会有一些相似的代码,如何对这些代码复用是一个问题。

5.2 走服务化的道路

  我们将提供不同业务的服务包装成不同的服务中心,上层的Web系统只需要来调用服务中心所提供的服务即可。而服务中心则负责去调取底层的数据库。这与之前的不同

  • 业务功能之间的访问引入远程调用
  • 共享的代码只存在于各个业务中心
  • 连接数据库的任务只存在与业务中心,前端Web系统只关注页面交互效果的实现。
  • 通过服务化,能够拆分原来的大团队,对代码也实现了解耦

5 初始消息中间件

  消息中间件即面向消息的系统,是在分布式系统中完成消息的发送和接收的基础软件。消息中间件提供了异步和解耦的优点。消息中间件的内容将会在后续的博客中陆续讲到。

6 总结

  上述只是大型网站普遍会经历的一个演进过程,在实际过程中不可一概而论。当我们遇到相应的问题时,不妨试试上述的解决方案,说不定能够解决你的问题

参考书籍: 曾宪杰 《大型网站系统与Java中间件实践》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值