典型数据库架构设计与实践 | 架构师之路

简介: 转载自微信公众号【架构师之路】本文,将介绍数据库架构设计中的一些基本概念,常见问题以及对应解决方案,为了便于读者理解,将以“用户中心”数据库为例,讲解数据库架构设计的常见玩法。

转载自微信公众号【架构师之路】

本文,将介绍数据库架构设计中的一些基本概念常见问题以及对应解决方案,为了便于读者理解,将以“用户中心”数据库为例,讲解数据库架构设计的常见玩法。

一、用户中心

用户中心是一个常见业务,主要提供用户注册、登录、信息查询与修改的服务,其核心元数据为:
User(uid, uname, passwd, sex, age,nickname, …)
其中:

  • uid为用户ID,主键

  • uname, passwd, sex, age, nickname, …等为用户的属性

数据库设计上,一般来说在业务初期,单库单表就能够搞定这个需求。

二、图示说明

为了方便大家理解,后文图片说明较多,其中:

  • “灰色”方框,表示service,服务
  • “紫色”圆框,标识master,主库
  • “粉色”圆框,表示slave,从库

三、单库架构

单库架构

最常见的架构设计如上:
- user-service:用户中心服务,对调用者提供友好的RPC接口
- user-db:一个库进行数据存储

四、分组架构

分组架构

什么是分组?

:分组架构是最常见的一主多从主从同步读写分离数据库架构:

  • user-service:依旧是用户中心服务
  • user-db-M(master):主库,提供数据库写服务
  • user-db-S(slave):从库,提供数据库读服务

主和从构成的数据库集群称为“组”。

分组有什么特点?

:同一个组里的数据库集群:

  • 主从之间通过binlog进行数据同步
  • 多个实例数据库结构完全相同
  • 多个实例存储的数据也完全相同,本质上是将数据进行复制
分组架构究竟解决什么问题?

大部分互联网业务读多写少数据库的读往往最先成为性能瓶颈,如果希望:

  • 线性提升数据库读性能
  • 通过消除读写锁冲突提升数据库写性能
  • 通过冗余从库实现数据的“读高可用”

此时可以使用分组架构,需要注意的是,分组架构中,数据库的主库依然是写单点。

一句话总结,分组解决的是“数据库读写高并发量高”问题,所实施的架构设计。

五、分片架构

分片架构

什么是分片?

:分片架构是大伙常说的水平切分(sharding)数据库架构:

  • user-service:依旧是用户中心服务
  • user-db1:水平切分成2份中的第一份
  • user-db2:水平切分成2份中的第二份

分片后,多个数据库实例也会构成一个数据库集群。

水平切分,到底是分库还是分表?

强烈建议分库,而不是分表,因为:

  • 分表依然公用一个数据库文件,仍然有磁盘IO的竞争
  • 分库能够很容易的将数据迁移到不同数据库实例,甚至数据库机器上,扩展性更好
水平切分,用什么算法?

:常见的水平切分算法有“范围法”“哈希法”:

范围法如上图:以用户中心的业务主键uid为划分依据,将数据水平切分到两个数据库实例上去:

  • user-db1:存储0到1千万的uid数据
  • user-db2:存储1到2千万的uid数据

哈希法如上图:也是以用户中心的业务主键uid为划分依据,将数据水平切分到两个数据库实例上去:

  • user-db1:存储uid取模得1的uid数据
  • user-db2:存储uid取模得0的uid数据

这两种方法在互联网都有使用,其中哈希法使用较为广泛。

分片有什么特点?

:同一个分片里的数据库集群:

  • 多个实例之间本身不直接产生联系,不像主从间有binlog同步
  • 多个实例数据库结构,也完全相同
  • 多个实例存储的数据之间没有交集,所有实例间数据并集构成全局数据
分片架构究竟解决什么问题?

:大部分互联网业务数据量很大,单库容量容易成为瓶颈,此时可以通过分片:

  • 线性提升数据库写性能,需要注意的是,分组架构是不能线性提升数据库写性能的
  • 降低单库数据容量

一句话总结,分片解决的是“数据库数据量大”问题,所实施的架构设计。

六、分组+分片架构

如果业务读写并发量很高,数据量也很大,通常需要实施分组+分片的数据库架构:

  • 通过分片来降低单库的数据量,线性提升数据库的写性能
  • 通过分组来线性提升数据库的读性能,保证读库的高可用

七、垂直切分

除了水平切分,垂直切分也是一类常见的数据库架构设计,垂直切分一般和业务结合比较紧密。

还是以用户中心为例,可以这么进行垂直切分:
User(uid, uname, passwd, sex, age, …)
User_EX(uid, intro, sign, …)

  • 垂直切分开的表,主键都是uid
  • 登录名,密码,性别,年龄等属性放在一个垂直表(库)里
  • 自我介绍,个人签名等属性放在另一个垂直表(库)里
如何进行垂直切分?

:根据业务对数据进行垂直切分时,一般要考虑属性的“长度”和“访问频度”两个因素:

  • 长度较短,访问频率较高的放在一起
  • 长度较长,访问频度较低的放在一起

这是因为,数据库会以行(row)为单位,将数load到内存(buffer)里,在内存容量有限的情况下,长度短且访问频度高的属性,内存能够load更多的数据,命中率会更高,磁盘IO会减少,数据库的性能会提升。

垂直切分有什么特点?

:垂直切分和水平切有相似的地方,又不太相同:

  • 多个实例之间也不直接产生联系,即没有binlog同步
  • 多个实例数据库结构,都不一样
  • 多个实例存储的数据之间至少有一列交集,一般来说是业务主键,所有实例间数据并集构成全局数据
