架构设计:数据库扩展

引言

随着业务的发展和用户规模的增长,数据库往往会面临着存储容量不足、性能瓶颈等问题。为了解决这些问题,数据库扩展成为了一种常见的解决方案。在数据库扩展的实践中,有许多不同的策略和技术可供选择,其中包括水平拆分、垂直拆分、分布式数据库等。本文将探讨数据库扩展的各种方式及其适用场景,以及在实践中的一些经验和注意事项。

1. 数据库扩展的背景

随着互联网的迅速发展和各种应用的兴起,用户量和数据量呈现出爆炸式增长的趋势。传统的数据库往往难以应对如此庞大的数据量和高并发访问的挑战,因此数据库扩展成为了必然的选择。数据库扩展可以通过水平拆分和垂直拆分两种方式实现,以满足业务需求。

c5b921dcb2d749f3a4cf4497fbf82108.png

2. 水平拆分

水平拆分是将数据按照某种规则分散到多个数据库节点中,每个节点负责存储一部分数据。水平拆分的主要优势在于能够提高数据库的并发处理能力和扩展性。当数据量增长时,可以简单地增加数据库节点,从而实现线性的扩展。

68af2696af524b43a98d4e2514e2b7bd.png

2.1 水平拆分的策略

  • 哈希分片:将数据的关键字段(如用户ID、订单ID等)进行哈希运算,然后根据哈希值将数据分散到不同的数据库节点中。
  • 范围分片:将数据按照一定的范围进行分片,例如按照订单创建时间范围或者地理位置范围进行分片。

2.2 水平拆分的实践经验

  • 数据一致性:在水平拆分的过程中,需要考虑数据的一致性和跨节点事务的处理方式,通常采用分布式事务或者最终一致性的方案。
  • 负载均衡:需要考虑数据在不同节点上的分布情况,避免出现数据倾斜导致的性能问题。
  • 故障恢复:需要设计合适的故障恢复机制,保证系统在节点故障时能够自动切换到其他可用节点。

3. 垂直拆分

垂直拆分是将数据按照业务功能或者数据特性的不同分散到不同的数据库中,每个数据库负责存储特定类型的数据。垂直拆分的主要优势在于可以将不同访问模式下的数据分开存储,从而提高查询效率和降低数据冗余度。

d43db37f3613438db9931a8bf4050d90.png

3.1 垂直拆分的策略

  • 基于功能:将不同功能模块的数据分开存储,例如将用户信息、商品信息、订单信息等分别存储在不同的数据库中。
  • 基于访问模式:将频繁访问和不频繁访问的数据分开存储,例如将热数据和冷数据分别存储在不同的数据库中。

3.2 垂直拆分的实践经验

  • 数据关联:需要考虑不同数据之间的关联关系,确保在拆分后能够通过关联查询获取完整的信息。
  • 维护成本:垂直拆分会增加系统的维护成本,需要权衡数据隔离和维护成本之间的关系。
  • 扩展性:需要设计合适的扩展性方案,确保系统在业务增长时能够方便地进行扩展。

4. 分布式数据库

除了水平拆分和垂直拆分之外,还有一种常见的数据库扩展方式是使用分布式数据库。分布式数据库是将数据存储在多个节点上,并通过分布式协调和数据一致性机制来实现数据的分布式存储和处理。

4.1 分布式数据库的特点

  • 数据分布:数据存储在多个节点上,可以实现数据的分布式存储和访问。
  • 数据一致性:通过分布式事务和副本机制来保证数据的一致性和可靠性。
  • 扩展性:分布式数据库具有良好的扩展性,可以通过增加节点来实现系统的水平扩展。

4.2 分布式数据库的实践经验

  • 数据分片:需要设计合适的数据分片策略,确保数据在不同节点上的均衡分布。
  • 数据一致性:需要考虑分布式事务和数据一致性机制的实现方式,确保数据的一致性和可靠性。
  • 故障恢复:需要设计合适的故障恢复机制,确保系统在节点故障时能够自动切换到其他可用节点。

5. 分库分表 Sharding

一般来说,影响数据库最大的性能问题有两个,一个是对数据库的操作,一个是数据库中数据的大小。对于前者,我们需要从业务上来优化。

一方面,简化业务,不要在数据库上做太多的关联查询,而对于一些更为复杂的用于做报表或是搜索的数据库操作,应该把其移到更适合的地方。比如,用 ElasticSearch 来做查询,用 Hadoop 或别的数据分析软件来做报表分析。

对于后者,如果数据库里的数据越来越多,那么也会影响我们的数据操作。而且,对于我们的分布式系统来说,后端服务都可以做成分布式的,而数据库最好也是可以拆开成分布式的。读写分离也因为数据库里的数据太多而变慢,于是,分库分表就成了我们必须用的手段。

