开发者学堂课程【企业级互联网分布式系统应用架构学习:数据库架构设计优化-读写分离】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/503/detail/6746
数据库架构设计优化-读写分离
我们在上章节提到了提高应用并发度的几个方式,例如应用层横向扩展,使用应用层缓存,同步转异步的一些操作。本章节我们介绍的是数据库处理能力及提高io能力。
众所周知,在整个互联网架构里,最难进行横向扩展的是数据库,主要是因为在数据库层所有数据库实例为了保证数据的 ACID 原则,它要进行统一的数据存储。最终的数据存储会成为数据库并发的瓶颈,所以现在很多数据库技术通过其他方式来降低一些访问压力。
其中一个手段是读写分离,即,对数据库的操作主要分为两类,一类是读:select,可能只是为了判断条件,最终都是通过 select 这个命令来获取它应用所需要的一些数据。
另外一类是写:insert,delete,update。在数据库的整体设计中,写操作一般并发度都比较低,因为为了数据的一致性和隔离性考虑,写操作的过程中要对数据严格的加锁操作,为了避免应用读到锁数据。当所的级别比较高时,就会影响到读的操作,甚至可能把数据库中的读操作悬挂或堵塞在一边,只有写的操作完成后,读的操作才能进行下去。例如库存扣减的交易,当应用表对库存进行更新时,若某一个商品的库存是100,当我们把它扣减成95时,在这个过程中,这条记录是被严格加锁的,其他应用来读取这个库存,需要等待库存更新。
所以我们可以看出,读操作和写操作在同一个数据上执行,他们相互之间是影响的,写操作会影响到堵车做的效率,当一个主库有大量的写操作的情况下,读操作的效率就无法提升,所以用户处理应用的整个性能就会有问题。所以在大型的互联网架构设计中,我们会通过一系列的技术将读操作和写操作进行分离。
如上图,我们可以看出据库的复制技术将主库的数据复制到只读库或备库的数据库中,通过应用的分解,只要涉及到读操作的一些应用逻辑都把它转到读库中去,只要涉及到写操作,如刚刚所提及到的更新,删除这些数据应用就会把它转发到主库上进行操作。
解决只读库和主库之间数据的复制需要一些技术的配合,主要保证数据的延时一定要低,否则在主库上做的一些写入操作,如更新,若没有及时的反馈到只读库,应用取过去就会导致应用逻辑上的一些错误。在这现在的一些数据库,如阿里云都有一些很成熟的技术,来保证主库可以快速的将数据复制到只读库中,主要是通过数据库的同做日志来同步到只读库上。
同时在一些访问并发度很大的应用场景中,只读库也会有多个,所以图库需要将变化的数据复制到多个存库中。通过数据库的读写分离,我们可以达到几个目的:
一是降低主库压力,提升应用处理速度;大量的并发查询访问都被转移到只读库上,所以主库的压力会降低,带来的好处是应用处理的速度会加快。例如过去的一个更新操作需要500毫秒,由于查询被转移到其他只读库上,他的更新速度可能会降低到100毫秒。
二是通过只读库提升应用查询速度。在以前没有只读库的情况下,所有的请求都需要在主库和更新操作进行混合的操作,会严重影响到查询的速度。有了只读库,其目的是为了查询使用,可以大大提升应用的响应速度,尤其是查询,例如,查询库存这样的操作都会有大大的提升。
甚至我们可以在只读库上进行一些比较复杂的查询,因为它不会影响到主的业务操作。所以读写分离也为一些场景进行业务分析的应用提供一些帮助。
这个架构也有一定的限制,三是适于能接受数据同步时有一定数据延迟的应用。
例如库存的场景,若我们一定限制的库存不能超慢,超慢指的是当库存中有100个商品,这样的场景在一定程度下不能用读写分离,当它允许超慢,读写分离是最佳的应用架构思路。
从阿里云场景视角,我们可以将只读库和主库分离这样的技术配置工作降低到最低,在阿里云的控制界面上有一个界面,若需要只读实例,
我们可以直接点击按钮进行只读实例的购买,后续的只读库和主库之间的数据同步工作,都已在底层完成,对应用非常简单,也降低了一些工作。
此章节我们学习了用只读库降低数据库的压力,同时提升并发度,使得应用的反应速度大大提升,为一些业务分析场景提供帮助。