发布新日志

  • MySQL垂直和水平切分-转载整理

    2016-06-22 19:26:07

    原文:http://www.uml.org.cn/sjjm/20114062.asp

    replication的限制:一旦数据库过于庞大,尤其是当写入过于频繁,很难由一台主机支撑的时候,我们还是会面临到扩展瓶颈。数据切分 (sharding):通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载的效果。。数据 的切分同时还可以提高系统的总体可用性,因为单台设备Crash之后,只有总体数据的某部分不可用,而不是所有的数据。

    数据的切分(Sharding)模式

    一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切可以称之为数据的垂直(纵向)切分;另外一种则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分。

    垂直切分:

    一个架构设计较好的应用系统,其总体功能肯定是由很多个功能模块所组成的,而每一个功能模块所需要的数据对应到数据库中就是一个或者多个表。而在架构设计 中,各个功能模块相互之间的交互点越统一越少,系统的耦合度就越低,系统各个模块的维护性以及扩展性也就越好。这样的系统,实现数据的垂直切分也就越容 易。

    一般来说,如果是一个负载相对不是很大的系统,而且表关联又非常的频繁,那可能数据库让步,将几个相关模块合并在一起减少应用程序的工作的方案可以减少较多的工作量,这是一个可行的方案。一个垂直拆分的例子:

    1.用户模块表:user,user_profile,user_group,user_photo_album
    2.群组讨论表:groups,group_message,group_message_content,top_message
    3.相册相关表:photo,photo_album,photo_album_relation,photo_comment
    4.事件信息表:event


    • 群组讨论模块和用户模块之间主要存在通过用户或者是群组关系来进行关联。一般关联的时候都会是通过用户的id或者nick_name以及group的id来进行关联,通过模块之间的接口实现不会带来太多麻烦;
    • 相册模块仅仅与用户模块存在通过用户的关联。这两个模块之间的关联基本就有通过用户id关联的内容,简单清晰,接口明确;
    • 事件模块与各个模块可能都有关联,但是都只关注其各个模块中对象的ID信息,同样可以做到很容易分拆。

    垂直切分的优点

    • 数据库的拆分简单明了,拆分规则明确;
    • 应用程序模块清晰明确,整合容易;
    • 数据维护方便易行,容易定位;

    垂直切分的缺点


    • 部分表关联无法在数据库级别完成,需要在程序中完成;
    • 对于访问极其频繁且数据量超大的表仍然存在性能瓶颈,不一定能满足要求;
    • 事务处理相对更为复杂;
    • 切分达到一定程度之后,扩展性会遇到限制;
    • 过读切分可能会带来系统过渡复杂而难以维护。

    水平切分

    将某个访问极其频繁的表再按照某个字段的某种规则来分散到多个表之中,每个表中包含一部分数据。

    对于上面的例子:所有数据都是和用户关联的,那么我们就可以根据用户来进行水平拆分,将不同用户的数据切分到不同的数据库中。

    现在互联网非常火爆的Web2.0类型的网站,基本上大部分数据都能够通过会员用户信息关联上,可能很多核心表都非常适合通过会员ID来进行数据的水平切 分。而像论坛社区讨论系统,就更容易切分了,非常容易按照论坛编号来进行数据的水平切分。切分之后基本上不会出现各个库之间的交互。

    水平切分的优点


    • 表关联基本能够在数据库端全部完成;
    • 不会存在某些超大型数据量和高负载的表遇到瓶颈的问题;
    • 应用程序端整体架构改动相对较少;
    • 事务处理相对简单;
    • 只要切分规则能够定义好,基本上较难遇到扩展性限制;

    水平切分的缺点

    • 切分规则相对更为复杂,很难抽象出一个能够满足整个数据库的切分规则;
    • 后期数据的维护难度有所增加,人为手工定位数据更困难;
    • 应用系统各模块耦合度较高,可能会对后面数据的迁移拆分造成一定的困难。

    两种切分结合用:

    一般来说,我们数据库中的所有表很难通过某一个(或少数几个)字段全部关联起来,所以很难简单的仅仅通过数据的水平切分来解决所有问题。而垂直切分也只能 解决部分问题,对于那些负载非常高的系统,即使仅仅只是单个表都无法通过单台数据库主机来承担其负载。我们必须结合“垂直”和“水平”两种切分方式同时使 用

    每一个应用系统的负载都是一步一步增长上来的,在开始遇到性能瓶颈的时候,大多数架构师和DBA都会选择先进行数据的垂直拆分,因为这样的成本最先,最符 合这个时期所追求的最大投入产出比。然而,随着业务的不断扩张,系统负载的持续增长,在系统稳定一段时期之后,经过了垂直拆分之后的数据库集群可能又再一 次不堪重负,遇到了性能瓶颈。

    如果我们再一次像最开始那样继续细分模块,进行数据的垂直切分,那我们可能在不久的将来,又会遇到现在所面对的同样的问题。而且随着模块的不断的细化,应用系统的架构也会越来越复杂,整个系统很可能会出现失控的局面。

    这时候我们就必须要通过数据的水平切分的优势,来解决这里所遇到的问题。而且,我们完全不必要在使用数据水平切分的时候,推倒之前进行数据垂直切分的成 果,而是在其基础上利用水平切分的优势来避开垂直切分的弊端,解决系统复杂性不断扩大的问题。而水平拆分的弊端(规则难以统一)也已经被之前的垂直切分解 决掉了,让水平拆分可以进行的得心应手。

    示例数据库:

    假设在最开始,我们进行了数据的垂直切分,然而随着业务的不断增长,数据库系统遇到了瓶颈,我们选择重构数据库集群的架构。如何重构?考虑到之前已经做好了数据的垂直切分,而且模块结构清晰明确。而业务增长的势头越来越猛,即使现在进一步再次拆分模块,也坚持不了太久。

    ==>选择了在垂直切分的基础上再进行水平拆分。

    ==>在经历过垂直拆分后的各个数据库集群中的每一个都只有一个功能模块,而每个功能模块中的所有表基本上都会与某个字段进行关联。如用户模块全部 都可以通过用户ID进行切分,群组讨论模块则都通过群组ID来切分,相册模块则根据相册ID来进切分,最后的事件通知信息表考虑到数据的时限性(仅仅只会 访问最近某个事件段的信息),则考虑按时间来切分。

    数据切分以及整合方案.

    数据库中的数据在经过垂直和(或)水平切分被存放在不同的数据库主机之后,应用系统面临的最大问题就是如何来让这些数据源得到较好的整合,其中存在两种解决思路:

    • 在每个应用程序模块中配置管理自己需要的一个(或者多个)数据源,直接访问各个数据库,在模块内完成数据的整合;
    • 通过中间代理层来统一管理所有的数据源,后端数据库集群对前端应用程序透明;

    第二种方案,虽然短期内需要付出的成本可能会相对更大一些,但是对整个系统的扩展性来说,是非常有帮助的。针对第二种方案,可以选择的方法和思路有:

    1.利用MySQLProxy 实现数据切分及整合.

    可用来监视、分析或者传输他们之间的通讯信息。他的灵活性允许你最大限度的使用它,目前具备的功能主要有连接路由,Query分析,Query过滤和修改,负载均衡,以及基本的HA机制等。MySQLProxy 本身并不具有上述所有的这些功能,而是提供了实现上述功能的基础。要实现这些功能,还需要通过我们自行编写LUA脚本来实现。

    原理:MySQLProxy 实际上是在客户端请求与MySQLServer 之间建立了一个连接池。所有客户端请求都是发向MySQLProxy,然后经由MySQLProxy 进行相应的分析,判断出是读操作还是写操作,分发至对应的MySQLServer 上。对于多节点Slave集群,也可以起做到负载均衡的效果。

    2.利用Amoeba实现数据切分及整合

    Amoeba是一个基于Java开发的,专注于解决分布式数据库数据源整合Proxy程序的开源框架,Amoeba已经具有Query路由,Query过滤,读写分离,负载均衡以及HA机制等相关内容。Amoeba主要解决的以下几个问题:

    • 数据切分后复杂数据源整合;
    • 提供数据切分规则并降低数据切分规则给数据库带来的影响;
    • 降低数据库与客户端的连接数;
    • 读写分离路由;

    AmoebaFor MySQL 主要是专门针对MySQL数据库的解决方案,前端应用程序请求的协议以及后端连接的数据源数据库都必须是MySQL。对于客户端的任何应用程序来说,AmoebaForMySQL 和一个MySQL数据库没有什么区别,任何使用MySQL协议的客户端请求,都可以被AmoebaFor MySQL 解析并进行相应的处理。

    Proxy程序常用的功能如读写分离,负载均衡等配置都在amoeba.xml中进行。Amoeba已经支持了实现数据的垂直切分和水平切分的自动路由,路由规则可以在rule.xml进行设置。

    3.利用HiveDB实现数据切分及整合


    HiveDB同样是一个基于Java针对MySQL数据库的提供数据切分及整合的开源框架,只是目前的HiveDB仅仅支持数据的水平切分。主要解决大数据量下数据库的扩展性及数据的高性能访问问题,同时支持数据的冗余及基本的HA机制。

    HiveDB的实现机制与MySQLProxy 和Amoeba有一定的差异,他并不是借助MySQL的Replication功能来实现数据的冗余,而是自行实现了数据冗余机制,而其底层主要是基于HibernateShards 来实现的数据切分工作。数据切分与整合中可能存在的问题

    引入分布式事务的问题?

    一旦数据进行切分被分别存放在多个MySQLServer中之后,不管我们的切分规则设计的多么的完美(实际上并不存在完美的切分规则),都可能造成之前的某些事务所涉及到的数据已经不在同一个MySQLServer 中了。

    ==>将一个跨多个数据库的分布式事务分拆成多个仅处于单个数据库上面的小事务,并通过应用程序来总控各个小事务。

    跨节点Join的问题?


    ==>先从一个节点取出数据,然后根据这些数据,再到另一个表中取数据.
    ==>使用Federated存储引擎,问题是:乎如果远端的表结构发生了变更,本地的表定义信息是不会跟着发生相应变化的。

    跨节点合并排序分页问题?

    ==>Join本身涉及到的多个表之间的数据读取一般都会存在一个顺序关系。但是排序分页就不太一样了,排序分页的数据源基本上可以说是一个表(或 者一个结果集),本身并不存在一个顺序关系,所以在从多个数据源取数据的过程是完全可以并行的。这样,排序分页数据的取数效率我们可以做的比跨库Join 更高,所以带来的性能损失相对的要更小。  
  • 【转】驱动模块和桩模块的概念和区别

    2016-06-17 16:03:53

    驱动模块和桩模块的概念和区别
               桩模块和驱动模块(以C语言为例):

      很多人对桩模块和驱动模块的概念会搞不清楚,那么下面来介绍这两个概念:

      模块结构实例图:

      假设现在项目组把任务分给了7个人,每个人负责实现一个模块。你负责的是B模块,你很优秀,第一个完成了编码工作,现在需要开展单元测试工作,先分析结构图:

      1、由于B模块不是最顶层模块,所以它一定不包含main函数(A模块包含main函数),也就不能独立运行。

      2、B模块调用了D模块和E模块,而目前D模块和E模块都还没有开发好,那么想让B模块通过编译器的编译也是不可能的。

      那么怎样才能测试B模块呢?需要做:

      1、写两个模块Sd和Se分别代替D模块和E模块(函数名、返回值、传递的参数相同),这样B模块就可以通过编译了。Sd模块和Se模块就是桩模块。

      2、写一个模块Da用来代替A模块,里面包含main函数,可以在main函数中调用B模块,让B模块运行起来。Da模块就是驱动模块。

      知识点:

      桩模块的使命除了使得程序能够编译通过之外,还需要模拟返回被代替的模块的各种可能返回值(什么时候返回什么值需要根据测试用例的情况来决定)。

      驱动模块的使命就是根据测试用例的设计去调用被测试模块,并且判断被测试模块的返回值是否与测试用例的预期结果相符

  • RDC仓储(RDC:Regional Distribution Center,区域分发中心)

    2015-09-08 16:22:47

        RDC即区域配送中心,是配送中心的一种,以较强的幅射能力和库存准备,向特定区域范围的用户配送的配送中心。

    定义
    RDC即区域分发中心(Regional Distribution Center,简称RDC),它是近年来一种极为重要的物流运作模式。区域分发中心是指物流公司具体进行业务运作的分发、配送中心,一般设有运输部、资讯部、仓务部和综合部。

    运作特点

    高度集权

    这种物流运作模式的权利集中在总部,业务开发、各种物流运作指令均来自于物流公司的总部。各地的RDC只是按总部的指令,从事具体的物流服务操作。

    支撑系统

    RDC物流运作有三大支撑系统,即仓储系统、运输系统和物流信息系统。

    (1)仓储系统建立先进的仓储管理系统,为生产企业服务,按照货物的堆放体积收费,参照国际惯例,采用先进先出的管理方式进行管理。由于采用社会化、专业化的仓库管理办法,其费用要比各企业自己单独建仓库,无论从资金方面还是从利用率上均要节省,而且可使得自己的库存真正降为零,大大降低其仓储成本。此外在产品销售方面,各生产企业不仅可以利用RDC的分拨网络,把出厂的产品在最短的时间内送到消费者手中,加快产品的流通,使得产业资本的周转率明显提高,而且节省了大量的运输及广告费用。由于载运方面采用多家客户同车配送,同方向货物一起载运的合理运输方式,运输费用大幅度降低,车辆的实载率大幅度提高,整个社会经济效益增加。

    所以,建立RDC的一个非常重要的目标就是实现仓储专业化、社会化管理,使得企业实现"零库存"。

    (2)运输系统作为RDC动脉系统的运输,对其要求要比传统运输高得多,物流中心要对货物装运后,到货物送达收货人之间的运输全过程进行**纷佟6杂谠耸涞氖奔洹⒒跛稹⒒醪睢⒒跷锏钠分侄际褂靡惶卓己酥副昙碖PI(Key Performance Indicator)。

    (3)物流信息系统(IT系统) IT系统是物流中心联系各RDC的中枢,主要有以下技术:一是E-mail即电子邮件,这是目前最普遍的、非常便捷、成本较低的信息传递系统。目前各物流公司均采用此系统。二是EDI即电子数据交换,这是不同电脑之间按照统一的信息标准所进行的结构化数据交换。它可以简化贸易清算环节的手续,减少信息传递方面的差错,降低客户反复修改或磋商时的通信成本和制作成本,缩短公司的采购周期。
433/3<123
Open Toolbar