数据库架构:详解设计组成及其功能。 (如何描述数据库的架构)

数据库架构:详解设计组成及其功能

随着互联网技术的不断发展,数据库建设已经成为了现代企业信息化建设的重要组成部分。而数据库架构是数据库建设中不可或缺的一环,不仅关系到数据库的性能、安全、可靠性等方面,还涉及到企业的核心业务流程以及信息资源的管理。本文将从以下几个方面详解数据库架构的设计组成及其功能。

一、数据库架构的基本组成

1. 数据库管理系统 (DBMS)

数据库管理系统 (DBMS) 是数据库架构的基础组成部分,是指通过软件或硬件的方式,对大量数据进行组织、管理、存储和检索的系统。

常见的 DBMS 有 Oracle、MySQL、SQLServer、PostgreSQL 等,它们都可以通过 SQL 语言来操作数据库。

2. 数据库模型

数据库模型是指对数据进行建模,描述了数据库中实体、属性、关系及其对应的操作。

常见的数据库模型有层次模型、网状模型、关系模型、对象模型等,其中关系模型是应用最广泛的数据库模型。

3. 数据库实例

数据库实例是指一个数据库系统运行时的内存实例,包括了操作系统进程、共享内存区、数据缓存区和临时文件等。它以数据库管理系统为基础,实现了数据库的增删改查等常用操作。

4. 数据库对象

数据库对象是指在数据库中创建的数据结构,如表、视图、存储过程、触发器等。数据库对象的设计直接影响到数据库的可扩展性、可靠性和性能。

5. 数据库连接

数据库连接是指在应用程序和数据库之间建立的通信链路。在数据库架构中,数据库连接管理是一项重要的工作,对于提高数据库性能、稳定性具有关键作用。

二、数据库架构的功能及实现

1. 数据库存储管理

数据库存储管理是指对数据库中数据进行储存和管理的过程,包括表空间管理、数据文件管理、数据块管理、段管理等。通过对存储管理的优化,可以提高数据库的性能和可靠性,减少数据丢失和损坏的风险。

2. 数据库备份与恢复

数据库备份与恢复是指在数据库运行过程中,将数据库中的数据和日志文件进行备份,以便于在出现灾难性故障时进行恢复。通过备份与恢复的方式,可以有效地减少数据丢失的风险,保障企业的核心业务不受影响。

3. 数据库安全性管理

数据库安全性管理是指对数据库中的数据进行安全保护的过程,包括用户管理、权限管理、数据加密等。通过有效的安全性管理,可以保障企业的数据安全,避免数据泄露、丢失等问题。

4. 数据库性能优化

数据库性能优化是指通过对数据库结构、索引、查询语句等方面的优化,提高数据库的响应速度、并发处理能力等性能指标。通过性能优化,可以加速数据访问和数据处理,提高企业的工作效率。

5. 数据库监控与调优

数据库监控与调优是指对数据库运行时的性能和状态进行监控和统计,并进行调优操作,提高数据库的性能和可靠性。通过监控和调优,可以开发出更佳的数据库架构方案,提高数据库的整体质量。

三、数据库架构设计的注意事项

尽管数据库架构的设计组成十分重要,但在设计过程中也有一些需要特别注意的事项,包括:

1. 合理规划数据模型,避免数据冗余,确保数据的完整性。

2. 合理安排表空间和磁盘空间,避免空间碎片和存储性能下降。

3. 合理统计数据,并制定相应的性能优化方案。

4. 增强数据库安全性,为企业数据提供更好的保障。

5. 良好的数据库连接管理和数据库监控实践,实时掌握数据库运行情况,及时发现和解决问题。

数据库架构的设计组成及其功能是十分重要的,也是优化数据库性能和提高数据库安全性的根本。通过合理的架构设计和优化方案,可以更大限度地提高数据库的性能、安全性和可靠性,为企业信息化建设提供坚实的保障。

相关问题拓展阅读:

数据库系统中的几种架构及处理方式

来具体说说数据库集群吧

集群主要分成三大类 (高可用集群, 负载均衡集群,科学计算集群)

高可用集群( HighCluster)

负载均衡集群(Load Balance Cluster)

