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

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

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

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

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

J6.jpeg (47.4 KB)

2010-8-31 14:05

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

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

上面这些问题是显而易见的,处理这些的关键在于如何解除不同模块间的耦合性,这说是技术问题,其实更是业务的设计问题,只有在业务上是松耦合的,才可能在技术设计上隔离开来。没有耦合性,也就不存在表关联和事务的需求。另外,大数据瓶颈问题可以参见下面要将的水平切分。
2)水平切分
上面谈到垂直切分只是把表按模块划分到不同数据库,但没有解决单表大数据量的问题,而水平切分就是要把一个表按照某种规则把数据划分到不同表或数据库里。例如像计费系统,通过按时间来划分表就比较合适,因为系统都是处理某一时间段的数据。而像SaaS应用,通过按用户维度来划分数据比较合适,因为用户与用户之间的隔离的,一般不存在处理多个用户数据的情况,下面是一个比较简单的按user_id来水平切分的例子:

J7.jpeg (55.16 KB)

2010-8-31 14:05

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

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

对于第一个问题,可以参考后面要讲的如何整合应用端和数据库端。对于第二个问题可以参考一致性hash的算法,通过某些映射策略来降低数据维护的成本,可参见以前的博文分布式设计与开发(二)------几种必须了解的分布式算法
3)垂直与水平联合切分
由上面可知垂直切分能更清晰化模块划分,区分治理,水平切分能解决大数据量性能瓶颈问题,因此常常就会把两者结合使用,这在大型网站里是种常见的策略,这可以结合两者的优点,当然缺点就是比较复杂,成本较高,不太适合小型网站,下面是结合前面两个例子的情况:

J8.jpeg (61.73 KB)

2010-8-31 14:05

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

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

1)应用端做数据库路由
应用端做数据库路由实现起来比较简单,也就是在数据库调用的点通过工具包的处理,给每次调用数据库加上路由信息,也就是分析每次调用,路由到正确的库。这种方式多多少少没有对应用端透明,如果路由策略有更改还需要修改应用端,并且这种更改很难做到动态更改。最关键的是应用端的连接池设计会比较复杂,池里的连接就不是无状态了,不利于管理和扩展。
2)在应用端和服务器端加一个代理服务器做路由
通过代理服务器来做服务器做路由可以对客户端屏蔽后端数据库拆分细节,增强了拆分规则的可维护性,一般而言proxy需要提供以下features:

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

现在有些开源框架提供了类似功能,比如ameoba,在以前博文设计与开发应用服务器(一)------常见模式中介绍过ameoba的大致结构,在构建高性能web之路------mysql读写分离实战介绍过如何实战ameoba,有兴趣的朋友可以参考一下。
3)数据库端自行做路由
例如MySQL就提供了MySQL Proxy的代理产品可以在数据库端做路由,结构如下所示:

J9.jpeg (39.95 KB)

2010-8-31 14:05

这种方式的最大问题就是拆分规则配置的灵活性不好,不一定能满足应用端的多种划分需求。
以上介绍了些数据拆分的策略和相关支撑策略,随后会研究一下前面谈到的数据库高可用架构。

