数据库架构的演变

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介:
 最近看了很多公司架构的演变的 文章,发现其中的基本思路和架构演变都很类似,这里也总结一下 数据库架构的演变以及演变背后的思路。
   单主机
  最开始网站一般都是由典型的LAMP架构演变而来的,一般都是一台linux主机,一台apache服务器,php执行环境以及mysql服务器,一般情况下,这些都在一台虚拟主机上,简称单主机模式。
   单主机模式缺点:
  1  web服务器和mysql服务器公用一台主机,共享硬件资源,可能存在某一方资源征用太大,导致整个应用产生瓶颈
  2 当业务增长之后,没有办法做到横向扩展。
  3 容错性太差,一旦主机存在问题,整个应用不可用
   独立主机
  随着业务的发展,可以把mysql服务器和web服务器主机分开,分别部署,就是独立主机模式。
  独立主机模式下,web服务器和mysql不再共享硬件资源,分别部署。没有把鸡蛋放在一个篮子里面,增加了容错性。如果只是mysql服务器故障,那么对于web上不访问服务器的应用是不会受到影响的。而且web服务器可以做到横向扩展,如果web服务器性能不够,可以增加多台web服务器,进行负载均衡,分散web服务器的压力。
  独立主机模式的缺点:
  1 可扩展性问题:虽然web服务器可以做到横向扩展,但是mysql服务器是没有办法做到横向扩展的。
  2 可用性问题:mysql服务器存在单点问题,一旦mysql服务器宕机,对影响的影响很大
  3 性能问题:单台mysql服务器能够支撑的服务是有限的。
   读写分离
  随着业务的不断发展,数据库的压力会越来越大,单数据库慢慢的就不能满足需求了,一些网站对数据实时性要求不高,就会慢慢发展读写分离模式,对于普通的查询请求,分配到读库(也可以说是备库),对于修改请求,在主库上完成。对于读库,由于是无状态的,可以做到横向扩展。对于写库,还只能是单台主机
  这种模式其实有限制的,要根据业务的类型来考虑。主库的数据是最新的,但是同步到读库会有时延,所以应用必须能够容忍短暂的不一致性。对于一致性要求非常高的场景是不适合的。
   这种模式的存在的问题:
  1 可扩展性:虽然读库可以做到横向扩展,但是写库还不行,读库不能够横向扩展
  2 可用性:读库成为单点,一旦故障,影响所有的写操作业务
   业务垂直拆分
  随着业务的发展,一台写库显然不能够满足高并发的情况,但是考虑到写库是有状态的,不能简单的横向扩展,假设有两台写库,那么随机更新一台的数据,就会导致另一方数据存在问题。出现一种数据两个不同版本,显然是无法接受的。在写库上,可以考虑按照业务来垂直进行分库。由于我们这里讨论的是数据库架构,对于web层来说,其实也是可以按照业务垂直拆分的。
  在按照业务垂直拆分以后,系统在性能上有了很高的提升,只需要把业务上分成垂直部分,分的越细,系统的整体扩展能力就越强。


