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

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

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

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

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

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

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

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

相关推荐
乌鸦乌鸦你的小虎牙43 分钟前
qt 5.12.8 配置报错(交叉编译环境)
开发语言·数据库·qt
一只大袋鼠1 小时前
Redis 安装+基于短信验证码登录功能的完整实现
java·开发语言·数据库·redis·缓存·学习笔记
Anastasiozzzz1 小时前
深入研究Redis的ZSet底层数据结构:从 Ziplist 的级联更新到 Listpack 的完美救场
数据结构·数据库·redis
菠萝蚊鸭1 小时前
x86 平台使用 buildx 基于源码构建 MySQL Wsrep 5.7.44 镜像
数据库·mysql·galera·wsrep
沙漏无语4 小时前
(二)TIDB搭建正式集群
linux·数据库·tidb
头疼的程序员4 小时前
计算机网络:自顶向下方法(第七版)第三章 学习分享(二)
网络·学习·计算机网络
Blurpath住宅代理4 小时前
代理协议深度解析:HTTP与SOCKS5如何科学选型?
网络·静态ip·动态代理·住宅代理
姚不倒4 小时前
三节点 TiDB 集群部署与负载均衡搭建实战
运维·数据库·分布式·负载均衡·tidb
小二·4 小时前
Go 语言系统编程与云原生开发实战(第38篇)
网络·云原生·golang
隔壁小邓4 小时前
批量更新方式与对比
数据库