前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >架构设计---数据库的存储优化

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

作者头像
小马哥学JAVA
发布2023-07-15 15:44:27
1890
发布2023-07-15 15:44:27
举报
文章被收录于专栏:JAVA开发专栏JAVA开发专栏

前言:

互联网系统架构中,承受着最大出力压力,最难以被伸缩的,就是数据存储部分,原因主要有两方面,一方面,数据存储需要使用硬盘,而硬盘的处理速度要比其他几种计算资源都要慢,比如说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解决数据一致性的方案是,在用户写入数据的时候,将一个数据写入集群中的三个服务器节点,等待至少两个节点响应写入成功,用户读取数据的时候,从三个节点尝试读取数据,至少等到两个节点返回数据,并且根据返回数据的时间戳,选取最新版本的数据。这样,即使服务器中的数据不一致,但是最终用户还是能得到一个一致的数据,这种方案也被称为最终一致性。

编辑

小结:

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

本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-03-28,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 小马哥学JAVA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com