这种模式下,存在以下几个问题
  1 可用性:假设一个完整的业务流程P访问的数据库被拆分为A、B、C、D、E 五个库,假设每个写库可用性为99%,那么这个业务流程P的可用性就为99%*99%*99%*99%*99%=95%,库拆分的越多,对系统的整体可用性挑战就越大。
  2 性能:由于垂直业务库每个库的负载可能不一样,假设交易库负载很高,一个交易写库肯定不能够满足需求,这个情况下,交易库成为整个系统的瓶颈。
  3 可扩展性:单个节点的可扩展性没有得到改善,交易库不能单独进行扩展。
   单业务库水平、垂直拆分
  在上一种情况,假设交易库是整个系统的瓶颈,需要对交易库进行单独的扩展。可以考虑交易的水平拆分或者垂直拆分,有可能同时进行两种方式拆分。
  水平拆分一般根据业务无关的关键字进行拆分,横向扩展性比较好,但是对于查询的挑战比较大
  垂直拆分一般根据业务来拆分,但是可能导致数据不均匀以及拆分不够灵活。对于查询来说,相对比较友好
  拿交易库举个例子,可以先交易的类型进行业务上的垂直分库,在按照订单号进行水平分库。
  假设可以分成M*N个库,那么单个库的故障会影响1/M*N 的交易,但是假设每个库可用性为99% ,那么交易数据库故障概率为 (99%)的(M+N)次方,如果数据库拆分的越多,发生单个数据库故障概率就越高。
   这种方式存在的问题:
  1 虽然单个节点故障影响的用户很少,但是整体可用会降低。
  2 数据库管理上带来复杂的挑战,假设交易库表结构变更,需要执行M×N次脚本变更。
  3 由于发生单个数据库故障的概率比较高,dba会很苦逼的,估计经常性要救火
  4 开发和测试起来会非常苦逼,开发和测试成本会变高,查询非常复杂。
  5 单个节点如果发生故障,没有失败检测并且切换机制
  6 分库还不能在水平方向做到无限扩展,我们的算法是事先分配M个库,如果添加一个库基本上不可行
   随机分库
  对于第六个问题,在水平方向的无线扩展,可以考虑一种机制,在insert数据的时候,申请一个数据库编号,然后把数据库的编号作为一个字段保存或者在把这个编号添加到已经字段上。
  例如假设我们申请insert数据库,得到一个数据库编号为1000,那么我们可以构造出来一个订单号为1000_tradeno,订单号前面是分库编号,订单号后面是实际tradeno,这样解决了水平无线扩展的问题。这种就是随机分库模式。但是这一种方式的局限性很大,
   随机分库的缺点:
  1 分库算法和业务耦合在一起,比较适合特定的场景,适用范围比较窄
  2 对于insert操作,比较容易,对于update操作,必须有分库编号,也就是说,只能根据特定的字段来进行更新
  3 不适合批量查询的场景,查询功能限制比较大,这也是分库带来的问题
   单数据库备份以及失败切换
  对于单个数据库,如果发生故障,会影响业务,但是能否在发生故障的时候进行切换。虽然可以实现,但是会存在一定的问题,需要特定场景进行特定的分析。这一块比较复杂,说起来可以在写一篇文章,就简单的介绍一下
  以上就是总结的数据库的架构演变,数据库的演变需要很多基础技术做支撑,主要包括
  1 强大的分布式数据库的管理中间件,主要屏蔽底层的数据库路由以及数据管理功能
  2 强大的数据运维团队以及监控体系,能够检测出每个节点的数据库状态
  3 强大的数据库管理管理团队,能够维护这么的数据库集群
  4 强大的业务架构能力和技术架构能力,能够掌控这么复杂的业务场景。
