数据库软件架构,到底要设计些什么?

简介: 可用性、读性能、一致性、扩展性。

一、基本概念


概念一:单库
image.png

概念二:分片
image.png

分片解决“数据量太大”这一问题,也就是通常说的“水平切分”。


一旦引入分片,势必面临“数据路由”的新问题,数据到底要访问哪个库。路由规则通常有3种方法:

(1)范围:range

优点:简单,容易扩展。

缺点:各库压力不均(新号段更活跃)。


(2)哈希:hash

优点:简单,数据均衡,负载均匀。

缺点:迁移麻烦(2库扩3库数据要迁移)。


(3)统一路由服务:router-config-server

优点:灵活性强,业务与路由算法解耦。

缺点:每次访问数据库前多一次查询。


大部分互联网公司采用的方案二:哈希路由


概念三:分组
image.png


分组解决“可用性,性能提升”这一问题,分组通常通过主从复制的方式实现。


互联网公司数据库实际软件架构是“既分片,又分组”:
image.png

数据库软件架构,究竟设计些什么呢,至少要考虑以下四点:

  • 如何保证数据可用性

  • 如何提高数据库读性能(大部分应用读多写少,读会先成为瓶颈)

  • 如何保证一致性

  • 如何提高扩展性



二、如何保证数据的可用性?

解决可用性问题的思路是:冗余


如何保证站点的可用性?冗余站点。

如何保证服务的可用性?冗余服务。

如何保证数据的可用性?冗余数据。


数据的冗余,会带来一个副作用:一致性问题。


如何保证数据库“读”高可用?

冗余读库。
image.png

冗余读库带来什么副作用?

读写有延时,数据可能不一致

上图是很多互联网公司mysql的架构,写仍然是单点,不能保证写高可用。


如何保证数据库“写”高可用?

冗余写库。
image.png


采用双主互备的方式,可以冗余写库。


冗余写库带来什么副作用?

双写同步,数据可能冲突(例如“自增id”同步冲突)。


如何解决同步冲突,有两种常见解决方案:

(1)两个写库使用不同的初始值,相同的步长来增加id:1写库的id为0,2,4,6...;2写库的id为1,3,5,7…;

(2)不使用数据的id,业务层自己生成唯一的id,保证数据不冲突;


阿里云的RDS服务号称写高可用,是如何实现的呢?

他们采用的就是类似于“双主同步”的方式(不再有从库了)。
image.png


仍是双主,但只有一个主提供读写服务,另一个主是“shadow-master”,只用来保证高可用,平时不提供服务。


master挂了,shadow-master顶上,虚IP漂移,对业务层透明,不需要人工介入。


这种方式的好处:

(1)读写没有延时,无一致性问题;

(2)读写高可用;


不足是:

(1)不能通过加从库的方式扩展读性能;

(2)资源利用率为50%,一台冗余主没有提供服务;

画外音:所以,高可用RDS还挺贵的。


三、如何扩展读性能?

提高读性能的方式大致有三种,第一种是增加索引


这种方式不展开,要提到的一点是,不同的库可以建立不同的索引。
image.png


如上图:

(1)写库不建立索引;

(2)线上读库建立线上访问索引,例如uid;

(3)线下读库建立线下访问索引,例如time;


第二种扩充读性能的方式是,增加从库


这种方法大家用的比较多,存在两个缺点:

(1)从库越多,同步越慢;

(2)同步越慢,数据不一致窗口越大;


第三种增加系统读性能的方式是,增加缓存


常见的缓存架构如下:
image.png


(1)上游是业务应用;

(2)下游是主库,从库(读写分离),缓存;


如果系统架构实施了服务化

(1)上游是业务应用;

(2)中间是服务;

(3)下游是主库,从库,缓存
image.png


业务层不直接面向db和cache,服务层屏蔽了底层db、cache的复杂性。


不管采用主从的方式扩展读性能,还是缓存的方式扩展读性能,数据都要复制多份(主+从,db+cache),一定会引发一致性问题。


四、如何保证一致性?


主从数据库的一致性,通常有两种解决方案:

(1)中间件
image.png


如果某一个key有写操作,在不一致时间窗口内,中间件会将这个key的读操作也路由到主库上。


(2)强制读主
image.png


“双主高可用”的架构,主从一致性的问题能够大大缓解。