垂直切分解决什么问题?

:垂直切分即可以降低单库的数据量,还可以降低磁盘IO从而提升吞吐量,但它与业务结合比较紧密,并不是所有业务都能够进行垂直切分的。

八、总结

文章较长,希望至少记住这么几点:

  • 业务初期用单库

  • 读压力大,读高可用,用分组

  • 数据量大,写线性扩容,用分片

  • 属性短,访问频度高的属性,垂直拆分 到一起

希望大伙有收获。
本文转载自微信公众号【架构师之路】

目录
相关文章
|
13天前
|
Kubernetes 安全 Java
构建高效微服务架构:从理论到实践
【4月更文挑战第9天】 在当今快速迭代与竞争激烈的软件市场中,微服务架构以其灵活性、可扩展性及容错性,成为众多企业转型的首选。本文将深入探讨如何从零开始构建一个高效的微服务系统,覆盖从概念理解、设计原则、技术选型到部署维护的各个阶段。通过实际案例分析与最佳实践分享,旨在为后端工程师提供一套全面的微服务构建指南,帮助读者在面对复杂系统设计时能够做出明智的决策,并提升系统的可靠性与维护效率。
|
6天前
|
消息中间件 运维 监控
现代化软件开发中的微服务架构设计与实践
本文将深入探讨现代化软件开发中微服务架构的设计原则和实践经验。通过分析微服务架构的优势、挑战以及常见的设计模式,结合实际案例,帮助开发者更好地理解如何构建可靠、可扩展、高效的微服务系统。
|
6天前
|
负载均衡 Java 开发者
细解微服务架构实践:如何使用Spring Cloud进行Java微服务治理
【4月更文挑战第17天】Spring Cloud是Java微服务治理的首选框架,整合了Eureka(服务发现)、Ribbon(客户端负载均衡)、Hystrix(熔断器)、Zuul(API网关)和Config Server(配置中心)。通过Eureka实现服务注册与发现,Ribbon提供负载均衡,Hystrix实现熔断保护,Zuul作为API网关,Config Server集中管理配置。理解并运用Spring Cloud进行微服务治理是现代Java开发者的关键技能。
|
7天前
|
敏捷开发 监控 前端开发
深入理解自动化测试框架Selenium的架构与实践
【4月更文挑战第16天】 在现代软件开发过程中,自动化测试已成为确保产品质量和加快迭代速度的关键手段。Selenium作为一种广泛使用的自动化测试工具,其开源、跨平台的特性使得它成为业界的首选之一。本文旨在剖析Selenium的核心架构,并结合实际案例探讨其在复杂Web应用测试中的高效实践方法。通过详细解读Selenium组件间的交互机制以及如何优化测试脚本,我们希望为读者提供深入理解Selenium并有效运用于日常测试工作的参考。
14 1
|
10天前
|
Linux 数据安全/隐私保护
Linux基础与服务器架构综合小实践
【4月更文挑战第9天】Linux基础与服务器架构综合小实践
1225 8
|
11天前
|
SQL 监控 数据库
数据库管理与电脑监控软件:SQL代码优化与实践
本文探讨了如何优化数据库管理和使用电脑监控软件以提升效率。通过SQL代码优化,如使用索引和调整查询语句,能有效提高数据库性能。同时,合理设计数据库结构,如数据表划分和规范化,也能增强管理效率。此外,利用Python脚本自动化收集系统性能数据,并实时提交至网站,可实现对电脑监控的实时性和有效性。这些方法能提升信息系统稳定性和可靠性,满足用户需求。
40 0
|
19天前
|
消息中间件 监控 API
构建高性能微服务架构:从理论到实践
【4月更文挑战第4天】 在当今互联网应用的快速迭代和高并发需求下,传统的单体应用架构已不足以满足市场的灵活性与扩展性要求。微服务架构以其独立部署、弹性伸缩、技术多样性等优势,成为众多企业转型升级的首选方案。本文将深入探讨如何构建一个高性能的微服务系统,涵盖关键组件的选择、系统设计的考量以及性能优化的策略,旨在为开发者和架构师提供一套实用的指导思路和具体实践步骤。
|
21天前
|
机器学习/深度学习 人工智能 架构师
【架构师】AI时代架构师必备技能
【架构师】AI时代架构师必备技能
|
22天前
|
消息中间件 安全 API
构建高效微服务架构:策略与实践
【4月更文挑战第1天】在数字化转型的浪潮中,微服务架构已成为企业追求敏捷、可扩展和灵活部署的重要技术手段。本文将深入探讨如何通过合理的设计原则和先进的技术栈,构建一个高效的微服务系统。我们将剖析微服务设计的核心要点,包括服务的划分、通信机制、数据一致性以及安全性问题,并结合案例分析,展示如何在现实世界中应用这些策略以提升系统的可靠性和性能。
|
22天前
|
设计模式 API 持续交付
构建高效微服务架构:从理论到实践
在当今快速迭代和部署的软件开发环境中,微服务架构已成为一种流行的设计模式,它允许开发团队以模块化的方式构建、维护和扩展应用程序。本文将深入探讨微服务的核心概念,包括其定义、优势、挑战以及如何在实际项目中实施。我们将通过一个实际案例来展示如何将传统的单体应用拆分成一系列独立、松耦合的服务,并通过容器化、服务发现、API网关和持续集成/持续部署(CI/CD)等技术手段来管理这些服务。