架构设计---数据库的存储优化

news2024/9/29 13:32:23

前言:

互联网系统架构中,承受着最大出力压力,最难以被伸缩的,就是数据存储部分,原因主要有两方面,一方面,数据存储需要使用硬盘,而硬盘的处理速度要比其他几种计算资源都要慢,比如说CPU、内存等;数据是一个公司最重要的资产,公司需要保证数据的高可用以及一致性,非功能性约束也要更高一些。

因此数据存储通常都是互联网应用的瓶颈,在高并发的情况下,最容易出现性能问题的就是数据存储。目前用来改善数据存储能力的主要手段:数据库的主从复制、数据库分片和NoSql数据库。

数据库的主从复制:

MySql的主从复制,就是将MySql主数据库中的数据复制到从数据库中去,复制的原理:当应用程序客户端发送一条更新命令到主服务器数据库的时候,数据库会把这条更新命令同步记录到Binlog中,然后由另外一个线程从Binlog中读取这条日志,通过远程通讯的方式将它复制到从服务器上面。

从服务器获得这条更新的日志以后,将其加入到自己的Relay Log中,然后由另外一个SQL执行线程从Relay Log中读取这条新的日志,并且把它在本地数据库中执行一遍,这样当客户端应用程序执行一个update命令的时候,这个命令会同时在主数据库和从数据库中执行,从而实现了主数据库向从数据库的复制处理,使得从数据库与主数据库保持一致。

通过主从数据库复制的方式,我们可以实现数据库读写的分离,写操作访问主数据库,读操作访问从数据库,使数据库具有更强大的访问负载能力,支撑更多的用户访问。在实践中,通常采用一主多从的数据复制方案,也就是说,一个主数据库将数据复制到多个从数据库,多个从数据库承担更多的读操作压力,以及不同的角色,比如说有的从数据库用来做实时数据分析,有的从数据库用来做批任务报表计算,有的单纯做数据备份。

采用一主多从的方案,当某个从数据库宕机的时候,还可以将读操作迁移到其他从数据库上,保证读操作的高可用,但是如果主数据库宕机,系统就没法使用了,因此现实中,也会采用MySql主主复制的方案,也就是说,两台服务器互相备份,任何一台服务器都会将自己的Binlog复制到另一台机器的Relay Log中,以保持两台服务器的数据一致性。

使用主主复制需要注意的是,主主复制仅仅用来提升数据写操作的可用性,并不能用来提高写操作的性能,任何时候,系统中都只能有一个数据库作为主数据库,也就是说,所有的应用程序都必须连接同一个主数据库进行写操作,只有当该数据库宕机失效的时候,才会将写操作切换到另一台主数据库上面,这样才能保证数据库的一致性,不会出现数据冲突。

此外,不管主从数据复制还是主主数据复制,都无法提升数据的存储能力,也就是说,不管增加多少服务器,这些服务器存储的数据都是一样的,如果数据量太大的话,数据库无法存下这么多的数据,通过数据复制是无法解决问题的。

数据库分片:

数据库主从复制无法解决数据库的存储问题,但是数据库分片技术可以解决,也就是说,将一张表的数据分成若干片,每一片都包含了数据表中一部分的行记录,然后每一片存储在不同的服务器上面,这样一张表就存储在多台服务器上面了。

最简单的数据库分片存储可以采用硬编码的方式,在程序代码中直接指定一条数据库记录要存放到那个服务器上面,比如与说将用户分成两片,存储在两台服务器上面,那么就可以在程序代码中根据用户ID进行分配计算,ID为偶数的用户记录存储到服务器1,ID为奇数的存储在服务器2上面

但是硬编码方式的缺点比较明显,首先,如果要增加服务器,那么就必须修改分片逻辑代码,这样程序代码就会因为非业务需求产生不必要的变更,其次,分片逻辑耦合在处理业务逻辑的程序代码中,修改分片逻辑或者修改业务逻辑都可能使得另一部分代码因为不小心的改动而出现bug。