第二类不一致,是db与缓存间的不一致。
image.png


另外建议,所有允许cache miss的业务场景,缓存中的KEY都设置一个超时时间,这样即使出现不一致,有机会得到自修复。


五、如何保障数据库的扩展性?

秒级成倍数据库扩容:

亿级数据DB秒级平滑扩容》


如果不是成倍扩容:

《100亿数据平滑数据迁移,不影响服务》


也可能,是要对字段进行扩展:

《1万属性,100亿数据,架构设计?》


这些方案,都有相关文章展开写过,本文不再赘述。


数据库软件架构,到底要设计些什么?

  • 可用性

  • 读性能

  • 一致性

  • 扩展性


希望对大家系统性理解数据库软件架构有帮助。

本文转自“架构师之路”公众号,58沈剑提供。

目录
相关文章
|
1月前
|
SQL NoSQL 前端开发
基于BS架构的饰品购物平台设计与实现(程序+文档+数据库)
基于BS架构的饰品购物平台设计与实现(程序+文档+数据库)
|
1月前
|
存储 监控 安全
360 企业安全浏览器基于阿里云数据库 SelectDB 版内核 Apache Doris 的数据架构升级实践
为了提供更好的日志数据服务,360 企业安全浏览器设计了统一运维管理平台,并引入 Apache Doris 替代了 Elasticsearch,实现日志检索与报表分析架构的统一,同时依赖 Doris 优异性能,聚合分析效率呈数量级提升、存储成本下降 60%....为日志数据的可视化和价值发挥提供了坚实的基础。
360 企业安全浏览器基于阿里云数据库 SelectDB 版内核 Apache Doris 的数据架构升级实践
|
1月前
|
存储 缓存 关系型数据库
鱼和熊掌如何兼得?一文解析RDS数据库存储架构升级
阿里云RDS率先推出新型存储类型通用云盘,提供低延迟、低成本、高持久性的用户体验。
鱼和熊掌如何兼得?一文解析RDS数据库存储架构升级
|
1天前
|
存储 人工智能 NoSQL
探索数据库技术的奥秘:从基础架构到前沿应用
一、引言 在数字化时代,数据库技术作为信息管理的基石,已经渗透到我们生活的方方面面
|
1天前
|
存储 SQL Cloud Native
揭秘数据库技术的核心与未来:从架构到应用
一、引言 数据库技术是当代信息系统中不可或缺的一部分,它为企业和个人提供了可靠、高效的数据管理解决方案
|
1天前
|
存储 Cloud Native 物联网
数据库技术前沿探索:架构、优化与行业实践
一、引言 在信息化和数字化的浪潮中,数据库技术作为企业核心竞争力的关键要素,其重要性不言而喻
|
2天前
|
存储 SQL 数据库
数据库技术探索:基础架构、应用场景与未来展望
一、引言 数据库技术是信息时代的基石,为企业和组织提供了数据存储、检索、分析和管理的核心支撑
|
9天前
|
缓存 关系型数据库 MySQL
MySQL数据库——InnoDB引擎-架构-内存结构(Buffer Pool、Change Buffer、Adaptive Hash Index、Log Buffer)
MySQL数据库——InnoDB引擎-架构-内存结构(Buffer Pool、Change Buffer、Adaptive Hash Index、Log Buffer)
24 3
|
14天前
|
数据库 微服务 NoSQL
探索微服务架构下的数据库选型与优化策略
在现代软件开发中,微服务架构已成为一种常见的设计范式。而数据库在微服务架构中的选型与优化策略对整个系统的性能和稳定性至关重要。本文将探讨在微服务环境下,如何选择适合的数据库类型以及优化数据库性能的策略。
|
15天前
|
NoSQL 关系型数据库 MySQL
高可用数据库架构:互备(Multi-Master)技术详解
本文介绍了分布式系统中的互备(Multi-Master)机制,特别是在高可用数据库系统中的应用。互备机制超越了传统的主从复制,允许每个Master节点同时进行读写操作并互相同步数据,以提高可用性和负载均衡。文章探讨了主从复制与互备模式的区别,以及互备模式的数据同步和冲突解决策略。还以MySQL的双主复制和MongoDB的副本集为例,展示了MM模式在数据库高可用性中的实践。最后,强调了互备在未来分布式系统中的重要性。
30 7