DDIA读书笔记【数据分区(再平衡)】

289 阅读3分钟

这是我参与2022首次更文挑战的第25天,活动详情查看:2022首次更文挑战

分区再平衡

随着时间的变化,数据库的存储情况可能会发生一些变化

  • 查询压力增加
  • 数据量增加
  • 节点失效

以上的过程都涉及到节点流量的再分配,这个过程被称为分区再平衡,在这个过程中需要满足以下条件:

  • 平衡后数据分布更加均匀
  • 平衡过程中,集群依旧向外提供正常服务
  • 整个过程要快,同时避免更多的网络带宽与磁盘I/O的消耗

动态再平衡策略

不好的策略:取模

取模之后,随着底数N的变化,大量的数据需要进行迁移,增加了数据迁移的成本

固定数量的分区

在初始设置远超实际节点数的分区数,当出现新增节点或者分区再分配的时候,直接使用分区迁移即可

  • 数据与分区的映射关系不会改变

  • 在分区进行迁移的过程中,旧的分区可以支持服务

  • 在实际过程中,可以支持分区的合并与拆解\

    • 但是固定数量的分区操作会更加简单

动态分区

当分区的数据超过设置的阈值的时候就会进行分区的拆解,如果小于某个阈值就会进行分区的合并

  • 一个分区总是分配给一个节点
  • 一个节点可以拥有多个分区
  • 依赖底层的HDFS分布式文件系统进行分区文件的传输

需要注意的是:

  • 分区一开始是没有数据的,这意味着在一开始的时候,可能只有一个分区,而这个分区只在一个节点上\

    • 在后续数据库支持了预分区

按节点比例进行分区

分区数与节点数成正比,每一个节点拥有的分区数是固定的,节点数据增长的时候,分区数据也是成比例的数据增长

  • 新节点加入的时候,会从已有节点中进行分裂,拿走一半的数据量

请求路由

当客户进行数据请求的时候,如何知道应该连接哪一个节点,这个就属于服务发现问题了

几种结局策略:

  • 循环式处理:当前节点没有该分区的时候,继续转发给下一个分区,接受下一个节点发过来的答复并且将答复返回给客户端
  • 路由层:起到类似代理的作用,有中间层来起到一个节点选择与转发的作用
  • 客户端感知:客户端来直接感知与分配节点

实际上三者的逻辑是类似的,不同的地方只是在于谁来进行路由的决策

  • 可以通过zookeeper来维护节点分区的映射关系,路由决策者可以通过订阅zookeeper的方式来或其对应的变动信息
  • 也有节点之间同步集群的状态变化,请求可以发给任何节点,有该节点根据集群状态进行转发,减少对外部组件的依赖