可以使用分布式关系数据库中间件来解决这个问题,将数据的分片逻辑在中间件中完成,对应用程序透明。

实践中,最常见的数据分片算法是余数Hash算法,根据主键ID和服务器的数目进行取模计算,根据余数连接相对应的服务器。

关系数据库的混合部署:

关系数据库的主从复制,主主复制、数据库分片这几种改善数据库读写以及存储能力的技术方案,事实上,这几种方案可以根据应用场景的需要进行混合的部署处理,也就是说,可以在一个系统中混合使用以上多种技术方案。

对于数据访问和存储压力不太大,对可用性要求也不太高的系统,也许部署在单一服务器上面的数据库就可以解决问题,所有的应用服务器都连接访问这一台数据库服务器。

如果访问量比较大,同时对数据可用性要求也比较高,那么就需要使用数据库主从复制技术,将数据库部署在多台服务器上面。

随着业务复杂以及数据存储和访问压力的增加,这个时候可以选择业务分库,也就是说,将不同业务相关的数据库表,部署在不同的服务器上面,比如类目数据和用户数据相对关联关系不大,服务应用也不一样,那么就可以将这两类的数据库部署在不同的服务器上面,而每一类数据库还可以继续选择使用主从复制,或者主主复制进行处理。

不同的业务数据库,其数据库存储的数据和访问压力也是不同的,比如说用户数据库的数据量和访问量可能是类目数据库的几十倍,甚至上百倍,这个时候可以针对用户数据库进行数据分片,而每个分片数据库还可以继续进行主从复制或者主主复制进行处理。

NoSql数据库

NoSql数据库是改善数据存储能力的一个重要手段,NoSql数据库和传统的关系型数据库不同,主要的访问方式不是使用SQL进行操作,而是使用Key、Value的方式进行数据访问,所以被称为NoSql数据库,NoSql数据库主要用来解决大规模分布式数据的存储问题,常用的NoSql数据有Apache HBase、Apache Cassandra等,Redis虽然是一个分布式缓存技术产品,但是有时候也被归类为NoSql数据库。

NoSql数据库面临的挑战之一是数据一致性的问题,如果数据分布存储在多台服务器组成的集群上,那么当有服务器节点失效的时候,或者服务器之间网络通信故障的时候,不同用户读取的数据就有可能不一样的。

比如用户1连接服务节点A,用户2连接服务器节点B,当两个用户同时修改某个数据的时候,如果正好服务器A和服务器B之间的网络通信失败,那么这两个节点上的数据也就不一样了,其他用户在访问这个数据的时候,可能会得到不一样的结果。

关于分布式存储系统有一个著名的CAP理论,CAP原理说:一个提供数据服务的分布式系统无法同时满足数据一致性(Consistency)、可用性(Availability)和分区耐受性(Partition Tolerance)这三个条件。

一致性是说,每次读取的数据都应该是最近写入的数据或者返回一个错误,而不是过期数据,也就是说,数据是一致的。

可用性是说,每次请求都应该得到一个响应,而不是返回一个错误或者失去响应,不过这个响应不需要保证数据是最近写入的,也就是说,系统需要一致都是可以正常使用的,不会引起调用者的异常,但是并不保证响应的数据是最新的。

分区耐受性是说,即使因为网络的原因,网络分区失效的时候,部分服务器节点之间消息丢失或延迟了,系统依然应该是可以操作的。

CAP的原理是说,当网络分区失效发生的时候,我们要么取消操作,保证数据就是一致的,但是系统却不可用,要么继续写入数据,但是数据的一致性就得不到保证了。

对于一个分布式系统而言,网络失效一定会发生,也就是说,分区耐受性是必须要保证的,而对于互联网应用来说,可用性也是需要保证的,分布式存储系统通常需要在一致性上做一些妥协和增强。

Apache Cassandra解决数据一致性的方案是,在用户写入数据的时候,将一个数据写入集群中的三个服务器节点,等待至少两个节点响应写入成功,用户读取数据的时候,从三个节点尝试读取数据,至少等到两个节点返回数据,并且根据返回数据的时间戳,选取最新版本的数据。这样,即使服务器中的数据不一致,但是最终用户还是能得到一个一致的数据,这种方案也被称为最终一致性。

