随着互联网业务的飞速发展,数据量与并发量的爆发式增长对传统单机数据库提出了严峻挑战。为了解决性能瓶颈、提升系统的高可用性与扩展性,架构师们逐步演化出了一套成熟的高性能数据库存储体系。本文将从
一、 读写分离
1. 核心原理
-
主机(Master) :负责所有的写操作(INSERT, UPDATE, DELETE)。 -
从机(Slave) :负责所有的读操作(SELECT)。 -
数据同步 :主机的数据变更通过Binlog异步复制到从机,保证数据的一致性。
2. 复杂度与挑战
2.1 复制延迟
-
读写绑定 :对于对一致性要求极高的请求(如用户刚修改完个人资料),强制将其读请求路由到主库。 -
二次读取 :当在从库读取失败(数据不存在)时,尝试回源到主库再次读取。 -
业务分级 :根据业务容忍度进行分级。核心业务(如订单支付状态)读主库;非核心业务(如评论列表、日志)读从库,容忍短暂延迟。
2.2 任务分解
-
代码封装 :在应用层(如DAO层)通过代码逻辑判断SQL类型,手动指定数据源。 -
中间件封装 :引入数据库中间件(如ShardingSphere, MyCat),对业务应用透明,由中间件自动解析SQL并分发流量。
二、 分库分表
1. 分表策略
-
垂直拆分 :将一张宽表拆分为多张表(如将大字段单独拆表)。 -
目的 :提升单机处理性能(减少磁盘I/O,提高内存缓存命中率)。
-
水平拆分 :按照特定规则(如User ID取模、时间范围)将数据分散到多个表中。 -
目的 :提升集群处理性能,突破单机存储瓶颈。 -
挑战 :中间件需要解决跨表的 JOIN 、 ORDER BY 、 COUNT 等聚合操作的复杂性。
2. 分库策略与跨库关联
-
小表冗余 :对于数据量小且变动少的字典表(如省份表、配置表),在每个分库中都保存一份副本。 -
代码 JOIN :在应用层分别查询出数据,然后在内存中进行组装(Map拼装)。 -
字段冗余 :在设计表结构时,反范式设计,将需要频繁关联查询的字段直接冗余在主表中,避免关联查询。
三、 数据库分布式事务
1. 2PC (两阶段提交)
-
缺点 : -
同步阻塞 :参与者在等待协调者指令时处于阻塞状态,性能较差。 -
一直等待 :如果协调者宕机,参与者可能无限等待。 -
人工介入 :在极端异常情况下,往往需要人工介入修复数据。
2. 3PC (三阶段提交)
-
缺点 : -
更复杂 :协议交互过程繁琐,实现难度大。 -
脑裂 :在网络分区的情况下,仍然可能导致数据不一致。
通过以上对读写分离、分库分表及分布式事务的梳理,我们可以看到,高性能数据库存储架构的设计本质上是一个
也可以加我微信,一起交流学习!

