首页 > 编程学习 > 数据库存储架构

数据库存储架构

发布时间:2022/11/15 6:06:59

读写分离架构

在这里插入图片描述

实现原理

  1. 数据库服务器搭建主从集群,一主一从、一主多从都可以
  2. 数据库主机负责读写操作,从机只负责读操作
  3. 数据库主机通过复制将数据同步到从机,每台数据库服务器都存储了所有的业务数据
  4. 业务服务器将读写操作发给数据库主机,将读操作发给数据库从机

如何判断要读写分离

  1. 业务量持续增长
  2. 先优化(优化索引,加入缓存)再重构

复杂度分析

复制延迟

应对方法
应对方法具体说明缺点
读写绑定写操作后的读操作指令发给数据库主服务器业务侵入很大,容易留坑
二次读取读从机失败后再读一次主机如果有很多二次读取,将大大增加主机的读操作压力
业务分级关键业务读写操作全部指向主机,非关键业务采用读写分离编码人员容易全部采用读写主机

任务分解

应对方法
应对方法图示优点缺点
程序代码封装模式在这里插入图片描述
1. 实现简单,基于JDBC封装
2. 维护简单,无部署,无需考虑高性能高可用
1. 每个语言都要实现一遍
中间件封装模式在这里插入图片描述
1. 跨语言1. 实现复杂,独立服务器,需要实现连接管理
2. 维护复杂,需要独立部署,并且要考虑集群部署支持高性能高可用

分库分表架构

数据分库

在这里插入图片描述

问题具体说明解法
join问题原本在同一个数据库中的表分散到不同数据库中,导致无法使用SQL的join查询1. 小表冗余
将一些小表在每个库中冗余一份,例如字典表
2. 代码join
在代码中实现join功能
3. 字段冗余
例如订单表直接记录商品类型
事务问题表分散到不同的数据库中,无法通过事务统一修改分布式事务

数据分表

在这里插入图片描述

垂直拆分

按列拆分,优化单机处理性能,常见于2B领域超多列的表拆分

水平拆分

在这里插入图片描述

按行拆分,提升系统处理性能,常见于2C领域超多行的表拆分

问题具体说明
路由问题路由算法进行计算数据归属
count操作如何计算count
join操作如何执行与其他表join
order by如何执行order by
瓶颈

在这里插入图片描述

  1. 每个应用都需要连接所有的分片,当应用数量增多后,数据库连接会逐渐成为瓶颈。以为MySQL为例,默认100连接,实测50~100连接性能最高,超过200后会显著下降
  2. 单个Sharding-JDBC的聚合操作会有性能瓶颈

多大的表需要拆分

  1. B+Tree的层数:3层大约是2000万条
  2. Innodb buffer poo:2000万数据,每条数据100字节,单表就2G了
  3. 数据量持续增长的表

分布式事务算法

2PC(实际应用更广泛)

在这里插入图片描述

阶段问题
阶段1单个参与者故障会导致整体事务失败
阶段2事务协调者故障会导致整体状态不一致,参与者一直等待事务协调者指令,可能需要人工修复

3PC

在这里插入图片描述

  1. Yes丢了会导致协调者取消事务
  2. 部分preCommit丢了会导致部分参与者超时取消事务,其他参与者收到了preCommit消息,然后超时提交事务,因此造成脑裂
  3. Ack丢了会导致参与者超时提交事务
  4. doCommit丢失会导致参与者超时提交事务

MySQL XA

外部XA

跨多MySQL实例的分布式事务,由应用程序代码作为2PC的事务协调者

内部XA

跨同一实例多存储引擎的事务,由Binlog作为2PC的事务协调者

Copyright © 2010-2022 dgrt.cn 版权所有 |关于我们| 联系方式