d9fd7b111f044ddead0deacf7e402abc.png

上面的图片是一个分库的示例。其中有两个事,这里需要提一下,一个是关于分库的策略,一个是关于数据访问层的中间件。

关于分库的策略。我们把数据库按某种规则分成了三个库。比如,或是按地理位置,或是按日期,或是按某个范围分,或是按一种哈希散列算法。总之,我们把数据分到了三个库中。

关于数据访问层。为了不让我们前面的服务感知到数据库的变化,我们需要引入一个叫 " 数据访问层 " 的中间件,用来做数据路由。但是,老实说,这个数据访问层的中间件很不好写,其中要有解析 SQL 语句的能力,还要根据解析好的 SQL 语句来做路由。但即便是这样,也有很多麻烦事。

比如,我要做一个分页功能,需要读一组顺序的数据,或是需要做 Max/Min/Count 这样的操作。于是,你要到三个库中分别求值,然后在数据访问层这里再合计处理返回。但即使是这样,你也会遇到各种令人烦恼的事,比如一个跨库的事务,你需要走 XA 这样的两阶段提交的操作,这样会把数据库的性能降到最低的。

为了避免数据访问层的麻烦,分片策略一般如下。

  • 按多租户的方式。用租户 ID 来分,这样可以把租户隔离开来。比如:一个电商平台的商家中心可以按商家的 ID 来分。
  • 按数据的种类来分。比如,一个电商平台的商品库可以按类目来分,或是商家按地域来分。
  • 通过范围来分。这样分片,可以保证在同一分片中的数据是连续的,于是我们数据库操作,比如分页查询会更高效一些。一般来说,大多数情况是用时间来分片的,比如,一个电商平台的订单中心是按月份来分表的,这样可以快速检索和统计一段连续的数据。
  • 通过哈希散列算法来分(比如:主键 id % 3 之类的算法。)此策略的目的是降低形成热点的可能性(接收不成比例的负载的分片)。但是,这会带来两个问题,一个就是前面所说的跨库跨表的查询和事务问题,另一个就是如果要扩容需要重新哈希部分或全部数据。 

上面是最常见的分片模式,但是你还应考虑应用程序的业务要求及其数据使用模式。这里请注意几个非常关键的事宜。

  • 数据库分片必须考虑业务,从业务的角度入手,而不是从技术的角度入手,如果你不清楚业务,那么无法做出好的分片策略。
  • 请只考虑业务分片。请不要走哈希散列的分片方式,除非有个人拿着刀把你逼到墙角,你马上就有生命危险,你才能走哈希散列的分片方式。

6. 结语

数据库扩展是解决数据库大数据量下性能瓶颈和存储容量不足等问题的重要手段。水平拆分、垂直拆分和分布式数据库是常见的数据库扩展方式,它们各自适用于不同的场景和需求。在实际应用中,需要根据业务特点和数据特性选择合适的数据库扩展方案,以实现数据库的高效扩展和优化。随着技术的不断进步和创新,数据库扩展领域也将迎来更多的发展机遇和挑战。

通过本文的介绍,相信读者对数据库扩展的各种方式和实践经验有了更深入的了解,希望能够为实际的架构设计和数据库优化提供一些参考和启发。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/699826.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL 探索之旅】初始MySQL数据库

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有…

【LeetCode每日一题】 单调栈的案例84 柱状图中最大的矩形

84 柱状图中最大的矩形 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 示例 1: 输入:heights [2,1,5,6,2,3] 输出:10 解释…

Conmi的正确答案——将JAVA中maven的.m2文件夹放到D盘

系统:WIN11 1、将.m2文件夹移动到D盘 移动后: 2、创建目录链接 mklink /j "C:\Users\Administrator\.m2" "D:\.m2"至此,maven默认的jar包会加载到D盘的.m2文件夹

小程序分包的详细流程

小程序分包的详细流程如下: 建立分包文件夹:在项目根目录下创建分包文件夹,用来存放除底部菜单栏页面之外的其他页面。例如,你可以创建一个名为subPackages的文件夹,并在其中创建pages文件夹用于存放页面文件&#xff…

Ubuntu环境安装MySQL数据库

1.安装过程 打开终端(Terminal)窗口,使用以下命令更新系统软件包: sudo apt update ubuntu环境安装mysql-server和mysql开发包,包括mysql头文件和动态库文件,命令如下: sudo apt-get instal…

vue复用组件出现data-v-xxx乱码无法通过css修改指定样式

vue复用组件出现data-v-xxx乱码无法通过css修改指定样式解决方案如下 选择需要修改的样式 给最高级父级元素定义新的classname 与原有样式保持相同级联 修改指定样式 .demo_parent .demo_son .demo_grandson[data-v-73a2ee76]{ padding: 0; border-radius: 3px; background: #…

【科研基础】信息瓶颈 Information Bottleneck

Information Bottleneck的主要想法是将多层神经网络视为逐层传递的马尔科夫链,信息在链中被逐层压缩,去掉和输出无关的,留下与输出相关的。也就是说让每一层与模型输入的互信息逐渐减小,与模型输出的互信息逐渐增大【1】 [1]信息瓶…

分享数字孪生潭江流域建设与实践论文

数字孪生潭江流域建设 广东省水利厅 以支撑江门市沿线水工程精准联调联控,提升水旱灾害防御能力为首要任务,融合多信息源预报、GIS等技术,建立气象-水文-水动力集一体的复杂流域入库径流预报及其洪涝延伸预报模型平台,构建具有“…

zookeeper动态扩缩容(无需重启)

目录 一、启动一个zk 二、扩容一个zk 三、缩容一个zk 四、重新配置集群的节点 前言: zookeeper动态扩/缩容的reconfig命令旨在不需要重启zookeeper中任何一个节点的情况下,对整个zookeeper集群进行动态扩/缩容。 zookeeper客户端支持的命令&#xff…

Qt应用软件【文件篇】INI文件读写

文章目录 INI文件简介INI文件的主要特点INI文件的应用场景Qt INI文件相关API汇总Qt读取INI文件代码示例Qt写入INI文件代码示例Qt修改INI文件代码示例INI文件编码格式问题INI文件简介 INI文件,全称Initialization File,是一种简单的文本文件,用于存储配置信息和参数。它由多…

【明道云】导入Excel数据时的默认顺序

【背景】 明道云导入Excel过程中由于数据问题往往会有一些需要补录的地方。这种情况下就需要已上传到线上的数据和本地Excel的记录顺序完全一致才方便对比。因此需要清除如何让两者的记录顺序一致。 【分析】 经过多次排序对比,考虑到分页的影响,发现…

二层交换机和三层交换机区别

01、二层交换机 二层交换机,也被称为数据链路层交换机,是在OSI模型的数据链路层(第二层)进行数据交换的设备。它基于MAC(Media Access Control)地址来转发数据包,实现局域网内部的数据传输 1、…

jetson nano——报错(已解决):ModuleNotFoundError: No module named ‘dlib‘

目录 1.问题描述2. ps:下面二个方法选一个即可。2.1.方法一:2.2.方法二:我直接提供文件,大家进入cd dlib-19.17输入python3 setup.py install即可 系统:jetson-nano-jp451-sd-card-image ubuntu 18.04 借鉴了这位博主的…

HTMLElement.click()的回调触发踩坑

先看看以下代码 const el document.getElementById("btn") el.addEventListener("click", () > {Promise.resolve().then(() > console.log("microtask 1"));console.log("1"); }); el.addEventListener("click", (…

Spring Boot 手写starter!!!

原因:为什么要手写starter??? 原因:简化功能。 实例:以分页为例:写一个starter。 1.首先定义一个PageX注解。 Target({ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) Documented p…

mac/windows git ssh 配置多平台账号(入门篇)

目录 引子多账号多平台配置git一、.ssh文件夹路径1.1 mac 系统1.2 windows 系统 二、生成new ssh2.1 mac系统2.2 windows 系统 三、配置 config四、验证五、用ssh方式拉取远程仓库代码 引子 push代码到github仓库时,提示报错。 Push failed Remote: Support for pa…

Channel

在Java中,Channel是一个用于IO操作(特别是NIO,即非阻塞IO)的接口,它提供了一种连接到IO服务(如文件系统或套接字)的开放连接。Channel是Java NIO中的核心组件之一,使得能够以更接近操…

Redis部署方式(一)四种部署方式介绍

redis的四种部署方式: Redis单机模式部署、Redis主从模式部署、Redis哨兵模式部署、Cluster集群模式部署,后面三种(主从模式,Sentinel哨兵模式,Cluster模式)也可以统称为集群模式。 一、单机 1、缺点&…

XFF伪造 [MRCTF2020]PYWebsite1

打开题目 直接查看源码 看到一个./flag.php 访问一下 购买者的ip已经被记录,本地可以看到flag,那么使用xff或者client-ip伪造一下ip试试 bp抓包 加一个X-Forwarded-For头 得到flag

目标检测新SOTA:YOLOv9问世,新架构让传统卷积重焕生机(附代码)

在目标检测领域,YOLOv9 实现了一代更比一代强,利用新架构和方法让传统卷积在参数利用率方面胜过了深度卷积。 继 2023 年 1 月 YOLOv8 正式发布一年多以后,YOLOv9 终于来了! 我们知道,YOLO 是一种基于图像全局信息进行预测的目标检测系统。自 2015 年 Joseph Redmon、Al…