小结:

架构是一门关于权衡的艺术,这一点在数据存储架构上表现的最明显了,由于数据存储的挑战性和复杂性,无论你选择何种技术方案,都会带来一些新的问题和挑战,数据存储架构没有一下子就能处理的解决方案,唯有在深刻理解自己业务场景和各种分布式存储技术特点的基础上,进行各种权衡的考虑处理,才能选择最合适的解决方案,并且可以想办法进行处理相关的缺陷,才能真正的进行解决问题。

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

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

相关文章

6、Servlet——网络协议、HTTP协议、HTTP报文格式

目录 一、网络协议 1、网络协议三要素 2、层次结构 3、层次划分 二、HTTP协议 1、HTTP工作原理 2、HTTP协议特点 3、 三次握手 4、四次挥手 三、HTTP报文格式 1、请求报文 2、响应报文 一、网络协议 网络协议,简称协议 ,网络协议是通信计算…

【Python百日进阶-数据分析】Day150 - plotly使用日期类型轴的时间序列 1

文章目录一、使用轴类型的时间序列date1.1 使用 plotly.express1.2 使用 graph_objects二、Dash 中的时间序列三、日期轴上的不同图表类型3.1 相对股票代码值的条形图3.2 多面区域图四、配置刻度标签五、将刻度标签移动到期间的中间六、用直方图总结时间序列数据七、显示期间数…

macOS 上安装和配置 Flutter 开发环境

本文基于此: Flutter中文网 一、安装和运行Flutter的系统环境要求 想要安装并运行 Flutter,你的开发环境需要最低满足以下要求: 操作系统:macOS磁盘空间:2.8 GB(不包括IDE/tools的磁盘空间)。工具:Flutter使用git进行安装和升级。我们建议安…

vue3中的写法以及,一些语法糖

vue3新增setup,属性执行比 created更早,同时setup中this不会指向实例)这个方法在onBeforeMounted之前被调用。定义数据需要在数据前面加ref,ref在vue3中是将数据转换成响应式数据结构的一种,因为vue3中没有了data(){ },那么就没办法劫持数据做…

PDF拆分成多个页面怎么办?这三个方法让你实现将文件拆分成多页

PDF是我们常见的文件格式之一,在日常办公中,我们经常会将WORD、PPT、EXCEL等文档转换成PDF的格式后再进行传输,这样不仅传输速度快,格式也不会出现乱码的情况,但在一些特殊的场景下,我们也需要将一份完整的…

Allegro174版本新功能介绍之锁定菜单栏设置

Allegro174版本新功能介绍之锁定菜单栏设置 用Allegro设计的时候,经常因为切换了Symphony team design模式导致菜单栏变化,使用的时候又需要重新去调用一次,十分麻烦 但是在Allegro升级到了174的时候,有一个锁定菜单栏的功能 具体操作如下 选择Setup选择User Prefrences

代谢组学喜讯|百趣生物与金域医学达成代谢组学战略合作

2023年1月4日,上海百趣生物医学科技有限公司(“百趣生物”)与广州金域医学检验集团股份有限公司(“金域医学”)在广州举行战略合作签约仪式。双方将在代谢组学科研服务和临床转化方面进行深度合作,共同致力…

2022年餐饮连锁行业研究报告

第一章 行业概况 餐饮连锁是餐饮的一种发展模式,指餐饮企业通过连锁经营和特许经营的方式进行扩张。根据商务部发布的《特许经营管理办法》:连锁企业必须具备2店1年才有出售特许经营权的权利。餐饮连锁是餐饮业发展到一定程度时的一个必然的产物&#x…

深度学习入门之ResNet食物图像分类

前言 参加了华为一个小比赛第四届MindCon-爱(AI)美食–10类常见美食图片分类,本来想实践机器学习课程的知识,后来发现图像分类任务基本都是用神经网络做,之前在兴趣课上学过一点神经网络但不多,通过这样一…