科学计算集群(High Performance Computing Cluster)

1、高可用集群(HighCluster)

常见的就是2个节点做成的HA集群,有很多通俗的不科学的名称,比如”双机热备”, “双机互备”, “双机”。高可用集群解决的是保障用户的应用程序持续对外提侍正供服务的能力。 (请注意高可用集群既不是用来保护业务数据的,保护的是用户的业务程序对外不间断提供服务,把因软件/硬件/人为造成的故障对业务的影响降低到最小程度)。

2、负载均衡集群(Load Balance Cluster)

负载均衡系统:集群中所有的节点都处于活动状态,它们分摊系统的工作负载。一般Web服务器集群、数据库集群和应用服务器集群都属于这种类型。

负载均衡集群一般用于相应网络请求的网页服务器,数据库服务器。这种集群可以在接到请求时老世悔,检查接受请求较少,不繁忙的服务器,并把请求转到这些服务器上。从检查其他服务器状态这一点上看,负载均衡和容错集群很接近,不同之处是数量上更多。

3、科学计算集群(High Performance Computing Cluster)

高性能计算(High Perfermance Computing)集群,简称HPC集群。这类集群致力于提供单个计算机所不能提供的强大的计算能力。

高性能计算分类: 

3.1、高吞吐计算(High-throughput Computing)

有一类高性能计算,可以把它分成若干可以并行的子任务,而且各个子任务彼此间没有什么关联。象在家搜寻外星人( SETI@HOME _ Search forat Home )就是这一类型应用。

这一项目是利用Internet上的闲置的计算资源来搜寻外星人。SETI项目的服务器将一组数据和数据模式发给Internet上参加SETI的计算节点,计算节点在给定的数据上用给定的模式进行搜索,然后将搜索的结果发给服务器。服务器负责将从各个计算节点返回的数据汇集成完整的 数据。因为这种类型应用的一个共同特征是在海量数据上搜索某些模式,所以把这类计算称为高吞吐计算。

所谓的Internet计算都属于这一类。按照 Flynn的分类,高吞吐计算属于返颂SIMD(Single Instruction/Multiple Data)的范畴。

3.2、分布计算(Distributed Computing)

另一类计算刚好和高吞吐计算相反,它们虽然可以给分成若干并行的子任务,但是子任务间联系很紧密,需要大量的数据交换。按照Flynn的分类,分布式的高性能计算属于MIMD(Multiple Instruction/Multiple Data)的范畴。

下面说说这几种集群的应用场景:

高可用集群这里不多作说明。

想Dubbo是比较偏向于负载均衡集群,用过的猿友应该知道(不知道的可以自行了解一下),Dubbo同一个服务是可以有多个提供者的,当一个消费者过来,它要消费那个提供者,这里是有负载均衡机制在里面的。

搜索引擎比较偏向于科学计算集群的分布计算。

而到这里,可能不少猿友都知道,集群的一些术语:集群容错、负载均衡。

我们以Dubbo为例:

