架构设计:数据库扩展

引言

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

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. 结语

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

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

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【干货】12个开源免费的程序员简历模板

前言 昨天有小伙伴在技术群里问有没有开源的程序员简历模板,其实很早之前在DotNetGuide中已经有整理过,只是一直没有写文章推广过,由此有了今天这篇文章,假如大家有更好的免费简历模板资源欢迎大家在文章评论区留言✌。 公众号回…

Jenkins使用遇到的一些问题

一:插件依赖报错 比如遇到一堆插件报错,不是提示版本对不上,就是启用不了 这样直接把Jenkins升级就行了,比如我这个是命令行启动的,直接把他替换就好了 如果是遇到插件依赖报错,比如A插件异常 则点击这个插…

冒泡排序改进方案

冒泡排序 BubbleSort 冒泡排序是一种比较简单的 稳定排序 算法,效率不高,因此实际当中用到的机会并不多。但 作为快速排序算法的基础,还是有必要了解一下。 顾名思义,冒泡就是指大的数字(气泡)会优先从底部…

Java毕业设计-基于jsp+servlet的图书管理系统-第66期

获取源码资料,请移步从戎源码网:从戎源码网_专业的计算机毕业设计网站 项目介绍 基于jspservlet的图书管理系统:前端jsp、jquery,后端 servlet、jdbc,集成图书管理、图书分类管理、图书借阅、图书归还、公告、读者等…

linux前端部署

安装jdk 配置环境变量 刷新配置文件 source profile source /etc/profile tomcat 解压文件 进去文件启动tomcat 开放tomcat的端口号 访问 curl localhsot:8080 改配置文件 改IP,改数据库名字,密码, 安装数据库 将war包拖进去 访问http:…

软件版本号解读(语义化SemVer、日历化CalVer及标识符)

1. 版本控制规范 1.1. 语义化版本(SemVer) 版本格式:主版本号.次版本号.修订号,版本号递增规则: 主版本号(MAJOR version):添加了不兼容的 API 修改,次版本号(MINOR version):添加…

多维时序 | Matlab实现CPO-BiTCN-BiGRU冠豪猪优化时间卷积神经网络双向门控循环单元多变量时间序列预测模型

多维时序 | Matlab实现CPO-BiTCN-BiGRU冠豪猪优化时间卷积神经网络双向门控循环单元多变量时间序列预测模型 目录 多维时序 | Matlab实现CPO-BiTCN-BiGRU冠豪猪优化时间卷积神经网络双向门控循环单元多变量时间序列预测模型预测效果基本介绍程序设计参考资料 预测效果 基本介绍…

XUbuntu22.04之解决:systemd-journald占用cpu过高问题(二百一十三)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

具有准电阻负载阻抗的带宽增强型 Doherty 功率放大器(2023.05 MTT)--从理论到ADS版图

具有准电阻负载阻抗的带宽增强型 Doherty 功率放大器(2023.05 MTT)–从理论到ADS版图 原文: Bandwidth-Enhanced Doherty Power Amplifier With Optimized Quasi-Resistive Power-Combing Load Impedance 发表于APRIL 2023,在微波顶刊IEEE T MTT上面,使…

第十四章[面向对象]:14.9:定制类

一,__len__()方法返回长度 1,len()函数 len()函数: 功能:len() 函数返回对象(字符、列表、元组等)长度或项目个数 语法: len( s ) 参数:s : 要查询长度的对象 返回值: 返回对象长度 2,没有定义__len__()方法时,对实例应用len()函数会引发TypeError class Student: …

【Spring】声明式事务 spring-tx

文章目录 声明式事务是什么?一、Spring事务管理器二、基于注解的声明式事务1.1 准备工作1.2 基本事务控制1.3 事务属性:只读1.4 事务属性:超时时间1.5 事务属性:事务异常1.6 事务属性:事务隔离级别1.7 事务属性&#x…

xff注入 [CISCN2019 华东南赛区]Web111

打开题目 看见smarty 想到模板注入 又看见ip 想到xff注入 一般情况下输入{$smarty.version}就可以看到返回的smarty的版本号。该题目的Smarty版本是3.1.30 在Smarty3的官方手册里有以下描述: Smarty已经废弃{php}标签,强烈建议不要使用。在Smarty 3.1&#xff…

springsecurity+vue前后端分离适配cas认证的跨域问题

0. cas服务搭建参考:CAS 5.3服务器搭建_cas-overlay-CSDN博客 1. 参照springsecurity适配cas的方式, 一直失败, 无奈关闭springssecurity认证 2. 后端服务适配cas: 参考前后端分离项目(springbootvue)接入单点登录cas_前后端分离做cas单点登录-CSDN博客 1) 引入maven依赖 …

css实现悬浮卡片

结果展示 html代码 <!doctype html> <html lang"zh"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge,chrome1"> <meta name"viewport" content"…

MATLAB中的稀疏矩阵和密集矩阵

在MATLAB中&#xff0c;矩阵可以表示为密集或稀疏格式。通常&#xff0c;矩阵默认以密集格式存储&#xff0c;这意味着每个元素都明确地存储在内存中&#xff0c;无论它的值是多少。然而&#xff0c;当矩阵含有大量的零元素时&#xff0c;这种存储方式就会变得非常低效。为了更…

【深度学习目标检测】十八、基于深度学习的人脸检测系统-含GUI和源码(python,yolov8)

人脸检测是计算机视觉中的一个重要方向&#xff0c;也是一个和人们生活息息相关的研究方向&#xff0c;因为人脸是人最重要的外貌特征。人脸检测技术的重要性主要体现在以下几个方面&#xff1a; 人脸识别与安全&#xff1a;人脸检测是人脸识别系统的一个关键部分&#xff0c;是…

【QT QML】软件打包,生成安装包

一、版本 Desktop 5.15.2 MinGW 64-bit二、打包 1. 编译Release版本 2. 在工程目录下找到Realse文件夹 3. 拷贝文件 ***-Desktop_Qt_5_15_2_MinGW_64_bit-Release - release - xxx.exe到一个新文件夹中 4. 开启相应打包工具&#xff08;根据自己的编译器和版本选择&#xff0…

PPT大珩助手使用方法的详细介绍

软件介绍 PPT大珩助手是一款全新设计的Office PPT插件&#xff0c;它是一款功能强大且实用的PPT辅助工具&#xff0c;支持Wps Word和Office Word&#xff0c;能够轻松帮助您修改、优化和管理幻灯片。凭借丰富的功能和用户友好的界面&#xff0c;PPT大珩助手能够助力您打造出精…

【力扣hot100】刷题笔记Day11

前言 科研不顺啊......又不想搞了&#xff0c;随便弄弄吧&#xff0c;多花点时间刷题&#xff0c;今天开启二叉树&#xff01; 94. 二叉树的中序遍历 - 力扣&#xff08;LeetCode&#xff09; 递归 # 最简单递归 class Solution:def inorderTraversal(self, root: TreeNode) …

ChatGPT/GPT4科研应用与AI绘图及论文写作

2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…