数据库架构演变过程

简介: 背景在互联网初创时期,企业往往采用单体架构去搭建自己的应用系统,但是,随着企业的不断壮大,系统访问量不断随之上升,数据量也急剧增长。数据的存储是首先要解决的问题,在这个大数据时代,数据就是企业的命根子,数据库的单体架构很难满足数据的存储,这时,我们要对数据进行切分,数据的切分又分为垂直切分和水平切分。

背景

在互联网初创时期,企业往往采用单体架构去搭建自己的应用系统,但是,随着企业的不断壮大,系统访问量不断随之上升,数据量也急剧增长。数据的存储是首先要解决的问题,在这个大数据时代,数据就是企业的命根子,数据库的单体架构很难满足数据的存储,这时,我们要对数据进行切分,数据的切分又分为垂直切分和水平切分。

数据切分和数据库架构

在数据切分之前,我们的所有业务都放在一个数据库中,比如:我们的用户业务,商品业务,订单业务。数据库的架构如下:

1571966651393

在业务发展到一定规模时,一个数据库很难满足数据的存储,并且导致数据的访问比较慢,导致用户的流失。这时,我们要对数据进行切分,使其从单一的数据库的存储分散到多个数据库的存储。在进行数据切分时,我们要遵循先垂直水平的原则。

数据的垂直切分也就是数据的纵向切分,按照业务将数据进行切分。在上面的例子中,我们将一个数据库切分为:用户库,商品库,订单库。将原来的一个数据库分为了三个数据库,分散了数据的存储压力,同时也分散了数据的读取压力。如图所示:

1571967238429

但是,随着业务的发展,单个业务库也会遇到存储的瓶颈,比如:用户的急剧增长,导致单一的用户库无法存储,用户访问的速度变慢等。这时,我们就要对数据进行水平切分了,将用户按照某种规则平均分配到多个数据库中,也就是将原来的单一的用户库进行了水平扩展。如图所示:

1571967893765

这里,我们只是水平的拆分了两个库,大家可以根据自己的系统情况,拆分成更多的数据库。

分库分表中间件MyCAT

数据库的整体架构我们规划好了,那么我们在进行开发的时候,怎么确定一条数据从哪个数据库读取呢?或者插入一条数据的时候,这条数据要插入到哪一个数据库呢?数据库的选择是交给开发人员负责呢?还是统一的设置一个代理层呢?开发人员在开发的时候,关注的焦点是业务,复杂的业务已经占据了他们大部分的精力,如果再让他们去考虑数据库的问题,对他们的压力是非常大的,而且每个开发人员的代码风格也不一样,导致项目混乱,臃肿,难以维护。所以,我们往往采用代理层统一处理数据的分片,这时,我们的MyCAT分库分表中间件就登场了,它去做统一的数据库层的代理。如图:

1571968892640

MyCAT统一做数据库层的代理,对外暴露一个地址,应用系统直接连接MyCAT,就像连接普通的MySQL一样,没有任何的区别。所有的CRUD操作都直接对应MyCAT,再由MyCAT做具体的数据分片,数据分片的过程对于开发人员来说是透明的,不需要额外的处理,这样,开发人员只需要关注业务就可以了。

MyCAT集群

可用性对于一个系统来说是非常重要的,尤其是在当今的互联网时代,系统宕机1分钟,带来的损失都是非常严重的,所以,我们在搭建系统时,往往采用集群方式,某一个节点的不可用,不影响整体系统的可用性。在前面的例子中,我们所有的节点都是单节点,存在着单点故障,这是我们不希望看到的,所以我们要搭建集群。6个业务数据库我们都可以做主从,这时,用户1库可以搭建为 用户1(主)和用户1(从),用户2库可以搭建为 用户2(主)和用户2(从)。订单库和商品库也可以做同样的操作,如图:

1571970520540

这样我们的业务数据库不存在单点故障了,但是MyCAT成为了单点,如果MyCAT发生故障,或者MyCAT承载了大量的数据库的请求,MyCAT成了整个系统的唯一瓶颈。那么MyCAT我们如何搭建集群呢?有的小伙伴可能会说了,我们再部署一个MyCAT,这个MyCAT和前一个MyCAT配置一样就可以了。是的,这只是其中的第一步,我们有了两个MyCAT连接数据库,那么我们的应用系统也需要连接两个MyCAT吗?两个MyCAT我们要如何分配请求呢?这是不是又增加了应用系统的复杂性呢?所以,我们在两个MyCAT上面再增加一个负载均衡器,它可以将请求按照某种规则分配到两个MyCAT上,这个负载均衡器我们采用HAProxy。整体架构如图:

1571971467183

这样MyCAT的单点故障解决了,但是HAProxy又成了单点,这是不是很有意思,似乎总有一个单点解决不了。在这里最后一个单点HAProxy,我们使用KeepAlived做故障转移就可以解决了,两个KeepAlived可以提供一个虚拟IP,业务系统直接连接这个虚拟IP,后面的过程对于应用系统是透明的。如图所示:

1571971864731

这就是我们最终的数据库架构,不存在任何的单点故障。

分布式事务与分布式ID

进行了分库分表后,随之而来的问题也就出现了,那就是ID的问题和分布式事务的问题,分布式ID和分布式事务在MyCAT中都有相应的解决方案,我们在MyCAT中进行配置就可以了。
如果想要深入学习,请关注《JAVA架构师成长体系课》

目录
相关文章
|
10月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
771 6
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
392 1
|
9月前
|
存储 关系型数据库 数据库
高性能云盘:一文解析RDS数据库存储架构升级
性能、成本、弹性,是客户实际使用数据库过程中关注的三个重要方面。RDS业界率先推出的高性能云盘(原通用云盘),是PaaS层和IaaS层的深度融合的技术最佳实践,通过使用不同的存储介质,为客户提供同时满足低成本、低延迟、高持久性的体验。
|
10月前
|
存储 Cloud Native 关系型数据库
PolarDB开源:云原生数据库的架构革命
本文围绕开源核心价值、社区运营实践和技术演进路线展开。首先解读存算分离架构的三大突破,包括基于RDMA的分布式存储、计算节点扩展及存储池扩容机制,并强调与MySQL的高兼容性。其次分享阿里巴巴开源治理模式,涵盖技术决策、版本发布和贡献者成长体系,同时展示企业应用案例。最后展望技术路线图,如3.0版本的多写多读架构、智能调优引擎等特性,以及开发者生态建设举措,推荐使用PolarDB-Operator实现高效部署。
478 4
|
11月前
|
负载均衡 算法 关系型数据库
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL集群架构负载均衡故障排除与解决方案
本文深入探讨 MySQL 集群架构负载均衡的常见故障及排除方法。涵盖请求分配不均、节点无法响应、负载均衡器故障等现象,介绍多种负载均衡算法及故障排除步骤,包括检查负载均衡器状态、调整算法、诊断修复节点故障等。还阐述了预防措施与确保系统稳定性的方法,如定期监控维护、备份恢复策略、团队协作与知识管理等。为确保 MySQL 数据库系统高可用性提供全面指导。
|
人工智能 JavaScript 安全
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
644 13
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
|
12月前
|
存储 SQL 并行计算
【赵渝强老师】达梦数据库MPP集群的架构
达梦数据库提供大规模并行处理(MPP)架构,以低成本实现高性能并行计算,满足海量数据存储和复杂查询需求。DM MPP采用完全对等无共享体系,消除主节点瓶颈,通过多节点并行执行提升性能。其执行流程包括主EP生成计划、分发任务、各EP并行处理及结果汇总返回。为确保高可用性,建议结合数据守护部署。
450 0
|
SQL 弹性计算 安全
【上云基础系列04】基于标准架构的数据库升级
本文回顾了业务上云从基础到进阶的理念,涵盖基础版和全栈版架构。在“入门级:上云标准弹性架构基础版”的基础上,本文针对数据库升级,重点介绍了高可用数据库架构的升级方案,确保数据安全和业务连续性。最后,附有详细的“上云标准弹性架构”演进说明,帮助用户选择合适的架构方案。
|
Kubernetes Cloud Native Docker
云原生之旅:从传统架构到容器化服务的演变
随着技术的快速发展,云计算已经从简单的虚拟化服务演进到了更加灵活和高效的云原生时代。本文将带你了解云原生的概念、优势以及如何通过容器化技术实现应用的快速部署和扩展。我们将以一个简单的Python Web应用为例,展示如何利用Docker容器进行打包和部署,进而探索Kubernetes如何管理这些容器,确保服务的高可用性和弹性伸缩。