集群容错(bbo.io/UserGuide-zh.htm#UserGuide-zh-%E9%9B%86%E7%BE%A4%E5%AE%B9%E9%94%99)

Dubbo提供了这些容错策略:

集群容错模式:

可以自行扩展集群容错策略,参见:集群扩展

Failover Cluster

失败自动切换,当出现失败,重试其它服务器。(缺省)

通常用于读操作,但重试会带来更长延迟。

可通过retries=”2″来设置重试次数(不含之一次)。

Failfast Cluster

快速失败,只发起一次调用,失败立即报错。

通常用于非幂等性的写操作,比如新增记录。

Failsafe Cluster

失败安全,出现异常时,直接忽略。

通常用于写入审计日志等操作。

Failback Cluster

失败自动恢复,后台记录失败请求,定时重发。

通常用于消息通知操作。

Forking Cluster

并行调用多个服务器,只要一个成功即返回。

通常用于实时性要求较高的读操作,但需要浪费更多服务资源。

可通过forks=”2″来设置更大并行数。

Broadcast Cluster

广播调用所有提供者,逐个调用,任意一台报错则报错。(2.1.0开始支持)

通常用于通知所有提供者更新缓存或日志等本地资源信息。

负载均衡(bbo.io/UserGuide-zh.htm#UserGuide-zh-%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1)

Dubbo提供了这些负载均衡策略:

Random LoadBalance

随机,按权重设置随机概率。

在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。

RoundRobin LoadBalance

轮循,按公约后的权重设置轮循比率。

存在慢的提供者累积请求问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。

LeastActive LoadBalance

最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。

使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。

LoadBalance

一致性Hash,相同参数的请求总是发到同一提供者。

当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。

算法参见:en..org/wiki/Consistent_hashing。

缺省只对之一个参数Hash,如果要修改,请配置

缺省用160份虚拟节点,如果要修改,请配置

数据库架构选型与落地,看这篇就够了

随着时间和业务的发展,数据库中的数据量增长是不可控的,库和表中的数据会越来越大,随之带来的是更高的

磁盘

IO

系统开销

,甚至

性能

上的瓶颈,而单台服务器的

资源终究是有限

的。

因此在面对业务扩张过程中,应用程序对数据库系统的

健壮性

安全性

扩展性

提出了更高的要求。

以下,我从数据库架构、选型与落地来让大家入门。

数据库会面临什么样的挑战呢?

业务刚开始我们只用单机数据库就够了,但随着业务增长,数据规模和用户规模上升,这个时候数据库会面临IO瓶颈、存储瓶颈、可用性、安全性问题。

为了解决上述的各种问题,数据库衍生了出不同的架构来解决不同的场景需求。

将数据库的写操作和读操作分离,主库接收写请求,使用多个从库副本负责读请求,从库和主库同步更新数据保持数据一致性,从库可以水平扩展,用于面对读请求的增加。

这个模式也就是常说的读写分离,针对的是小规模数据,而且存在大量读操作的场景。

因为主从的数据是相同的,一旦主库宕机的时候,从库可以

切换为主库提供写入

,所以这个架构也可以提高数据库系统的

安全性

可用性

优点:

缺点:

在数据库遇到

IO瓶颈

过程中,如果IO集中在某一块的业务中,这个时候可以考虑的就是垂直分库,将热点业务拆分出去,避免由

热点业务

密集IO请求

影响了其他正常业务,所以垂直分库也叫

业务分库

优点:

缺点:

在数据库遇到存储瓶颈的时候,由于数据量过大造成索引性能下降。

这个时候可以考虑将数据做水平拆分,针对数据量巨大的单张表,按照某种规则,切分到多张表里面去。

但是这些表还是在同一个库中,所以库级别的数据库操作还是有IO瓶颈(单个服务器的IO有上限)。

所以水平分表主要还是针对

数据量较大

,整体业务

请求量较低

的场景。

优点:

缺点:

四、分库分表

在数据库遇到存储瓶颈和IO瓶颈的时候,数据量过大造成索引性能下降,加上同一时间需要处理大规模的业务请求,这个时候单库的IO上限会限制处理效率。

所以需要将单张表的数据切分到多个服务器上去,每个服务器具有相应的库与表,只是表中数据不同。

分库分表能够有效地缓解单机和单库的

性能瓶颈和压力

,突破IO、连接数、硬件资源等的瓶颈。

优点:

缺点:

注:分库还是分表核心关键是有没有IO瓶颈

分片方式都有什么呢?

RANGE(范围分片)

将业务表中的某个

关键字段排序

后,按照顺序从0到10000一个表,10001到20230一个表。最常见的就是

按照时间切分

(月表、年表)。

比如将6个月前,甚至一年前的数据切出去放到另外的一张表,因为随着时间流逝,这些表的数据被查询的概率变小,银行的交易记录多数是采用这种方式。

优点:

缺点:

HASH(哈希分片)

将订单作为主表,然后将其相关的业务表作为附表,取用户id然后

hash取模

,分配到不同的数据表或者数据库上。

优点:

缺点:

讲到这里,我们已经知道数据库有哪些架构,解决的是哪些问题,因此,

我们在日常设计中需要根据数据的特点,数据的倾向性,数据的安全性等来选择不同的架构

那么,我们应该如何选择数据库架构呢?

虽然把上面的架构全部组合在一起可以形成一个强大的高可用,高负载的数据库系统,但是架构选择合适才是最重要的。

混合架构虽然能够解决所有的场景的问题,但是也会面临更多的挑战,你以为的完美架构,背后其实有着更多的坑。

1、对事务支持

分库分表后(无论是垂直还是水平拆分),就成了分布式事务了,如果依赖数据库本身的分布式事务管理功能去执行事务,将付出高昂的性能代价(XA事务);如果由应用程序去协助控制,形成程序逻辑上的事务,又会造成编程方面的负担(TCC、SAGA)。

2、多库结果并

(group by,order by)

由于数据分布于不同的数据库中,无法直接对其做分页、分组、排序等操作,一般应对这种多库结果并的查询业务都需要采用数据清洗、同步等其他手段处理(TIDB、KUDU等)。

3、数据延迟

主从架构下的多副本机制和水平分库后的聚合库都会存在主数据和副本数据之间的延迟问题。

4、跨库join

分库分表后表之间的关联操作将受到限制,我们无法join位于不同分库的表(垂直),也无法join分表粒度不同的表(水平), 结果原本一次查询就能够完成的业务,可能需要多次查询才能完成。

5、分片扩容

水平分片之后,一旦需要做扩容时。需要将对应的数据做一次迁移,成本代价都极高的。

6、ID生成

分库分表后由于数据库独立,原有的基于数据库自增ID将无法再使用,这个时候需要采用其他外部的ID生成方案。

一、应用层依赖类(JDBC)

这类分库分表中间件的特点就是和应用强耦合,需要应用显示依赖相应的jar包(以Java为例),比如知名的TDDL、当当开源的

sharding-jdbc

、蘑菇街的TSharding等。

此类中间件的基本思路就是重新实现JDBC的API,通过重新实现

DataSource

PrepareStatement

等操作数据库的接口,让应用层在

基本

不改变业务代码的情况下透明地实现分库分表的能力。

中间件给上层应用提供熟悉的JDBC API,内部通过

sql解析

sql重写

sql路由

等一系列的准备工作获取真正可执行的sql,然后底层再按照传统的方法(比如数据库连接池)获取物理连接来执行sql,最后把数据

结果合并

处理成ResultSet返回给应用层。

优点

缺点

二、中间层代理类(Proxy)

这类分库分表中间件的核心原理是在应用和数据库的连接之间搭起一个

代理层

,上层应用以

标准的MySQL协议

来连接代理层,然后代理层负责

转发请求

到底层的MySQL物理实例,这种方式对应用只有一个要求,就是只要用MySQL协议来通信即可。

所以用MySQL Navicat这种纯的客户端都可以直接连接你的分布式数据库,自然也天然

支持所有的编程语言

在技术实现上除了和应用层依赖类中间件基本相似外,代理类的分库分表产品必须实现标准的MySQL协议,某种意义上讲数据库代理层转发的就是MySQL协议请求,就像Nginx转发的是Http协议请求。

比较有代表性的产品有开创性质的Amoeba、阿里开源的Cobar、社区发展比较好的

Mycat

(基于Cobar开发)等。

优点

缺点

JDBC方案

:无中心化架构,兼容市面上大多数关系型数据库,适用于开发高性能的轻量级 OLTP 应用(面向前台)。

Proxy方案

:提供静态入口以及异构语言的支持,适用于 OLAP 应用(面向后台)以及对分片数据库进行管理和运维的场景。

混合方案

:在大型复杂系统中存在面向C端用户的前台应用,也有面向企业分析的后台应用,这个时候就可以采用混合模式。

JDBC 采用无中心化架构,适用于 Java 开发的高性能的轻量级 OLTP 应用;Proxy 提供静态入口以及异构语言的支持,适用于 OLAP 应用以及对分片数据库进行管理和运维的场景。

ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由

Sharding-JDBC

Sharding-Proxy

Sharding-Sidecar

(计划中)这3款相互独立的产品组成,他们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、容器、云原生等各种多样化的应用场景。

ShardingSphere提供的核心功能:

Sharding-Proxy

定位为透明化的

数据库代理端

,提供封装了

数据库二进制协议的服务端版本

,用于完成对

异构语言的支持

目前已提供MySQL版本,它可以使用

任何兼容MySQL协议的访问客户端

(如:MySQL Command Client, MySQL Workbench, Navicat等)操作数据,对DBA更加友好。

应用程序完全透明

,可直接当做MySQL使用。

适用于任何兼容MySQL协议的客户端。

Sharding-JDBC

定位为

轻量级Java框架

,在Java的JDBC层提供的额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为

增强版的JDBC驱动,完全兼容JDBC和各种ORM框架

以电商SaaS系统为例,前台应用采用Sharding-JDBC,根据业务场景的差异主要分为三种方案。

分库(用户)

问题解析:头部企业日活高并发高,单独分库避免干扰其他企业用户,用户数据的增长缓慢可以不分表。

拆分维度:企业ID分库

拆分策略:头部企业单独库、非头部企业一个库

分库分表(订单)

问题解析:订单数据增长速度较快,在分库之余需要分表。

拆分维度:企业ID分库、用户ID分表

拆分策略:头部企业单独库、非头部企业一个库,分库之后用户ID取模拆分表

单库分表(附件)

问题解析:附件数据特点是并发量不大,只需要解决数据增长问题,所以单库IO足以支撑的情况下分表即可。

拆分维度:用户ID分表

拆分策略:用户ID取模分表

问题一:分布式事务

分布式事务过于复杂也是分布式系统最难处理的问题,由于篇幅有限,后续会开篇专讲这一块内容。

问题二:分布式ID

问题三:跨片查询

举个例子,以用户id分片之后,需要根据企业id查询企业所有用户信息。

sharding针对跨片查询也是能够支持的,本质上sharding的跨片查询是采用同时查询多个分片的数据,然后聚合结果返回,这个方式对资源耗费比较大,特别是对数据库连接资源的消耗。

假设分4个数据库,8个表,则sharding会同时发出32个SQL去查询。一下子消耗掉了32个连接;

特别是针对单库分表的情况要注意,假设单库分64个表,则要消耗64个连接。如果我们部署了2个节点,这个时候两个节点同时查询的话,就会遇到数据库连接数上限问题(mysql默认100连接数)

问题四:分片扩容

随着数据增长,每个片区的数据也会达到瓶颈,这个时候需要将原有的分片数量进行增加。由于增加了片区,原先的hash规则也跟着变化,造成了需要将旧数据做迁移。

假设原先1个亿的数据,hash分64个表,现在增长到50亿的数据,需要扩容到128个表,一旦扩容就需要将这50亿的数据做一次迁移,迁移成本是无法想象的。

问题五:一致性哈希

首先,求出每个

服务器的hash值

,将其配置到一个

0~2^n 的圆环上

(n通常取32)

其次,用同样的方法求出待

存储对象的主键 hash值

,也将其配置到这个圆环上。

然后,从数据映射到的位置开始顺时针查找,将数据分布到找到的之一个服务器节点上。

一致性hash的优点在于加入和删除节点时只会影响到在哈希环中相邻的节点,而对其他节点没有影响。

所以使用一致性哈希在集群扩容过程中可以减少数据的迁移。

好了,这次分享到这里,我们日常的实践可能只会用到其中一种方案,但它不是数据库架构的全貌,打开技术视野,才能更好地把存储工具利用起来。

老规矩,一键三连,日入两千,点赞在看,年薪百万!

本文作者:Jensen

7年Java老兵,小米主题设计师,手机输入法设计师,ProcessOn特邀讲师。

曾涉猎航空、电信、IoT、垂直电商产品研发,现就职于某知名电商企业。

技术公众号

【架构师修行录】

号主,专注于分享日常架构、技术、职场干货,Java Goals:架构师。

交个朋友,一起成长!

如何描述数据库的架构的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于如何描述数据库的架构,数据库架构:详解设计组成及其功能。,数据库系统中的几种架构及处理方式,数据库架构选型与落地,看这篇就够了的信息别忘了在本站进行查找喔。


数据运维技术 » 数据库架构:详解设计组成及其功能。 (如何描述数据库的架构)