分布式设计与开发(四)------数据拆分相关推荐

  1. 分布式设计与开发(一)------宏观概述

    在IDF05(Intel Developer Forum 2005)上,Intel首席执行官Craig Barrett就取消4GHz芯片计划一事,半开玩笑当众单膝下跪致歉,给广大软件开发者一个明显的信 ...

  2. 简单明了!OLTP场景下的数据分布式设计原则

    来自:DBAplus社群 作者介绍 温卫斌,就职于中国民生银行信息科技部,目前负责分布式技术平台设计与研发,主要关注分布式数据相关领域. 前言 最近几年做分布式项目,很多工作是关于OLTP(联机交易系 ...

  3. 基于Scrapy分布式爬虫的开发与设计

    个人博客请访问http://blog.xhzyxed.cn 这个项目也是初窥python爬虫的一个项目,也是我的毕业设计,当时选题的时候,发现大多数人选择的都是网站类,实在是普通不过了,都是一些简单的 ...

  4. 简单在线音乐推荐网 基于用户、物品的协同过滤推荐算法 使用Python+Django+Mysql开发技术 在线音乐推荐系统 音乐网站推荐系统 个性化推荐算法开发 人工智能、大数据分布式、机器学习开发

    简单在线音乐推荐网 基于用户.物品的协同过滤推荐算法 使用Python+Django+Mysql开发技术 在线音乐推荐系统 音乐网站推荐系统 个性化推荐算法开发 人工智能.大数据分布式.机器学习开发S ...

  5. wps js宏开发表格数据归类拆分和excel文件合并的xlam加载宏插件

    前言 用wps js宏编辑器开发的表格数据拆分与合并的加载宏工具,写好代码把工作簿另存为xlam加载宏文件,然后添加到加载项即可使用.xlam文件你可以理解为没有工作表的工作簿,先看动画演示效果: 主 ...

  6. 安卓androidstudio访问本地接口_安卓开发之数据存储在本地的四种方式

    ​ 安卓开发之数据存储在本地的四种方式 本地数据存储,在安卓开发过程中是不可避免的一个话题.这些本地的数据可能是用户的设置,程序的设置,用户的数据图片, 也可能是网络传输的一些缓冲数据. 基本上我们有 ...

  7. 分布式系统设计和开发_计划,设计和开发设计系统

    分布式系统设计和开发 Here is a topic discussed in every company: communication between departments. 这是每个公司讨论的主 ...

  8. javaweb基于JSP+Servlet开发大数据与应用专业企业门户网站源码 课程设计 大作业

    基于JSP+Servlet开发大数据与应用专业企业门户网站:(大作业/课程设计) 开发环境: Windows操作系统 开发工具: Eclipse+Jdk+Tomcat+MYSQL数据库 运行效果图: ...

  9. 基于Neo4j中医方剂药材知识图谱大数据可视化分析系统的设计与开发

    基于Neo4j中医方剂药材知识图谱大数据可视化分析系统的设计与开发 设计背景 这个系统的开发初衷是笔者希望通过这个系统来学习一下Neo4j的相关技术,包括与python.java的对接.可视化等方面, ...

最新文章

  1. Blender赛车动画制作学习教程 Learn Race Car Animation with Blender
  2. 里程碑式成果Faster RCNN复现难?我们试了一下 | 附完整代码
  3. linux安装hadoop记录
  4. CentOS7中设置.sh开机自启动(以后台启动geoserver为例)
  5. NLP word2vec paper
  6. 【蔡勒公式 】根据给定的年月日求出对应星期几
  7. 用FFMPEG SDK进行视频转码压缩时解决音视频不同步问题的方法(转) PTS DTS
  8. Redis 5.0 正式版发布了,19 个新特性
  9. Android开发之Is Library篇
  10. Session的clear方法和flush方法
  11. 【唐宇迪】opencv实战学习
  12. ISO27001学习笔记
  13. 科普 | 到底什么是移动边缘计算?
  14. 阿里云ACP认证考试笔记
  15. 口袋战争服务器维修,口袋战争最新版
  16. 创业者防坑手册:面对强大的资本力量,你该如何正当防卫?
  17. 怎样修心?不乱于心,不困于情。
  18. 如何在pdf文件上进行电子签名
  19. M131. Palindrome Partitioning(拆分回文子串)
  20. 关于STC单片机的远程升级

热门文章

  1. 从另一页面调用html代码_GNE v0.1正式发布:4行代码开发新闻网站通用爬虫
  2. 提高linux运行速度,提高Linux操作系统的运行速度
  3. 虚拟服务器ip是什么意思,虚拟主机独立ip是什么意思
  4. Python编程基础19:封装、继承与多态
  5. Python数据分析学习笔记02:Python语言基础、IPython与Jupyter笔记本
  6. 安卓案例:利用定时器实现逐帧动画
  7. 14.图像透视——介绍,坐标系统(Coordinate System),建模投影(Modelling Projection)_1
  8. java 通过模板替换pdf_word模板替换方案 PDF 下载
  9. android解析布局树,Android Viewtreeobserver解析
  10. 【英语学习】【WOTD】borne 释义/词源/示例