Android UI界面刷新机制

一 前言 作为严重影响 Android 口碑问题之一的 UI 流畅性差的问题,首先在 Android 4.1 版本中得到了有效处理。其解决方法即在 4.1 版本推出的 Project Butter。Project Butter 对 Android Display系统进行了重构,引入三个核心元素:VSYNC、T…

nmake文件学习记录(一)看《跟我一起写Makefile》

1、陈皓《跟我一起写Makefile》 makefile 带来的好处就是——“自动化编译”,一旦写好,只需要一个make 命令,整个工程完全自动编译,极大的提高了软件开发的效率。 make 是一个命令工具,是一个解释makefile 中指令的命…

线程池(ThreadPoolExecutor)

文章目录一、线程池标准库提供的线程池ThreadPoolExecutor自定义线程池一、线程池 为什么要引入线程池? 这个原因我们需要追溯到线程,我们线程存在的意义在于,使用进程进行并发编程太重了,所以引入了线程,因为线程又称为 “轻量…

【知识图谱导论-浙大】第三、四章:知识图谱的抽取与构建

前文: 【知识图谱导论-浙大】第一章:知识图谱概论 【知识图谱导论-浙大】第二章:知识图谱的表示 说明:原视频中的第三章主要介绍了图数据库相关的内容,有兴趣的可以查看相关课件或者对应的视频: 【知识图…

[Linux理论基础1]----手写和使用json完成[序列化和反序列化]

文章目录前言一、应用层二、再谈"协议"三、 网络版计算器手写版本使用第三方库json实现完整代码总结前言 理解应用层的作用,初始HTTP协议;理解传输层的作用,深入理解TCP的各项特性和机制;对整个TCP/IP协议有系统的理解;对TCP/IP协议体系下的其他重要协议和技术有一定…

JPG格式如何转为PDF格式?快来学习如何转换

图片是我们经常用到的一种便携式文件,像我们日常的照片或者是一些学习资料、工作资料都是图片形式的,我们经常会把这些图片发送给其他人,这时候就需要想一个简单的办法把图片一次性发送过去,所以我们可以将图片转换为PDF文件&…

暨 广告、推荐、搜索 三大顶级复杂业务之 “广告业务系统详叙”

文章目录暨 广告、推荐、搜索 三大顶级复杂业务之 “广告业务系统详叙”广告系统的核心功能ADX 架构流程概述典型 ADX 架构图概述消息中心抱歉,有段日子没码字了,后面会尽量补出来分享给大家。这段时间整理了关于 “广告业务” 相关的思考,作…

OSPF笔记(五):OSPF虚链路--普通区域远离骨干区域

一、OSPF 虚链路 1.1 虚链路邻居关系: hello包只发送一次,没有dead时间 虚链路配置邻居指的是RID,非接口IP 1.2 虚链路解决的问题: 普通区域远离骨干区域0的问题 普通区域连接两个骨干区域0问题 (1)…

SpringSecurity授权功能快速上手

3. 授权 3.0 权限系统的作用 例如一个学校图书馆的管理系统,如果是普通学生登录就能看到借书还书相关的功能,不可能让他看到并且去使用添加书籍信息,删除书籍信息等功能。但是如果是一个图书馆管理员的账号登录了,应该就能看到并…

最新款发布 | 德州仪器(TI)60G单芯片毫米波雷达芯片 -xWRL6432

本文编辑:调皮哥的小助理 概述 最近,德州仪器(TI)推出了单芯片低功耗 57GHz 至 64GHz 工业(汽车)毫米波雷达传感器IWRL6432,具有 7GHz 的连续带宽,可实现更高分辨率。除了UWB雷达之外,IWRL6432目前是毫米波雷达带宽最…

漏洞挖掘-不安全的HTTP方法

前言: 年关将至,这可能是年前最后一篇文章了。已经有一段时间没有更新文章了,因为最近也没有学到什么新的知识,也就没什么可写的,又不想灌水。最近关注的好兄弟们多了很多,在这里也是十分感谢大家的支持&am…