最新内容请见作者的GitHub页:http://qaseven.github.io/

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
10天前
|
Kubernetes Cloud Native Docker
云原生之旅:从容器到微服务的架构演变
【8月更文挑战第29天】在数字化时代的浪潮下,云原生技术以其灵活性、可扩展性和弹性管理成为企业数字化转型的关键。本文将通过浅显易懂的语言和生动的比喻,带领读者了解云原生的基本概念,探索容器化技术的奥秘,并深入微服务架构的世界。我们将一起见证代码如何转化为现实中的服务,实现快速迭代和高效部署。无论你是初学者还是有经验的开发者,这篇文章都会为你打开一扇通往云原生世界的大门。
|
9天前
|
运维 监控 Cloud Native
自动化运维的魔法书云原生之旅:从容器化到微服务架构的演变
【8月更文挑战第29天】本文将带你领略自动化运维的魅力,从脚本编写到工具应用,我们将一起探索如何通过技术提升效率和稳定性。你将学会如何让服务器自主完成更新、监控和故障修复,仿佛拥有了一本能够自动翻页的魔法书。
|
16天前
|
监控 云计算 开发者
探索后端开发中的服务架构演变
【8月更文挑战第22天】在数字化浪潮不断推进的今天,后端开发作为技术支撑的核心,其服务架构经历了从单一应用到分布式微服务的深刻变革。本文将带你走进后端世界,一探究竟,看看那些影响深远的架构模式是如何塑造我们的数字生活的。我们将一起思考,如何在不断变化的技术环境中找到适应之道,以及这些架构变迁给开发者带来的启示和挑战。
|
18天前
|
Cloud Native Devops 云计算
云端漫步:深入理解云原生架构的演变与实践
【8月更文挑战第21天】在数字化浪潮中,云原生技术如同一股清泉,滋润着企业的数字化转型之路。本文将深入浅出地探讨云原生架构的核心理念、关键技术以及在实际业务中的应用案例,旨在为读者揭开云原生的神秘面纱,展示其在现代IT架构中的魅力与价值。从容器化技术的兴起到微服务架构的普及,再到DevOps文化的落地生根,我们将一同见证云原生如何引领企业走向更高效、更灵活的未来。
|
18天前
|
设计模式 API 数据库
探索微服务架构的演变与实践
在软件工程领域,微服务架构已成为一种流行的设计模式,它承诺通过将复杂的应用程序分解为一组小的、独立的服务来提高开发效率和系统的可维护性。本文从技术演进的角度出发,探讨了微服务架构的发展历程,并结合作者的个人经验,分享了实施微服务时面临的挑战以及应对策略。文章还着重讨论了微服务与容器化技术的结合如何进一步推动现代软件开发的最佳实践。
|
28天前
|
运维 监控 持续交付
探索微服务架构的演变与实践
在数字化浪潮推动下,微服务架构如同细胞分裂般不断演化,孕育出更灵活、高效的系统设计哲学。本文将带你穿梭于微服务的发展历程,解锁其背后的技术密码,并分享构建和部署微服务的实践智慧。从理论到实战,我们将一同见证微服务如何重塑现代应用开发的面貌。
24 2
|
9天前
|
消息中间件 存储 运维
微服务架构下的数据库选择与挑战
【8月更文第29天】随着微服务架构的流行,如何为每个服务选择合适的数据库成为了一个重要的话题。微服务架构强调将大型应用程序分解为一组小型、独立的服务,这些服务通常各自拥有自己的数据库。这种架构模式带来了灵活性和可扩展性,但也带来了数据一致性、事务管理和跨服务数据访问等方面的挑战。
20 0
|
12天前
|
存储 缓存 关系型数据库
Django后端架构开发:缓存机制,接口缓存、文件缓存、数据库缓存与Memcached缓存
Django后端架构开发:缓存机制,接口缓存、文件缓存、数据库缓存与Memcached缓存
25 0
|
13天前
|
存储 前端开发 关系型数据库
Linux 技术架构:前端、后端与数据库的完美融合
【8月更文挑战第25天】本文深入剖析了Linux操作系统的技术架构,重点介绍了前端、后端及数据库三大核心组成部分。Linux前端技术不仅涵盖了图形用户界面(GUI),包括GNOME、KDE等桌面环境,还涉及HTML、CSS、JavaScript等Web前端技术及其相关框架。后端技术则聚焦于Python、Java等多种编程语言、Apache和Nginx等Web服务器以及MySQL、PostgreSQL等数据库管理系统。Linux数据库技术覆盖了关系型和非关系型数据库,如MySQL、MongoDB等,并提供了多种数据库管理工具。
30 0
|
16天前
|
存储 Serverless API
Serverless 架构实现弹幕场景问题之在initializer方法中初始化数据库实例如何解决
Serverless 架构实现弹幕场景问题之在initializer方法中初始化数据库实例如何解决
12 0

热门文章

最新文章

下一篇
DDNS