`

【关系型数据库】水平拆分

 
阅读更多

水平拆分是优化数据库大表的常见方式。

 

拆分方式

水平拆分的一种实现方式是使用数据库本身支持的分区表特性,即多个物理子表组成一个逻辑总表。
也可以显式地 (库内)分表,或 分库

库内分表 可以缓解单表数据量过大的问题,但对于减轻数据库服务器压力的作用不大,因为所有请求还是在争用同一服务器的资源。这时可以采用 分库。

实际使用时也可以与 垂直拆分 结合。

 

(《MySQL大表优化方案》)
按照用户名首字母将用户分表分为两份:A~M 和 N~Z

 

 

数据拆分原则

  • 能不分就不分!
  • 分片规则要慎重选择,提前规划。数据的 增长模式、访问模式、数据分片关联问题 和 扩容问题 都需认真考虑。

    按数据范围分片、枚举分片、一致性Hash分片 等都是比较容易扩容的方式。

    对有时效性的数据,按时间范围分片 就是一种典型的策略。

  • 分片尽量少;分片尽量均匀分布在多个数据节点上。

    执行SQL时,涉及的分片越多,跨分片所消耗的资源也越多。

  • 尽量不要让一个事务中的SQL跨分片。分布式事务非常难处理。

另外,可以适当增加冗余数据以减少 Join。

 

水平拆分的 优、缺点

优点不存在单表数据量过大 和 请求高并发 的性能问题,提高了系统的 负载能力 和 稳定性

 

缺点

  • 数据分片的事务一致性难以解决
  • 跨节点 Join 的逻辑复杂,性能差
  • 数据多次扩展 的 难度和维护量 非常大

 

解决方案

根据实现分片访问逻辑的不同程序角色,可将解决方案分为两类:客户端模式 和 代理模式。



 

客户端模式

在客户端模式中,数据访问层被做成一个统一的SDK组件,比如一个 jar 包;各业务应用直接包含该SDK组件。如,Sharding-JDBC

 

优点

  • 应用直连数据库,可降低外部依赖系统不可用导致服务异常的风险
  • 集成成本低,无需额外运维的组件

 

缺点

  • 可扩展性不高,可能无法满足复杂系统需求。
  • 数据分片处理的压力在应用服务器上,有额外的风险。

 

代理模式

在代理模式中,由统一的代理服务整合数据分片和多数据源,向上层业务应用提供统一的服务。如,MyCat

 

优点

  • 可以处理非常复杂的需求,可扩展性高
  • 对上层应用比较透明,几乎不会增加任何额外负载

 

缺点

  • 成本高,需部署维护独立的代理服务
  • 数据传输中多了一个代理环节,性能会降低,有额外的服务异常风险

 

  • 大小: 107.3 KB
  • 大小: 50.5 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics