数据访问层

  • 单机数据库

ff2ee5301b1d696984cef610df89c039109.jpg

数据库减压:

  • 硬件升级(简单粗暴、效果明显、很快进入瓶颈,解决不了)
  • 其他三思路:
    • 优化应用(是否给了数据库不必要的压力)
    • 是否有其他办法减轻数据库的压力(引入缓存、搜索引擎)
    • 把数据库的数据和访问分布多台机器上
      • 垂直拆分(不同业务单元拆分到不同的库里)
        • 带来影响:
          • 单机ACID 变得复杂
          • Jion操作变得困难
          • 靠外键约束场景受影响
      • 水平拆分(按照一定规则,把统一业务单元数据拆分到不同库里面)
        • 带来影响:
          • 单机ACID 变得复杂
          • Jion操作变得困难
          • 靠外键约束场景受影响
          • 单库的自增id 唯一序列受影响
          • 单个逻辑意义上表的查询要跨库

分布式事务x/open DTP模型

d6d835feb99e5b8897237f051b2f44561d2.jpg

 

e7b1d7cfd468987bc3ace272863f00cad74.jpg

  • 2PC(两阶段正常提交)

56788b77204c2f029497e8427029984ae2d.jpg

6a3e66db6994fa538c6b03f38a973414979.jpg

  • 2PC(回滚情况)

ff74ed1a415f9b78e928dd9b9746e7b0409.jpg

CAP理论:

  • 一致性
  • 可用性
  • 分区容错性

df0b3bd597df98cfe8b78ce6438bbf7cb2c.jpg

BASE理论:

3457551ca3eb72f59016055e21c48afaa20.jpg

  • 选择AP 对于C ,确保最终一致性就好

Paxos 协议:

  • 比两阶段更加轻量级的一致性协议
  • 分布式系统中,节点之间信息交换有两种方式:
    • 共享内存
    • 信息投递
      • 分布式系统中,信息投递会发生很多意外:网络问题、进程挂掉、反应很慢、进程重启、机器挂掉等
  • 不存在拜占庭将军问题(即:通信环境不可靠)
  • 本人已有博客专门讨论该问题,不做赘述

集群内数据一致性算法:

Quorum算法(权衡分布式系统中数据一致性和可用性的)

4f42a84ccaf2e8674def538bdacdf5f34a5.jpg

  • W+R>N 强一致性
  • W+R<=N最终一致性 

Vector Lock算法

  • 对同一份数据的修改,每次都加上<修改者,版本号>
  • 比如:能看书Dave 的建议版本2最新

9748a1b9ee0c2d70d1eb056fef0051634e8.jpg

ec9a50a64e730bc6f365cf7aca9e7148dd8.jpg

多机 Sequence 问题与处理

  • 单机序列不是问题,分库分表后成为问题
    • 连续性
    • 唯一性
      • 单考虑唯一性,UUID
  • 分布式系统中,可以考虑做一个独立的系统来完成该工作(ID生成器)
    • 存在问题需要解决:
      1. 性能问题
        • 每次远程取id 会有资源消耗(改进:每次取一段id,缓存到本地;但是取了后不用会照成浪费)
      2. 生成器稳定性问题
        • id 生成器作为一个无状态集群,其可用性要靠整个集群来保证
      3. 存储的问题
        • 选择空间大,需要根据不同类型对应不同的容灾方案

06588081720e7f2ea89af8a601a790bd5e6.jpg

  • 改进:省掉单独的id 生成器,这样数据可能不是严格的顺序增长的,需要额外的管理

a10a48faa01449d32733b9b41602425ae73.jpg

应对多机的数据查询:

  • 跨库join:
    • 在应用层,把原来join 操作分成多个数据库操作
    • 对常用数据进行冗余,变跨库为单表
    • 借助外部系统解决一些跨库问题,比如:搜索引擎
  • 外键约束
    • 比较难解决,不能完全依靠数据库本身,需要应用程序的合作

跨库查询问题及解决:

9300593f57c37cb89bd2bf0be4b61055e6a.jpg

  • 具体要参看如何分库分表的
  • 排序
    • 各路先排好序、再多路归并排序
  • 函数处理
  • 求平均值
    • 多数据源求和后,再算平均值
  • 非排序分页
    • 同等步长
      • 数字代表所在页数
        • 9d41fdd440eb8e2381747baf532f613cf0a.jpg
    • 同等比例
      • 数字代表所在页数
      • fd4955b3b2a5cad2e2cf9ca52fe09e92029.jpg
  • 排序后分页
    • 各个数据源排序,归并
    • 大型系统请尽量避免

