`

分布式设计与开发(四)------数据拆分

 
阅读更多

原文链接

 

一个大型系统里各个环节中最容易出性能和可用性问题的往往是数据库,因此分布式设计与开发的一个重要领域就是如何让数据层具有可扩展性,数据库的扩展分为Scale Up 和Scale Out,而Scale Up说白了是通过升级服务器配置来完成,因此不在分布式设计的考虑之内。Scale Out是通过增加机器的方式来提升处理能力,一般需要考虑以下两个问题:

  • 数据拆分
  • 数据库高可用架构

数据拆分是最先会被想到的,原理很简单,当一个表的数据达到无法处理的时候,就需要把它拆成多个表,说起来简单,真正在项目里运用的时候有很多点是需要深入研究的,一般分为:

  • 切分策略
  • 与应用程序端的整合策略

切分策略

切分策略一般分为垂直切分、横向切分和两者的混搭。

1)垂直切分

垂直切分就是要把表按模块划分到不同数据库中,这种拆分在大型网站的演变过程中是很常见的。当一个网站还在很小的时候,只有小量的人来开发和维护,各模块和表都在一起,当网站不断丰富和壮大的时候,也会变成多个子系统来支撑,这时就有按模块和功能把表划分出来的需求。如下图所示:

其实,相对于垂直切分更进一步的是服务化改造,说得简单就是要把原来强耦合的系统拆分成多个弱耦合的服务,通过服务间的调用来满足业务需求看,因此表拆出来后要通过服务的形式暴露出去,而不是直接调用不同模块的表,淘宝在架构不断演变过程,最重要的一环就是服务化改造,把用户、交易、店铺、宝贝这些核心的概念抽取成独立的服务,也非常有利于进行局部的优化和治理,保障核心模块的稳定性。这样一种拆分方式也是有代价的:

  • 表关联无法在数据库层面做
  • 单表大数据量依然存在性能瓶颈
  • 事务保证比较复杂
  • 应用端的复杂性增加

上面这些问题是显而易见的,处理这些的关键在于如何解除不同模块间的耦合性,这说是技术问题,其实更是业务的设计问题,只有在业务上是松耦合的,才可能在技术设计上隔离开来。没有耦合性,也就不存在表关联和事务的需求。另外,大数据瓶颈问题可以参见下面要将的水平切分。

2)水平切分

上面谈到垂直切分只是把表按模块划分到不同数据库,但没有解决单表大数据量的问题,而水平切分就是要把一个表按照某种规则把数据划分到不同表或数据库里。例如像计费系统,通过按时间来划分表就比较合适,因为系统都是处理某一时间段的数据。而像SaaS应用,通过按用户维度来划分数据比较合适,因为用户与用户之间的隔离的,一般不存在处理多个用户数据的情况,下面是一个比较简单的按user_id来水平切分的例子:

水平切分没有破坏表之间的联系,完全可以把有关系的表放在一个库里,这样就不影响应用端的业务需求,并且这样的切分能从根本上解决大数据量的问题。它的问题也是很明显的:

  • 当切分规则复杂时,增加了应用端调用的难度
  • 数据维护难度比较大,当拆分规则有变化时,需要对数据进行迁移

对于第一个问题,可以参考后面要讲的如何整合应用端和数据库端。对于第二个问题可以参考一致性hash的算法,通过某些映射策略来降低数据维护的成本,可参见以前的博文分布式设计与开发(二)------几种必须了解的分布式算法

3)垂直与水平联合切分

由上面可知垂直切分能更清晰化模块划分,区分治理,水平切分能解决大数据量性能瓶颈问题,因此常常就会把两者结合使用,这在大型网站里是种常见的策略,这可以结合两者的优点,当然缺点就是比较复杂,成本较高,不太适合小型网站,下面是结合前面两个例子的情况:

与应用程序端的整合策略

数据切出来还只是第一步,关键在于应用端如何方便地存取数据,不能因为数据拆分导致应用端存取数据错误或者异常复杂。按照从前往后一般说来有以下三种策略:

  • 应用端做数据库路由
  • 在应用端和服务器端加一个代理服务器做路由
  • 数据库端自行做路由

1) 应用端做数据库路由

应用端做数据库路由实现起来比较简单,也就是在数据库调用的点通过工具包的处理,给每次调用数据库加上路由信息,也就是分析每次调用,路由到正确的库。这种方式多多少少没有对应用端透明,如果路由策略有更改还需要修改应用端,并且这种更改很难做到动态更改。最关键的是应用端的连接池设计会比较复杂,池里的连接就不是无状态了,不利于管理和扩展。

2)在应用端和服务器端加一个代理服务器做路由

通过代理服务器来做服务器做路由可以对客户端屏蔽后端数据库拆分细节,增强了拆分规则的可维护性,一般而言proxy需要提供以下features:

  • 对客户端和数据库服务端的连接管理和安全认证
  • 数据库请求路由可配置性
  • 对调用命令和SQL的解析
  • 调用结果的过滤和合并

现在有些开源框架提供了类似功能,比如ameoba,在以前博文设计与开发应用服务器(一)------常见模式 中介绍过ameoba的大致结构,在构建高性能web之路------mysql读写分离实战 介绍过如何实战ameoba,有兴趣的朋友可以参考一下。

3)数据库端自行做路由

例如MySQL就提供了MySQL Proxy的代理产品可以在数据库端做路由,结构如下所示:

这种方式的最大问题就是拆分规则配置的灵活性不好,不一定能满足应用端的多种划分需求。

以上介绍了些数据拆分的策略和相关支撑策略,随后会研究一下前面谈到的数据库高可用架构。

(很资料来源于简朝阳的《MySQL性能调优与架构设计》,需要深入学习的朋友可以参考这本书)

分享到:
评论

相关推荐

    分布式系统中Java后端开发技术及其应用实践.pdf

    以分布式系统中Java后端开发技术的应用为主题,分析分布式系统开发的需求,探讨Java技术栈、分布式监控与日志管理、云服务模型在分布式系统Java后端开发中的应用路径,旨在为分布式系统的设计与实现提供全面的理论...

    Fourinone分布式并行计算四合一框架

     但是fourinone并不提供一个分布式存储系统,比如文件数据的导入导出、拆分存储、负载均衡,备份容灾等存储功能,不过开发人员可以利用这些api去设计和实现这些功能,用来满足自己的特定需求。  二、自动化class...

    分布式业务层数据层框架Albianj2.zip

    Albianj是我们设计并开发的一套分布式统一框架。他主要是面向海量数据处理、海量数据 访问、并解决互联网开发中经常会碰到的数据海量增长问题,也一并解决 互联网开发团队 中,因开发人员的水平参差不齐而导致的...

    Fourinone分布式计算框架

    总的来说,是将大数据的复杂分布式计算,设计为一个链式的多“包工头”环节去处理,每个环节包括利用多台“农民工”机器进行并行计算,无论是拆分计算任务还是合并结果,都可以设计为一个单独的“包工头”环节。...

    分布式数据库设计方案.doc

    面对海量数据库在高并发的应用环境下,仅仅靠提升服务器的硬件配置是不能从根本上 解决问题的,分布式网格集群通过数据分区把数据拆分成更小的部分,分配到不同的服 务器中。查询可以由多个服务器上的CPU、I/O来...

    分布式面试题总结总结总结总结

    微服务是在 SOA 上做的升华,微服务架构强调的一个重点是业务需要彻底的组件化和服务化,原有的单个业务系统会拆分为多个可以独立开发、设计、运行的小应用。这些小应用之间通过服务完成交互和集成服务单一职责轻量...

    大规模分布式系统架构下调测能力构建之道

    简介:在大规模分布式应用中,曾经的单体应用按横向和纵向的维度被拆分到集群的各个节点之中,为了解决服务及数据调用的问题,我们引入了分布式服务框架、分布式消息集群、分布式文件存储、分布式缓存等一系列服务。...

    xxl-job分布式任务调度平台-其他

    XXL-JOB是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。 XXL-JOB特点: 1、简单:支持通过Web页面对任务进行CRUD操作,...

    AutoMeter-API是一款专门为测试人员准备的针对分布式服务微服务API接口功能和性能一体的自动化测试平台

    设计API接口用例基础要素:用例数据,用例的断言,快捷调试等基础,支持复制,批量复制,后续支持自动生成基础用例 从个人或者公司的角度看,用例的数量和类型来决定需要做怎么样的执行,如果用例数量庞大,并且需要...

    车贷风险控制平台的设计与实现

    平台整体使用分布式架构,将 各个功能拆分为微服务,每个微服务建立多个实例,保证服务的高可用性,并且每 个微服务相互独立。使用分布式文件系统来对客户的信审文件和多媒体数据进行 存储,并通过一套数据安全规范...

    单点登录源码

    文件存储系统,提供四种方案: - **阿里云** OSS - **腾讯云** COS - **七牛云** - 本地分布式存储 ![阿里云OSS](project-bootstrap/aliyun-oss-post-callback.png) > zheng-api 服务网关,对外暴露统一规范的...

    2017最新老男孩MySQL高级专业DBA实战课程全套【清晰不加密】,看完教程月入40万没毛病

    02-DBA参与项目数据库设计及培训开发人员高效设计MYSQL库语句.avi 03-老男孩核心思想-项目周期的制定思想.avi 04-linux进程占用cpu高的解决方案案例.avi 05-数据库账户权限控制多种思路及技巧.avi 06-数据库客户端...

    网站架构技术

    问题: 读库与写库的数据同步 解决方案: 不同的数据库都有自己的数据库的主从复制功能 使用反向代理与CDN加速网站响应 反向代理产品 ngix 使用分布式文件系统和分布式数据库系统 使用no-sql和搜索...

    论文研究-基于子模式的关系数据到图数据ETL方法研究.pdf

    不仅提高了ETL的效率,转换结果能满足图数据的分布式存储要求,也可以作为Spark GraphX计算框架的基础数据。最后,使用Java EE和Neo4j开发了原型系统,并进行了实验验证。结果表明,改进后的ETL方法获得了较已有方法...

    基于分布式事务RT模式实现适用于hyperf框架的组件源码.zip

    4. 支持分布式事务嵌套,与savepoint一致效果。 5. 支持避免不同业务代码并发造成脏数据的问题。 6. 默认支持http协议的服务化接口,想要支持其它协议则需要重写中间件。 7. [支持子服务嵌套分布式事务(全球首创)]...

    计算机软件项目设计方案(2020).docx

    分布式缓存、分布式消息队列等技术支撑服务在数据中心进行共享,LEAF6 平台通过技术支撑服务实现与基础技术平台进行对接。 1.2.3LEAF6平台核心框架实现 1.2.3.1数据访问逻辑层次说明 LEAF6核心框架(LEAF6-Core)中...

    腾讯开源的分布式毫秒服务引擎 msec.zip

    特点与优势模块间访问采用RPC的方式,开发者不用关注网络与报文格式,像写单机程序一样开发分布式服务。负载自动均衡与容错,对于单机故障、局部网络波动等状况自动应对,服务高可用性。支持C/C 与Java语言,后续还...

    资源前后端分离式分布式微服务架构项目课程预览EurekaFeign讲义+源码+视频

    course注册到Eureka Server"Feign远程调用 理解 重点 能够测试Feign远程...拆分方法能够完成静态页面测试能够完成课程数据模型查询接口理解课程信息模板设计方法"课程预览功能开发 应用 重点 能够完成课程预览功能开发...

    Active4j-boot快速开发框架-其他

    提高开发效率2、代码全部开源,持续更新,共同维护3、基于SpringBoot,简化了大量项目配置和maven依赖,让您更专注于业务开发4、友好的代码结构及注释,便于阅读及二次开发5、使用分包分层设计,工程拆分,分为dao,...

    Java高并发高性能分布式框架从无到有微服务架构设计(1).doc

    Java高并发高性能分布式框架从无到有微服务架构设计 微服务架构模式〔Microservice Architect Pattern〕.近两年在服务的疯狂增长与云计算技术的进步,让微服务架构受到重点关注 微服务架构是一种架构模式,它提倡将...

Global site tag (gtag.js) - Google Analytics