传统数据处理系统存在的问题

传统应用的数据系统架构设计时,应用直接访问数据库系统。当用户访问量增加时,数据库无法支撑日益增长的用户请求的负载,从而导致数据库服务器无法及时响应用户请求,出现超时的错误。

出现这种情况以后,在系统架构上就采用如图1的架构,在Web服务器和数据库中间加入一层异步处理的队列,缓解数据库的读写压力。

图1 在服务器和数据库中增加异步队列缓冲隔离

当Web服务器收到页面请求时,会将消息添加到队列中。在数据库端,创建一个工作处理层定期从队列中取出消息进行处理,例如每次读取100条消息。这相当于在两者之间建立了一个缓冲。

但是,这一方案并没有从本质上解决数据库过载(Overload)的问题,且当工作处理层无法跟上业务对于数据修改的请求时,就需要增加多个工作处理层并发执行,数据库又将再次成为响应请求的瓶颈。一个解决办法是对数据库进行分区(Horizontal Partitioning)。分区的方式通常以Hash值作为key。这样就需要应用程序端知道如何去寻找每个key所在的分区。

但即便如此,问题仍然会随着用户请求的增加接踵而来。当之前的分区无法满足负载时,就需要增加更多分区,这是就需要对数据库进行reshard。resharding的工作非常耗时而痛苦,因为需要协调很多工作,例如数据的迁移、更新客户端访问的分区地址,更新应用程序代码。如果系统本身还提供了在线访问服务,对运维的要求就更高。这种情况下,就可能导致数据写到错误的分区,因此必须要编写脚本来自动完成,且需要充分的测试。

由此可见,在数据层和应用中增加了缓冲隔离,数据量的日渐增多仍然迫使传统数据仓库的开发者一次又一次挖掘系统,试图在各个方面寻找一点可提升的性能。架构变得越来越复杂,增加了队列、分区、复制、重分区脚本(Resharding Scripts)。应用程序还需要了解数据库的schema,并能访问到正确的分区。问题在于:数据库对于分区是不了解的,无法帮助你应对分区、复制与分布式查询。

相关推荐
网安墨雨36 分钟前
TCP/IP网络协议攻击
网络·网络协议·tcp/ip
dami_king1 小时前
SQL如何添加数据?|SQL添加数据示例
数据库·sql·db
网安墨雨1 小时前
网络一些术语
网络
儒道易行1 小时前
【SQLi_Labs】Basic Challenges
数据库·web安全·网络安全
Clarkbrave1 小时前
PHP框架+gatewayworker实现在线1对1聊天--mysql数据库(3)
数据库·mysql·php
程序员志哥1 小时前
并发编程系列(七) -本地线程ThreadLocal介绍
java·数据库
乐维_lwops2 小时前
万里数据库GreatSQL监控解析
数据库·oracle·数据库监控·运维监控
白鹭座2 小时前
第1关:博客系统数据库设计与实现之查询
数据库·oracle
huaqianzkh2 小时前
详细了解Redis集群切片
数据库·redis·系统架构
Ai 编码助手2 小时前
导致MySQL索引失效的原因有哪些?
数据库·mysql