数据访问层,简称数据层:

  • 数据读写的抽象层
  • 对外提供访问层方式:
    • 第一种:为用户提供专有API(不推荐,通用性很差),即便采用也要提供通用方式
    • 第二种:通用方式,Java提供JDBC
    • 还有一种,基于ORM类或ORM接口的形式(myBatis、hibernate、springJDBC)

53154cfa423704cfd59f5e58598751120eb.jpg

  • 合并排序查询场景下,取一页4条数据,需要在每一个数据源取4条作比较,取出排在最前面的4条
    • 主要是要考虑极端情况,有可能某一数据源的4条数据就是要的4条
    • JDBC 的方式实现
      • 使用jdbc 的方式,可以设置每次取回的数据,做链式排序,分多次查询取回(要考虑网络平衡)

按照数据流程的顺序,看数据层设计

0e19a9983354e1f0c4f0b18e044c6e48b9c.jpg

  • 规则处理

40beeba1a4ff140a1c0ea7263c703e5230c.jpg

5981dbad2a449077c819af74dfa569ae62e.jpg

  • 一致性哈希算法
    • 把节点对应的hash 值变成一个范围
    • d52ffdd8658cd8d34003b4e13dc2cd7f0b5.jpg
    • 减去一个节点(范围),变成:7163cb8e6389fab7a17f300665d07c8460b.jpg
      • 第一和第四管理的数据没影响,第三也没影响,把第二映射到第三就好
    • 增加一个节点道理类似

3f3dd34cecfa9c0fa7daa2bad6227f79950.jpg

  • 增加节点时,只有一个节点受影响,增加节点和受影响节点负载明显低于其他
  • 减少节点反之

虚拟节点对一致性hash 进行改进

  • 4个物理节点变成多个虚拟节点,增加一个物理节点就会增加相应的多个虚拟节点
  • 这些插入的虚拟节点均匀分配到5个物理节点上

映射表与规则自定义计算

  • 一般用于热点数据的特殊处理

自定义规则计算是最灵活的方式

########################

分库分表没有统一的规则

  • 原则是分库后尽量避免跨库查询

数据源管理多个分库

ee4d4fe8ba7dd4e72a884d1340a4bf1bd6a.jpg

  • spring 配置多个数据源
    • 可以考虑在配置管理中心统一配置

3792bc85f25e37091779461b36d4e8064fd.jpg

  • 数据源分组

ea60ea6aef4cc17b0d7cab3dc0b7601d74d.jpg

  • 管理单库的数据源
    • 可以把单个数据源配置集中起来统一存储
    • 机房迁移改ip非常方便
    • 禁止某些sql的执行等

b9572851178524f8933fad0152155a7e0c1.jpg

  • 三层数据源整体视图

2af2f241fb48efc41d49f6acd0df866025a.jpg

  • 独立部署的数据访问层

6d8702e215445bb161a5ebaf4e4d4088541.jpg

838ada1f03f4a7c39c3dcce3105f0bb3708.jpg

  • 读写分离带来的挑战

740eac339f596d44b16aa31b352b3bf5a1e.jpg

  • 主库从库非对称场景

27b8271950b9051ed67176a6881bae0a3a7.jpg

  • 获得消息后开始进行数据的复制(行复制)
    • 不优雅,优雅的方式应该采用基于数据库日志进行数据复制

59a58a800dcbd776a687ff5b778de07fae6.jpg

  • 数据库复制在读写分离中是比较关键的任务
    • 也有非对称场景:
      • 主从不是镜像关系
      • 主从采用不同库

e22ef88de9ba5afa8b0857047a1922c8f13.jpg

  • 数据变更平台

772bb1c6a91644f3642785e6aa59e2ee362.jpg

  • 数据平滑迁移
    • 扩容、缩容不能接受长时间停机:
      • 平滑迁移
        • 最大挑战:迁移过程中又会有数据变化
        • 可以考虑方案:
          • 在开始进行数据迁移时,记录增量的日志,迁移结束后再对增量的变化进行处理
          • 最后被迁移数据的写暂停,保证增量数据处理完毕,再放开

3169769f517e86d368fe6437cf766a31edb.jpg

15e59fc7ace9276c30b5de7bab136da2ea4.jpg

4c1fcb27573c6edf935069ee0f175d8c30a.jpg

 

转载于:https://my.oschina.net/u/3847203/blog/2872545

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值