精华内容
下载资源
问答
  • Oracle私有云数据库整合方案.pdf
  • 一种基于网格的异构数据库整合方案及其实现,高瞻,罗四维,许多企业在信息化过程中产生了大量的异构数据库,这些数据库具有不同的系统结构,运行在不同的平台上,一个数据库的子系统很难使
  • Oracle数据库多租户与数据整合方案.pdf
  • Oracle数据库云化整合方案.docx
  • Mysql数据库切分及整合方案

    千次阅读 2016-06-30 16:17:07
    但是,数据库中的数据在经过垂直和(或)水平切分被存放在不同的数据库主机之后,应用系统面临的最大问题就是如何来让这些数据源得到较好的整合,可能这也是很读者朋友非常关心的一个问题。这一节我们主要针对的...

          我们已经很清楚通过数据库的数据切分可以极大的提高系统的扩展性。但是,数据库中的数据在经过垂直和(或)水平切分被存放在不同的数据库主机之后,应用系统面临的最大问题就是如何来让这些数据源得到较好的整合,可能这也是很多读者朋友非常关心的一个问题。这一节我们主要针对的内容就是分析可以使用的各种可以帮助我们实现数据切分以及数据整合的整体解决方案。

    数据的整合很难依靠数据库本身来达到这个效果,虽然MySQL存在Federated存储引擎,可以解决部分类似的问题,但是在实际应用场景中却很难较好的运用。那我们该如何来整合这些分散在各个MySQL主机上面的数据源呢?

    总的来说,存在两种解决思路:

    1. 在每个应用程序模块中配置管理自己需要的一个(或者多个)数据源,直接访问各个数据库,在模块内完成数据的整合;

    2. 通过中间代理层来统一管理所有的数据源,后端数据库集群对前端应用程序透明;

    可能90%以上的人在面对上面这两种解决思路的时候都会倾向于选择第二种,尤其是系统不断变得庞大复杂的时候。确实,这是一个非常正确的选择,虽然短期内需要付出的成本可能会相对更大一些,但是对整个系统的扩展性来说,是非常有帮助的。

    所以,对于第一种解决思路我这里就不准备过多的分析,下面我重点分析一下在第二种解决思路中的一些解决方案。

    ★ 自行开发中间代理层

    在决定选择通过数据库的中间代理层来解决数据源整合的架构方向之后,有不少公司(或者企业)选择了通过自行开发符合自身应用特定场景的代理层应用程序。

    通过自行开发中间代理层可以最大程度的应对自身应用的特定,最大化的定制很多个性化需求,在面对变化的时候也可以灵活的应对。这应该说是自行开发代理层最大的优势了。

    当然,选择自行开发,享受让个性化定制最大化的乐趣的同时,自然也需要投入更多的成本来进行前期研发以及后期的持续升级改进工作,而且本身的技术门槛可能也比简单的Web应用要更高一些。所以,在决定选择自行开发之前,还是需要进行比较全面的评估为好。

    由于自行开发更多时候考虑的是如何更好的适应自身应用系统,应对自身的业务场景,所以这里也不好分析太多。后面我们主要分析一下当前比较流行的几种数据源整合解决方案。

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

    MySQLProxy是MySQL官方提供的一个数据库代理层产品,和MySQLServer一样,同样是一个基于GPL开源协议的开源产品。可用来监视、分析或者传输他们之间的通讯信息。他的灵活性允许你最大限度的使用它,目前具备的功能主要有连接路由,Query分析,Query过滤和修改,负载均衡,以及基本的HA机制等。

    实际上,MySQLProxy本身并不具有上述所有的这些功能,而是提供了实现上述功能的基础。要实现这些功能,还需要通过我们自行编写LUA脚本来实现。

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

    通过上面的架构简图,我们可以很清晰的看出MySQLProxy在实际应用中所处的位置,以及能做的基本事情。关于MySQLProxy更为详细的实施细则在MySQL官方文档中有非常详细的介绍和示例,感兴趣的读者朋友可以直接从MySQL官方网站免费下载或者在线阅读,我这里就不累述浪费纸张了。

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

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

    Amoeba 主要解决的以下几个问题:

    1. 数据切分后复杂数据源整合;

    2. 提供数据切分规则并降低数据切分规则给数据库带来的影响;

    3. 降低数据库与客户端的连接数;

    4. 读写分离路由;

    我们可以看出,Amoeba所做的事情,正好就是我们通过数据切分来提升数据库的扩展性所需要的。

    Amoeba并不是一个代理层的Proxy程序,而是一个开发数据库代理层Proxy程序的开发框架,目前基于Amoeba所开发的Proxy程序有AmoebaForMySQL和AmoebaForAladin两个。

    AmoebaForMySQL主要是专门针对MySQL数据库的解决方案,前端应用程序请求的协议以及后端连接的数据源数据库都必须是MySQL。对于客户端的任何应用程序来说,AmoebaForMySQL和一个MySQL数据库没有什么区别,任何使用MySQL协议的客户端请求,都可以被AmoebaForMySQL解析并进行相应的处理。下如可以告诉我们AmoebaForMySQL的架构信息(出自Amoeba开发者博客):

    AmoebaForAladin则是一个适用更为广泛,功能更为强大的Proxy程序。他可以同时连接不同数据库的数据源为前端应用程序提供服务,但是仅仅接受符合MySQL协议的客户端应用程序请求。也就是说,只要前端应用程序通过MySQL协议连接上来之后,AmoebaForAladin会自动分析Query语句,根据Query语句中所请求的数据来自动识别出该所Query的数据源是在什么类型数据库的哪一个物理主机上面。下图展示了AmoebaForAladin的架构细节(出自Amoeba开发者博客):

    咋一看,两者好像完全一样嘛。细看之后,才会发现两者主要的区别仅在于通过MySQLProtocalAdapter处理之后,根据分析结果判断出数据源数据库,然后选择特定的JDBC驱动和相应协议连接后端数据库。

    其实通过上面两个架构图大家可能也已经发现了Amoeba的特点了,他仅仅只是一个开发框架,我们除了选择他已经提供的ForMySQL和ForAladin这两款产品之外,还可以基于自身的需求进行相应的二次开发,得到更适应我们自己应用特点的Proxy程序。

    当对于使用MySQL数据库来说,不论是AmoebaForMySQL还是AmoebaForAladin都可以很好的使用。当然,考虑到任何一个系统越是复杂,其性能肯定就会有一定的损失,维护成本自然也会相对更高一些。所以,对于仅仅需要使用MySQL数据库的时候,我还是建议使用AmoebaForMySQL。

    AmoebaForMySQL的使用非常简单,所有的配置文件都是标准的XML文件,总共有四个配置文件。分别为:

    ◆amoeba.xml:主配置文件,配置所有数据源以及Amoeba自身的参数设置;

    ◆rule.xml:配置所有Query路由规则的信息;

    ◆functionMap.xml:配置用于解析Query中的函数所对应的Java实现类;

    ◆ rullFunctionMap.xml:配置路由规则中需要使用到的特定函数的实现类;

    如果您的规则不是太复杂,基本上仅需要使用到上面四个配置文件中的前面两个就可完成所有工作。Proxy程序常用的功能如读写分离,负载均衡等配置都在amoeba.xml中进行。此外,Amoeba已经支持了实现数据的垂直切分和水平切分的自动路由,路由规则可以在rule.xml进行设置。

    目前Amoeba少有欠缺的主要就是其在线管理功能以及对事务的支持了,曾经在与相关开发者的沟通过程中提出过相关的建议,希望能够提供一个可以进行在线维护管理的命令行管理工具,方便在线维护使用,得到的反馈是管理专门的管理模块已经纳入开发日程了。另外在事务支持方面暂时还是Amoeba无法做到的,即使客户端应用在提交给Amoeba的请求是包含事务信息的,Amoeba也会忽略事务相关信息。当然,在经过不断完善之后,我相信事务支持肯定是Amoeba重点考虑增加的feature。

    关于Amoeba更为详细的使用方法读者朋友可以通过Amoeba开发者博客(http://amoeba.sf.net)上面提供的使用手册获取,这里就不再细述了。

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

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

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

    在HiveDB中,通过用户自定义的各种Partitionkeys(其实就是制定数据切分规则),将数据分散到多个MySQLServer中。在访问的时候,在运行Query请求的时候,会自动分析过滤条件,并行从多个MySQLServer中读取数据,并合并结果集返回给客户端应用程序。

    单纯从功能方面来讲,HiveDB可能并不如MySQLProxy和Amoeba那样强大,但是其数据切分的思路与前面二者并无本质差异。此外,HiveDB并不仅仅只是一个开源爱好者所共享的内容,而是存在商业公司支持的开源项目。

    下面是HiveDB官方网站上面一章图片,描述了HiveDB如何来组织数据的基本信息,虽然不能详细的表现出太多架构方面的信息,但是也基本可以展示出其在数据切分方面独特的一面了。

    ★ mycat 数据整合:具体http://www.songwie.com/articlelist/11

    ★ 其他实现数据切分及整合的解决方案

    除了上面介绍的几个数据切分及整合的整体解决方案之外,还存在很多其他同样提供了数据切分与整合的解决方案。如基于MySQLProxy的基础上做了进一步扩展的HSCALE,通过Rails构建的SpockProxy,以及基于Pathon的Pyshards等等。

    不管大家选择使用哪一种解决方案,总体设计思路基本上都不应该会有任何变化,那就是通过数据的垂直和水平切分,增强数据库的整体服务能力,让应用系统的整体扩展能力尽可能的提升,扩展方式尽可能的便捷。

    只要我们通过中间层Proxy应用程序较好的解决了数据切分和数据源整合问题,那么数据库的线性扩展能力将很容易做到像我们的应用程序一样方便,只需要通过添加廉价的PCServer服务器,即可线性增加数据库集群的整体服务能力,让数据库不再轻易成为应用系统的性能瓶颈。

     


    数据切分与整合可能存在的问题

    这里,大家应该对数据切分与整合的实施有了一定的认识了,或许很多读者朋友都已经根据各种解决方案各自特性的优劣基本选定了适合于自己应用场景的方案,后面的工作主要就是实施准备了。

    在实施数据切分方案之前,有些可能存在的问题我们还是需要做一些分析的。一般来说,我们可能遇到的问题主要会有以下几点:

    ◆ 引入分布式事务的问题;

    ◆跨节点Join的问题;

    ◆ 跨节点合并排序分页问题;

     

    1. 引入分布式事务的问题

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

    在这样的场景下,如果我们的应用程序仍然按照老的解决方案,那么势必需要引入分布式事务来解决。而在MySQL各个版本中,只有从MySQL5.0开始以后的各个版本才开始对分布式事务提供支持,而且目前仅有Innodb提供分布式事务支持。不仅如此,即使我们刚好使用了支持分布式事务的MySQL版本,同时也是使用的Innodb存储引擎,分布式事务本身对于系统资源的消耗就是很大的,性能本身也并不是太高。而且引入分布式事务本身在异常处理方面就会带来较多比较难控制的因素。

    怎么办?其实我们可以可以通过一个变通的方法来解决这种问题,首先需要考虑的一件事情就是:是否数据库是唯一一个能够解决事务的地方呢?其实并不是这样的,我们完全可以结合数据库以及应用程序两者来共同解决。各个数据库解决自己身上的事务,然后通过应用程序来控制多个数据库上面的事务。

    也就是说,只要我们愿意,完全可以将一个跨多个数据库的分布式事务分拆成多个仅处于单个数据库上面的小事务,并通过应用程序来总控各个小事务。当然,这样作的要求就是我们的俄应用程序必须要有足够的健壮性,当然也会给应用程序带来一些技术难度。

     

    2.跨节点Join的问题

    上面介绍了可能引入分布式事务的问题,现在我们再看看需要跨节点Join的问题。数据切分之后,可能会造成有些老的Join语句无法继续使用,因为Join使用的数据源可能被切分到多个MySQLServer中了。

    怎么办?这个问题从MySQL数据库角度来看,如果非得在数据库端来直接解决的话,恐怕只能通过MySQL一种特殊的存储引擎Federated来解决了。Federated存储引擎是MySQL解决类似于Oracle的DBLink之类问题的解决方案。和OracleDBLink的主要区别在于Federated会保存一份远端表结构的定义信息在本地。咋一看,Federated确实是解决跨节点Join非常好的解决方案。但是我们还应该清楚一点,那就似乎如果远端的表结构发生了变更,本地的表定义信息是不会跟着发生相应变化的。如果在更新远端表结构的时候并没有更新本地的Federated表定义信息,就很可能造成Query运行出错,无法得到正确的结果。

    对待这类问题,我还是推荐通过应用程序来进行处理,先在驱动表所在的MySQLServer中取出相应的驱动结果集,然后根据驱动结果集再到被驱动表所在的MySQLServer中取出相应的数据。可能很多读者朋友会认为这样做对性能会产生一定的影响,是的,确实是会对性能有一定的负面影响,但是除了此法,基本上没有太多其他更好的解决办法了。而且,由于数据库通过较好的扩展之后,每台MySQLServer的负载就可以得到较好的控制,单纯针对单条Query来说,其响应时间可能比不切分之前要提高一些,所以性能方面所带来的负面影响也并不是太大。更何况,类似于这种需要跨节点Join的需求也并不是太多,相对于总体性能而言,可能也只是很小一部分而已。所以为了整体性能的考虑,偶尔牺牲那么一点点,其实是值得的,毕竟系统优化本身就是存在很多取舍和平衡的过程。

     

    3. 跨节点合并排序分页问题

    一旦进行了数据的水平切分之后,可能就并不仅仅只有跨节点Join无法正常运行,有些排序分页的Query语句的数据源可能也会被切分到多个节点,这样造成的直接后果就是这些排序分页Query无法继续正常运行。其实这和跨节点Join是一个道理,数据源存在于多个节点上,要通过一个Query来解决,就和跨节点Join是一样的操作。同样Federated也可以部分解决,当然存在的风险也一样。

    还是同样的问题,怎么办?我同样仍然继续建议通过应用程序来解决。

    如何解决?解决的思路大体上和跨节点Join的解决类似,但是有一点和跨节点Join不太一样,Join很多时候都有一个驱动与被驱动的关系,所以Join本身涉及到的多个表之间的数据读取一般都会存在一个顺序关系。但是排序分页就不太一样了,排序分页的数据源基本上可以说是一个表(或者一个结果集),本身并不存在一个顺序关系,所以在从多个数据源取数据的过程是完全可以并行的。这样,排序分页数据的取数效率我们可以做的比跨库Join更高,所以带来的性能损失相对的要更小,在有些情况下可能比在原来未进行数据切分的数据库中效率更高了。当然,不论是跨节点Join还是跨节点排序分页,都会使我们的应用服务器消耗更多的资源,尤其是内存资源,因为我们在读取访问以及合并结果集的这个过程需要比原来处理更多的数据。

    分析到这里,可能很多读者朋友会发现,上面所有的这些问题,我给出的建议基本上都是通过应用程序来解决。大家可能心里开始犯嘀咕了,是不是因为我是DBA,所以就很多事情都扔给应用架构师和开发人员了?

    其实完全不是这样,首先应用程序由于其特殊性,可以非常容易做到很好的扩展性,但是数据库就不一样,必须借助很多其他的方式才能做到扩展,而且在这个扩展过程中,很难避免带来有些原来在集中式数据库中可以解决但被切分开成一个数据库集群之后就成为一个难题的情况。要想让系统整体得到最大限度的扩展,我们只能让应用程序做更多的事情,来解决数据库集群无法较好解决的问题。

     

    小结

    通过数据切分技术将一个大的MySQLServer切分成多个小的MySQLServer,既解决了写入性能瓶颈问题,同时也再一次提升了整个数据库集群的扩展性。不论是通过垂直切分,还是水平切分,都能够让系统遇到瓶颈的可能性更小。尤其是当我们使用垂直和水平相结合的切分方法之后,理论上将不会再遇到扩展瓶颈了。

     

    展开全文
  • mysql 数据库拆分与整合方案

    千次阅读 2015-05-18 11:03:39
    文章整理自:http://www.linuxidc.com/Linux/2011-08/40601p2.htm1、数据切分方案数据库比较庞大,读写操作特别是写入操作过于频繁,很难由一台服务器支撑的时候,我们就要考虑进行数据库的切分。所谓数据库的切分...

    文章整理自:http://www.linuxidc.com/Linux/2011-08/40601p2.htm

    1、数据切分方案

    当数据库比较庞大,读写操作特别是写入操作过于频繁,很难由一台服务器支撑的时候,我们就要考虑进行数据库的切分。所谓数据库的切分,就是我们按照某些特定的条件,将一台数据库上的数据分散到多台数据库服务器上。因为使用多台服务器,所以当一台服务器宕机后,整个系统只有部分数据不可用,而不是全部不可用。因此,数据库切分不仅能够用多台服务器分担数据库的负载压力,还可以提高系统的总体可用性。

    数据的切分有两种方式:垂直切分和水平切分。

    1.1 垂直切分

    垂直切分就是按照系统功能模块,将每个模块访问的数据表切分到不同的数据库中

    适用情况:垂直切分适用于架构设计较好,各个模块间的交互点比较统一而且比较少,耦合度较低的系统。

    优点:数据库的切分简单明了,规则明确;系统模块清晰明确,容易整合;数据维护方便,定位容易。

    缺点:无法在数据库内实现表关联,只能在程序中实现;对于访问量大且数据量超大的数据表仍然会存在性能问题;事物处理会变得更为复杂,跨服务器的分布式事务会增多;过度切分会导致系统过度复杂、无法扩展、维护困难。

    1.2 水平切分

    水平切分就是对数据量超大的数据表,按照其中数据的逻辑关系,根据某个字段的某种规则,将其中的数据切分到多个数据库上。

    适用情况:水平切分适用于有超大数据量的表且有合适的字段和规则进行水平切分的数据库。数据库进行水平切分后的多个数据库不应该存在交互的情况。

    优点:可以在数据库内实现表关联;不会存在超大数据量且超高负载的数据表;可以在数据库内实现事务处理,事务处理相对简单;在合理的切分规则下,扩展性较好。

    缺点:切分规则一般比较复杂,很难找出一个适合整个数据库的切分规则;数据的维护难度增加,人工定位数据难度增加;系统模块的耦合度较高,数据迁移拆分难度增加。

    在实际进行数据切分时,我们首先应该根据系统模块的设计,合理地进行垂直切分。当模块细分到一定程度后,如果继续进行细分,就会使系统架构过于复杂,整个系统面临失控的危险。这时,我们就要利用水平切分的优势,来避免继续进行垂直切分导致的系统复杂化、面临失控的问题。同时,因为数据已经进行了合理的垂直切分,所以水平切分规则相对简单,系统模块耦合度较高的问题也已得到解决。总之,数据切分应该遵循一个原则,那就是“先合理垂直切分,再适时水平切分;先模块化切分,后数据集切分”。


    2、数据整合方案

    数据在经过垂直和水平切分被存放在不同的数据库服务器上之后,系统面临的最大问题就是如何来让这些来自不同数据库服务器上的数据得到较好的整合。解决这个问题有两种方式:

    第一种:在系统的每个模块中配置管理该模块需要的一个或者几个数据库及其所在服务器的信息,数据在模块中进行整合;

    第二种:通过中间代理层来统一管理所有的数据源,数据库集群对系统应用透明。

    第一种方案在初期开发时所需成本较小,但是长期来看,系统的扩展性会受到较大的限制。第二种方案则刚好相反,短期内付出的成本相对较大,但有利于系统的扩展。第二种方案可以通过一些第三方软件实现。

    2.1 MySQLProxy

    MySQLProxy可用来监视、分析、传输应用与数据库之间的通信。它可以实现连接路由,Query分析,Query过滤和修改,负载均衡,以及基本的HA机制等。

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

    优点:MySQLProxy具有很大的灵活性,我们可以最大限度的使用它。

    缺点:MySQLProxy实际上并不直接提供相关功能,这些功能都要依靠自行编写LUA脚本实现。

    2.2 Amoeba

    Amoeba是一个基于Java开发的Proxy程序开源框架,致力于解决分布式数据库的数据整合问题。它具有Query路由,Query过滤,读写分离,负载均衡功能以及HA机制等。Amoeba可以整合数据切分后的复杂数据源,降低数据切分给整个系统带来的影响,降低数据库与客户端的连接数,实现数据的读写分离。

    原理:Amoeba相当于一个SQL请求的路由器,它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库服务器上执行。据此实现负载均衡、读写分离、高可用性等需求。

    优点:基于XML的配置文件,用SQLJEP语法编写规则,配置比较简单

    缺点:目前还不支持事务;对返回大数量的查询并不合适;不支持分库分表,只能做到分数据库实例。

    2.3 HiveDB

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

    原理:HiveDB通过用户自定义的各种Partition keys将数据分散到多个数据库服务器上,访问时解析query请求,自动分析过滤条件,并行从多个数据库上读取数据后合并结果集返回给客户端应用程序。HiveDB的实现机制与Amoeba和MySQLProxy不同,它不用借助其他复制同步技术即可自行实现数据的冗余。其底层主要是基于Hibernate Shards 来实现的。Hibernate Shards是Google 技术团队在对 Google 财务系统数据 Sharding 过程中诞生的。Hibernate Shards是在框架层实现的,有其独特的特性:标准的 Hibernate 编程模型,会用 Hibernate 就能搞定,技术成本较低;相对弹性的 Sharding 策略以及支持虚拟 Shard 等。

    优点:有商业公司支持,可自行实现数据冗余。

    缺点:仅支持水平分区

    在数据的整合过程中,还存在一些问题,比如:分布式事务的问题,跨节点JOIN的问题,跨节点排序分页的问题等。对于分布式事务的问题,我们需要将其拆分成多个单数据库内的小事务,由应用程序进行总控;跨节点JOIN的问题,我们需要先从一个节点中取出数据,然后由应用程序去其他节点进行JOIN或者使用Federated引擎;跨节点排序分页时,我们可以并行地从多个节点中读取数据,然后由应用程序进行排序分页。

    3、数据冗余方案

    任何设备或服务,只要是单点,就存在着很大的安全隐患。因为一旦这台设备或服务宕机之后,在短时间内就很难有备用设备或服务来顶替其功能。数据库作为系统的核心,必须存在一个备份以在出现异常时能够快速顶替原有服务,实现高可用性。同时,要实现数据库的读写分离,也必须采用复制技术保持多数据库节点的数据同步。实现数据同步的方式有很多,下面简要介绍常用的几个。

    3.1 MySQL Replication

    MySQL Replication是MySQL自带的一个异步复制的功能。复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器,也就是主从模式。

    原理:MySQL使用3个线程来执行复制功能。当开始复制时,从服务器会创建一个I/O线程连接主服务器并要求主服务器发送记录在其上的二进制日志中的语句。主服务器会创建一个线程将二进制日志中的内容发送到从服务器。从服务器I/O线程读取主服务器线程发送的内容并将该数据复制到从服务器数据目录中的本地文件中,这个文件称为中继日志。第三个线程是SQL线程,是由从服务器创建的,用来读取中继日志并执行日志中包含的更新。常用的架构方式为:主-从、主-主、主-从级联、主-主-从级联等。

    优点:部署简单、实施方便,是MySQL自动支持的功能,主备机切换方便,可以通过第三方软件或者自行编写简单的脚本即可自动完成主备切换。

    缺点:实际使用时,只能单主机进行写入,不一定能满足性能要求;服务器主机硬件故障时,可能会造成部分尚未传输至从机的数据丢失。

    3.2 MySQLCluster

    MySQL Cluster 是MySQL适用于分布式计算环境的高可用、高冗余版本,采用了NDB Cluster 存储引擎(“NDB”是一种“内存中”的存储引擎,它具有可用性高和数据一致性好的特点),允许在1个 Cluster 中运行多个MySQL服务器。

    原理:MySQL Cluster将标准的MySQL服务器与NDB Cluster存储引擎集成了起来。MySQL Cluster由一组计算机构成,每台计算机上均运行着多种进程,包括MySQL服务器,NDB Cluster的数据节点,管理服务器,以及(可能)专门的数据访问程序。所有这些程序一起构成了MySQL Cluster。将数据保存到NDB Cluster存储引擎时,表(结构)被保存到了数据节点中,应用程序能够从所有其他MySQL服务器上直接访问这些表。 参见下图:


    优点:可用性非常高,性能非常好;每一份数据至少在不同主机上面存在一份拷贝,且实时同步;通过无共享体系结构,系统能够使用廉价的硬件,而且对软硬件无特殊要求。

    缺点:维护比较复杂,很多情景下不适合使用。


    简单的说,Mysql Cluster 实际上就是在无共享存储设备的情况下实现的一种内存数据库Cluster 环境,其主要是通过NDB Cluster(简称NDB)存储引擎来实现的。一般来说,一个Mysql Cluster 的环境主要由以下三部分组成:
    a) 负责管理各个节点的Manage 节点主机:管理节点负责整个Cluster 集群中各个节点的管理工作,包括集群的配置,启动关闭各节点,以及实施数据的备份恢复等。管理节点会获取整个Cluster 环境中各节点的状态和错误信息,并且将各Cluster 集群中各个节点的信息反馈给整个集群中其他的所有节点。由于管理节点上保存在整个Cluster 环境的配置,同时担任了集群中各节点的基本沟通工作,所以他必须是最先被启动的节点。

    b) SQL 层的SQL 服务器节点(后面简称为SQL 节点),也就是我们常说的Mysql Server:主要负责实现一个数据库在存储层之上的所有事情, 比如连接管理,query 优化和响
    应,cache 管理等等
    ,只有存储层的工作交给了NDB 数据节点去处理了。也就是说, 在纯粹的Mysql Cluster 环境中的SQL 节点,可以被认为是一个不需要提供任何存储引擎的Mysql服务器,因为他的存储引擎有Cluster 环境中的NDB 节点来担任。所以,SQL 层各Mysql 服务器的启动与普通的Mysql 启动有一定的区别,必须要添加ndbcluster 项,可以添加在my.cnf 配置文件中,也可以通过启动命令行来指定。

    c) Storage 层的NDB 数据节点,也就是上面说的NDB Cluster:NDB 是一个内存式存储引擎,也就是说, 他会将所有的数据和索引数据都load 到内存中,但也会将数据持久化到存储设备上。不过,最新版本,已经支持用户自己选择数据可以不全部Load 到内存中了,这对于有些数据量太大或者基于成本考虑而没有足够内存空间来存放所有数据的用户来说的确是一个大好消息。 NDB 节点主要是实现底层数据存储的功能,保存Cluster 的数据。每一个NDB 节点保存完整数据的一部分(或者一份完整的数据,视节点数目和配置而定),在MySQL CLuster 里面叫做一个fragment。而每一个fragment,正常情况来讲都会在其他的主机上面有一份(或者多分)完全相同的镜像存在。这些都是通过配置来完成的,所以只要配置得当,MysqlCluster 在存储层不会出现单点的问题。一般来说,NDB 节点被组织成一个一个的NDB Group,一个NDB Group 实际上就是一组存有完全相同的物理数据的NDB 节点群。上面提到了NDB 各个节点对数据的组织,可能每个节点都存有全部的数据也可能只保存一部分数据,主要是受节点数目和参数来控制的。首先在Mysql Cluster 主配置文件(在管理节点上面,一般为config.ini)中,有一个非常重要的参数叫NoOfReplicas,这个参数指定了每一份数据被冗余存储在不同节点上面的份数,该参数一般至少应该被设置成2,也只需要设置成2 就可以了。因为正常来说,两个互为冗余的节点同时出现故障的概率还是非常小的,当然如果机器和内存足够多的话,也可以继续增大。一个节点上面是保存所有的数据还是一部分数据,还受到存储节点数目的限制。NDB 存储引擎首先保证NoOfReplicas 参数配置的要求对数据冗余,来使用存储节点,然后再根据节点数目将数据分段来继续使用多余的NDB 节点,分段的数目为节点总数除以NoOfReplicas 所得。


    3.3 DRBD磁盘网络镜像方案

    DRBD(Distributed Replicated Block Device),是由LINBIT 公司开发的,通过网络来实现块设备的数据镜像同步的一款开源Cluster软件,也被俗称为网络RAID1。

    原理:DRBD介于文件系统与磁盘介质之间,通过捕获上层文件系统的所有IO操作,调用内核中的IO模块来读写底层的磁盘介质。当DRBD捕获到文件系统的写操作之后,会在进行本地的磁盘写操作的同时,以TCP/IP协议,通过本地主机的网络设备(NIC)将IO传递至远程主机的网络设备。当远程主机的DRBD监听到传递过来的IO信息之后,会立即将该数据写入到该DRBD所维护的磁盘设备。DRBD在处理远程数据写入的时候有三种复制模式,适用于不同的可靠性和性能要求情景。

    优点:功能强大,数据在底层块设备级别跨物理主机镜像,可根据性能和可靠性要求配置不同级别的同步;IO操作保持顺序,可满足对数据一致性的苛刻要求。

    缺点:非分布式文件系统环境无法支持镜像数据同时可见,性能和可靠性两者相互矛盾,无法适用于性能和可靠性要求都比较苛刻的环境,维护成本比较高。

    3.4 RaiDB

    RaiDB,其全称为RedundantArrays of Inexpensive Databases,也就是通过Raid理念来管理数据库的数据:通过将多个廉价的数据库实例组合到一个数据库阵列,提供比单台数据库更好的性能和容错性,同时隐藏分布式数据库的复杂性,提供给应用程序一个独立的数据库。

    原理:在RaiDB中,控制器在数据库阵列的前面。应用程序发送请求到RaiDB控制器,控制器将请求分发给一组数据库。跟磁盘的Raid一样,RaiDB也有不同的级别或数据分发方案,如RaiDB-0、RaiDB-1、RaiDB-1-0、RaiDB-0-1等,用于提供不同的成本、性能、容错权衡。

    优点:和磁盘的Raid一样,RaiDB也可以大幅提高数据的读写速度,并提供容错功能

    缺点:只能支持将数据库中的表分割到不同的数据库实例上,数据表本身不能再进行分割了;不支持分布式的join;扩展性的提升取决于表的数目和各个表的负载情况。

    4、数据缓存方案

    4.1 Memcached

    缓存是任何海量 Web 应用程序不可或缺的部分。Memcached是一个高性能的分布式内存对象缓存系统,用以减轻动态Web应用的数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态数据库驱动网站的访问速度。

    原理:Memcached基于一个存储键/值对的hashmap,需要采用不同的方式来执行数据库的读取和写入操作。执行读取操作的顺序是从 Web 层获取(需要执行一次数据库查询的)请求并检查之前在缓存中存储的查询结果。如果找到所需的值,则返回它。如果未找到,则执行查询并将结果存储在缓存中,然后再将结果返回给 Web 层。在执行写入操作时,首先执行数据库写入操作,然后将之前缓存的任何受此写入操作影响的结果设定为无效,用以防止缓存和数据库之间出现数据不一致。

    优点:大幅度地降低了数据库负载,更好地分配了资源,提供了更快速地数据访问;其守护进程(daemon)是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。

    缺点:不提供冗余,当某个服务器停止运行或崩溃时,所有存放在该服务器上的键/值对都将丢失;在需要Cache的数据对象较多的时候,应用程序所需要的代码量就会增加很多,同时系统复杂度以及维护成本也会直线上升。

    5、全文检索方案

    全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。好的检索方案不仅能提高检索效率,还能降低系统负载、节约系统成本。

    5.1 Lucene

    Lucene是一个开放源代码的全文检索引擎工具包。它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,还有部分文本分析引擎。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。目前已有一些对Lucene进行封装的解决方案,如Hibernate Search、Compass等。

    原理:应用程序调用Lucene的相关API把数据库的数据写入并创建好索引,然后就可以调用Lucene所提供的数据检索API得到需要访问的数据,而且可以进行全模糊匹配。Lucene的数据也是存放在磁盘上而不是内存中,但是由于其高效的分词算法和索引结构,其效率非常的好。

    优点:索引文件格式独立于应用平台;实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度;设计了独立于语言和文件格式的文本分析接口;已经默认实现了一套强大的查询引擎,用户无需自己编写代码即可使系统获得强大的查询能力,Lucene默认实现了布尔操作、模糊查询、分组查询等等。

    缺点:不是完整的全文搜索引擎,需要开发人员进行大量的编码实现;配置比较复杂,应用难度大。

    5.2 Hibernate Search

    Hibernate Search是Hibernate对Lucene的一个集成方案,使用Java开发,用于对数据库中的数据进行检索。

    原理:Hibernate Search通过对数据表中某些内容庞大的字段(如text字段)建立全文索引,然后对这些字段进行全文检索后获得相应的POJO,从而加快了对内容庞大字段进行模糊检索(sql语句中like匹配)的速度。

    优点:功能强大,配置简单,只需要修改两个XML文件就可进行配置;支持Hibernate,以及EJB3 JPA标准应用;可以简单透明索引查询过的数据;支持通配符、多关键字、近义词、同义词、模糊查询等复杂检索,以及相关性排序等;支持搜索集群。

    缺点:只支持Hibernate框架集成;应用示例很少,缺少参考资料。

    5.3 Compass

    Compass也是对Lucene的一个封装,是一个强大的,支持事务的开源搜索引擎框架。

    原理:服务器启动时把需要建立索引的表中的数据全部取出,建立索引;在运行过程中,如果容器检测到数据有变动,需要更新索引,则添加或者删除索引。

    优点:可以实时建立增量索引,不用定时重建索引;支持事务,可以直接对POJO进行保存;支持多种持久化框架(Hibernate、Struts、Spring等)。

    缺点:不支持分类统计;API能力有限。

    5.4 Solr

    Solr也是一个开源的基于Lucene的高性能全文搜索服务器,采用Java5开发。它对Lucene进行了扩展,提供了比其更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。

    原理:Solr对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过HttpGet操作提出查找请求,并得到XML格式的返回结果。

    优点:具有高效、灵活的缓存功能和垂直搜索功能;可高亮显示搜索结果;通过索引复制提高了可用性;提供了一套强大的Data Schema来定义字段,类型和设置文本分析;提供了基于Web的管理界面。

    缺点:分布式搜索的Master节点不容错。

    5.5 Sphinx

    Sphinx是一个用C++开发的基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。Sphinx特别为一些脚本语言设计了搜索API接口,如PHP,Python,Perl,Ruby等,同时也为MySQL设计了一个存储引擎插件。

    原理:Sphinx提供了indexer、searchd、search 3个应用程序,indexer用来创建索引,searchd用来启动全文检索服务,search作为客户端访问全文检索服务获取检索结果。Sphinx支持以增量的方式来建立索引:在第一次为需要检索的内容全部建立索引之后,以后每次重建索引时只为一段时间内新增或修改过的内容建立索引。创建的这些增量索引可以定时合并到主索引中。Sphinx在进行全文检索时默认会访问全部建立的索引,包括主索引和所有的增量索引。索引以何种方式创建对于应用来说是透明的,应用可以完全不必关心。

    优点:高速索引 (在新款CPU上,近10 MB/秒);高速搜索 (2-4G的文本量中平均查询速度不到0.1秒);高可用性 (单CPU上最大可支持100 GB的文本,100M文档);提供良好的相关性排名;支持分布式���索;提供文档摘要生成;提供从MySQL内部的插件式存储引擎上搜索;支持每个文档多个全文检索域(默认最大32个);支持每个文档多属性;支持断词;支持单字节编码与UTF-8编码;支持MySQ(MyISAM和InnoDB 表都支持);支持PostgreSQL;支持多个平台(Windows、Linux、Unix、Mac等)。

    缺点:必须要有主键,且必须为整型;不能进行灵活配置。


    6、分布式并行计算方案

    6.1 Google MapReduce

    MapReduce是由Google公司发明的近些年来新兴的分布式计算模型,同时也是Google用C++开发的处理海量数据的编程工具。作为Google公司的核心技术之一,MapReduce在处理T级别以上的海量数据时有着卓越的表现。

    原理:在我们输入数据的逻辑记录上应用map操作,来计算出一个中间key/value对集;在所有具有相同key的value上应用reduce操作,来适当地合并派生的数据。功能模型的使用,再结合用户指定的map和reduce操作,让我们可以非常容易的实现大规模并行化计算,同时使用重启作为初级机制可以很容易地实现容错。

    优点:简化了跨节点的编程,使用非常方便,它隐藏了并行计算的细节,错误容灾,本地优化以及负载均衡,开发人员可以使用自己熟悉的语言进行开发,如Java,C#,Python,C++等;可以非常轻松的完成大型的计算需求;支持上千节点的大型集群,而且提供经过优化的错误容灾;扩展性强,可通过增加节点增强处理能力。

    缺点:不适应实时计算应用的需求;在计算未全部完成前,无法查询到结果。

    6.2 Hadoop

    Hadoop 是一个开源的可运行于大规模集群上的分布式并行编程框架,是MapReduce思想的一个Java实现。由于分布式存储对于分布式编程来说是必不可少的,这个框架中还包含了一个分布式文件系统 HDFS( Hadoop Distributed File System )。

    原理:在Hadoop的系统中,会有一台Master,主要负责NameNode的工作以及JobTracker的工作。JobTracker的主要职责就是启动、跟踪和调度各个Slave的任务执行。还会有多台Slave,每一台Slave通常具有DataNode的功能并负责TaskTracker的工作。TaskTracker根据应用要求来结合本地数据执行Map任务以及Reduce任务。

    优点:良好的可扩展性,系统管理员可以随时增删计算节点;分布式文件系统的备份恢复机制以及MapReduce的任务监控保证了分布式处理的可靠性;分布式文件系统的高效数据交互实现以及MapReduce结合LocalData处理的模式,可实现高效处理海量数据;框架可以运行在任何普通的PC上节约成本。

    缺点:易用性不够;缺乏第三方产品支持;稳定性有待加强。

    7 典型案例

    7.1 Facebook

    根据网络搜集到的资料,Facebook可能的部分架构如下:

    Web前端是由PHP编写的,PHP程序由HipHop for PHP转换成 C++并用 g++编译,用于为模板和Web逻辑业务层提供高性能;业务逻辑以Service的形式存在,使用的是Thrift框架,根据需求的不同由PHPC++Java等实现;非用户相关的信息使用APCThe Alternative PHP Cache)缓存,用户相关的数据使用Memcached缓存;持久化由MySQL CassandraHBase完成;页面加速使用Facebook定制的BigPipe技术;HTTP代理用Varnish Cache。


    日志、点击、feeds等数据使用Scribe日志收集系统收集并存储于HDFS系统上,使用Hadoop和Hive进行分析处理。

    Facebook并未公开其架构,以上内容为个人根据网络搜集资料进行的猜想。

    7.2 人人网

    根据网络上搜集到的相关资料来看,人人网的架构是不断演变的,每年的架构都不相同。2006年,人人网(校内网)刚创办上线时的架构比较简单。Squid cache用作HTTP代理服务器和Web缓存服务器;Resin用作Web服务器;使用MySQL(InnoDB引擎和主从结构)做持久化。2007年,随着业务的迅速发展,Web服务器改为LVS进行负载均衡的Resin群集,MySQL也改为群集并进行了垂直切分,开始大量使用Memcached进行数据缓存处理,同时基于ICE通信框架开发了位于MySQL和Resin中间的中间层服务,用于提供高并发低成本的数据访问。另外,还引入了Lucene进行全文检索。2008年,人人网开始开发开放API,引入了SOA(Service-oriented architecture,面向服务架构),同时由于业务量的大幅增加,MySQL进行了水平分区。另外,开始使用DFS(分布式文件系统)并引入了集群存储系统(龙存)。2008年以后,人人网开始拆分各个子系统,架构从紧耦合逐渐变为松耦合,MySQL也逐渐地被NoSQL取代,同时更加关注Graceful degradation和TCO((Total cost of ownership))。

    从网络搜集到的资料来看,人人网目前采用的相关软件如下:

    Nginx用来做跨IDC的请求代理;Resin用作Web服务器;Squid cache用作图片文件的反向代理;LVS提供四层负载均衡;ICE网络通讯框架被用来开发一些cache服务和逻辑服务;Netty网络框架被用来开发一些小服务;Struts框架已被自行开发的基于Spring技术的Rose Web框架所代替;基于Lucene的搜索集群提供搜人的服务;Memcached继续负责大部分缓存服务;持久化除MySQL外还有Tokyo Cabinet和人人网自行开发的Nuclear。大致的架构图如下:





    展开全文
  • 现有数据整合方案介绍

    千次阅读 2009-10-20 21:23:00
    数据整合方案是数据整合的研究重点,目前实际应用中已经形成了一些较为成熟的案例,主要有基于数据仓库的整合方案、基于中间件的整合方案、基于Web Services的整合方案、基于虚拟... 多数据库整合方案多数据库整合方案

    数据整合方案是数据整合的研究重点,目前实际应用中已经形成了一些较为成熟的案例,主要有基于数据仓库的整合方案、基于中间件的整合方案、基于Web Services的整合方案、基于虚拟数据库的整合方案。随着数据整合技术的发展,数据整合逐渐从单一的技术模式向流程、规则、方法等的综合模式演进,产生了多种综合类型数据整合方案,这之中较有影响的为主数据管理方案。

     

    多数据库整合方案

    多数据库整合方案通过对各个数据源的数据交换格式进行一一映射,从而实现数据的流通与共享。

    对于有全局统一模式的多数据库系统,用户可以通过局部外模式访问本地库,通过建立局部概念模式、全局概念模式、全局外模式,用户可以访问集成系统中的其他数据库;对于联邦式数据库系统,各局部数据库通过定义输入、输出模式,进行各联邦式数据库系统之间的数据访问。

    目前基于异构数据源系统的数据整合有多种方式,所采用的体系结构也各不相同,但其最终目的是相同的,即实现数据的流通共享。

     

    数据仓库整合方案

    数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented)、集成的(Integrate)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant)的数据集合,用于支持管理决策。从数据仓库的建立过程来看,数据仓库是一种面向主题的整合方案,因此首先应该根据具体的主题进行建模,然后根据数据模型和需求从多个数据源加载数据。由于不同数据源的数据结构可能不同,因而在加载数据之前要进行数据转换和数据整合,使得加载的数据统一到需要的数据模型下,即根据匹配、留存等规则,实现多种数据类型的关联。这种方式的主要问题是当数据更新频繁时会导致数据的不同步,即使定时运行转换程序也只能达到短期同步,这种整合方案不适用于数据更新频繁并且实时性要求很高的场合。

     

    中间件整合方案

    中间件是位于ClientServer之间的中介接口软件,是异构系统集成所需的黏结剂。现有的数据库中间件允许Client在异构数据库上调用SQL服务,解决异构数据库的互操作性问题。功能完善的数据库中间件,可以对用户屏蔽数据的分布地点、DBMS平台、特殊的本地API等等差异。

     

    Web Services整合方案

    Web Services可理解为自包含的、模块化的应用程序,它可以在网络中被描述、发布、查找以及调用;也可以把Web Services理解为是基于网络的、分布式的模块化组件,它执行特定的任务,遵守具体的技术规范,这些规范使得Web Services能与其他兼容的组件进行互操作。当把应用扩展到广域网时,传统的DCOM模型就不能完全满足分布式应用的要求:一是DCOM在进行网间数据传递时一般采用Socket套接字,要求开放特定的端口,这会给带防火墙的网络带来安全隐患,二是DCOM进行远程对象调用使用的协议是远程过程调用(RPC),这使得基于DCOM的构件无法与其他组件模型的构件进行相互的调用。Web ServicesDCOMCORBA的缺陷进行了改进,使用基于TCP/IP的应用层协议(HTTPSMTP),可以很好地解决穿越防火墙的问题;更重要的是各种组件模型都可以将数据包装成SOAP,通过SOAP进行相互调用。

     

    主数据管理整合方案

    主数据管理通过一组规则、流程、技术和解决方案,实现对企业数据一致性、完整性、相关性和精确性的有效管理,从而为所有企业相关用户提供准确一致的数据。

    主数据管理不是新技术,它的核心其实就是对于数据的管理,只不过应用了先进的理论方法作为指导。主数据管理提供了一种方法,通过此方法可以从现有系统中获取最新信息,并结合各类先进的技术和流程,使得用户可以准确、及时地分发和分析整个企业中的数据,并对数据进行有效性验证。

    (作者:周欢)

    展开全文
  • 本白皮书为您提供 Exadata 数据库云服务器(简称 Exadata)整合最佳实践,从而使您能够设置和管理系统和应用程序以实现最大稳定性和最高可用性。
  • 团队最近有个数据同步的需求,大致是两台或以上的数据库(MariaDB)服务器走VPN通道与一台数据库进行数据同步,先不关心VPN通道通迅的问题,对于这种主一从的数据同步需求,也曾尝试通过MySQL本身的复制功能配置实现...

    团队最近有个数据同步的需求,大致是两台或以上的数据库(MariaDB)服务器走VPN通道与一台数据库进行数据同步,先不关心VPN通道通迅的问题,对于这种多主一从的数据同步需求,也曾尝试通过MySQL本身的复制功能配置实现,但貌似不管是MySQL还是MariaDB目前都还没有实现多主一从的复制方案(官方说MariaDB从10.0开始支持,等到花儿都谢了)。

    初步确定两种方案:

           1.通过编码实现服务代码,定时主动向几个主库抓取数据并整合插入到从库中.

           2.通过第三方的开源解决方案(其实也是服务代码,但封装实现较好),虽然配置要繁琐,但同步效率要高很多。

    下面就记录下测试的一款第三方同步方案SymmetricDS(以下简称S)的使用过程,中文资料较少,而且存在一些版本上的差异,导致一些步骤根本不能通过或报错,自己简化了些操作,并没有按照官方的指导操作,鉴于英文水平有限,很多叙述都是基于自己的理解,也请有不同观点的兄弟留言指正或交流。

    之所以选择SymmetricDS,大致三个原因:

           1.  平台独立。不依赖其他组件包,独立配置完后实现功能。

           2.  业务无关。不需要关心数据库中的业务,直接配置同步的表名等参数。

           3.  同步及时。基于触发器的数据同步,保证数据传输的及时性。


    官方地址:http://www.symmetricds.org

    版本:symmetric-3.5.19-server.zip

    下面是开源中国的一些图表介绍,引用下:


    部署示意图,双箭头代表可以双向同步,而不是简单的单向复制。


    配置数据模型:对于各个服务器,不管是主机还是从机,都需要配置S服务,用来监听或执行动作等,并且是以节点代表服务器来配置,至于触发器更体现它的实时性,一方数据库发生变化,首先被本机S服务监听,同时向关联的节点发起同步请求,关联节点接收请求并做响应动作。



      运行时数据模型:当每个节点监听到本机的数据事件(即数据变动),会将变动的数据通过触发器与关联节点进行通迅。


    测试方案拓扑图如下。sun1、sun2 向 sun进行单向数据同步。

    因实际硬件测试环境限制,本地新建三个数据库分别模拟sun,sun1,sun2

    每个节点都需要配置一个s服务,将S服务代码分别解压到了三个目录:
    D:\develop\symmetric\sun\symmetric
    D:\develop\symmetric\sun1\symmetric
    D:\develop\symmetric\sun2\symmetric


    一、首先配置从机sun的S服务进入到D:\develop\symmetric\sun\symmetric目录,将samples目录下的corp-000.properties文件拷贝到engines目录下,samples目录下是官网提供的一个范例,engines是你配置自己同步服务的目录,corp-000.properties可以说是配置从机节点参数的一个模板,所以拷贝出来做修改,文件名可以自定义修改,修改为sunserver-000.properties。
    按照如下模板修改:

    engine.name 引擎名称,可以理解成当前节点服务的名称
    db.driver 数据库的jdbc驱动名称
    db.url 数据库连接字符串
    db.user 数据库用户名
    db.password 数据库密码
    registration.url 上一级节点的注册地址,如果是顶级节点,就设为空
    sync.url 本机的注册地址 http://localhost:8080/sync/sunserver-000
    其中8080是当前节点服务启动后需要占用的端口,sunserver-000即第一个参数engine.name的值
    group.id 节点组的ID,当前顶级节点组名为sunserver,意思是服务端
    external.id 当前节点组下节点的编号,通过上面的group.id和external.id可以定位到唯一的节点

    后面的参数是对S服务运行参数的配置,保持默认就好。

    二、配置子节点sun1。配置好顶级节点从机sun的服务,接下来就该配置子节点数据主机sun1,sun2的了,先配置sun1.同样的,进入到D:\develop\symmetric\sun1\symmetric目录,将samples目录下的store-001.properties文件拷贝到engines目录下,这里的store-001.properties也可以说是配置数据主机节点参数的一个模板,配置内容与sun类似,这里改名为sunclient-001.properties

    配置基本上与sun节点类似,其中有些需要关注的是:
    registration.url 这里填写的是上级节点的注册地址,可以看到就是sun配置参数中的sync.url
    这里的sync.url其实不用配置,因为节点到此为止。如果sun1以下还有节点分支,那需要配置这个参数,并且在下一个节点的registration.url配置这个值。需要注意的是,我当前是在单机上模拟三个节点服务的运行,所以每个节点服务的启动端口不同,避免冲突。sun1的启动端口是7070
    group.id 这里的组ID为sunclient,意思是客户端。

    三、配置sun2节点。进入到D:\develop\symmetric\sun2\symmetric目录,后续步骤与上一步相同。

    四、创建同步表数据。接下来,需要向同步的数据库进行数据导入,官网的方式是通过命令行进入到Symmetric的目录,通过命令执行sql脚本创建表和数据,但我尝试了几次,都没有成功,有些资料说是因为官网相关XML文件格式的问题,不管咋样,索性自己手动创建表和数据。
        所以要做的,就是在数据库中创建你要同步的表,如果数据库中已经有表结构了,可不做操作了。
        创建后的表为

    区域表,电站表。
    具体表结构也一目了然:

    所有的节点数据库sun、sun1、sun2都需手动创建和添加数据,并且理论上数据库的结构应该是保持一致的。


    五、初始化顶级节点sun的系统表结构这里的系统表,指的就是Symmetric自己的同步服务表,并且所有的节点数据库中都需要有这些系统表(这也是我觉得悲催的地方,光这些系统表就二三十个,忒不美观了)。稍微庆幸的是,我们只要在顶级节点中创建这些表,所有子节点在服务启动后,会根据顶级节点自动创建。
    通过命令行进入到D:\develop\symmetric\sun\symmetric\engines目录
    执行  
    ..\bin\symadmin --engine sunserver-000 create-sym-tables

    运行成功,完成初始化系统表。此时可以查看下数据库,发现多了好多表啊。

    sym前缀的表 都是,表数量不止于此,还不是完整截图。:-(

    六、初始化顶级节点sun的系统表数据。上一步骤是初始化表结构,下面就要初始化数据了。其实说到现在,我们都还不知道怎么控制SymmetricDS同步的逻辑,比如需要同步哪些表,哪个节点向哪个节点发送同步数据,这些都体现在系统表数据中了。
            至于如何初始化系统表数据,我参照了samples目录中insert_sample.sql脚本文件,官方范例中系统表的初始化脚本,另外还参照了百度文库中一篇说明。

    (1)配置节点组

    insert into sym_node_group (node_group_id, description)
    values ('sunserver', '电站数据中心');
    insert into sym_node_group (node_group_id, description)
    values ('sunclient', '子电站数据服务器');


    (2)配置各节点组间的数据同步模式。有push(推)和wait(等待||拉)两种,由data_event_action制定,其中w(wait for pull)代表拉,p代表推(push)。
    insert into sym_node_group_link (source_node_group_id, target_node_group_id, data_event_action)
    values ('sunclient', 'sunserver', 'P');
    insert into sym_node_group_link (source_node_group_id, target_node_group_id, data_event_action)
    values ('sunserver', 'sunclient', 'W');


    (3)配置各个节点信息。这里只要配置sun的节点信息就可,其他子节点sun1、sun2在注册节点后,会自动生成系统表并且插入数据
    insert into sym_node (node_id, node_group_id, external_id, sync_enabled)
    values ('000', 'sunserver', '000', 1);
    insert into sym_node_security (node_id,node_password,registration_enabled,registration_time,initial_load_enabled,initial_load_time,initial_load_id,initial_load_create_by,rev_initial_load_enabled,rev_initial_load_time,rev_initial_load_id,rev_initial_load_create_by,created_at_node_id)
    values ('000','123456',0,current_timestamp,0,current_timestamp,null,null,0,null,null,null,'000');
    insert into sym_node_identity values ('000');


    (4)配置数据通道表。有外键关联的表,一定要定义在同一通道中,才能进行关联同步。
    insert into sym_channel
    (channel_id, processing_order, max_batch_size, enabled, description)
    values('bus_info', 1, 100000, 1, '电站信息同步通道');


    (5)定义触发器。在这里定义需要同步库中的哪些表,注意有外键关联的表,通道值要相同。sym_trigger中的excluded_column_names字段,可以设置不想同步的表字段,这里并没有体现。
    insert into sym_trigger
    (trigger_id,source_table_name,channel_id,last_update_time,create_time)
    values('symmetric_test_area','symmetric_test_area','bus_info',current_timestamp,current_timestamp);
    insert into sym_trigger  
    (trigger_id,source_table_name,channel_id,last_update_time,create_time)
    values('symmetric_test_bus','symmetric_test_bus','bus_info',current_timestamp,current_timestamp);


    (6)配置数据路由。配置数据同步时数据的走向,即从哪个节点向哪个节点同步。其中ROUTER_TYPE='column'就是指明由需同步的表中某列的值来决定数据流向,具体的条件则来表达式决定:ROUTER_EXPRESSION='org_code=:EXTERNAL_ID' 。默认ROUTER_TYPE=‘default’就好。
    insert into sym_router
    (router_id,source_node_group_id,target_node_group_id,router_type,create_time,last_update_time)
    values('client_2_server', 'sunclient', 'sunserver', 'default',current_timestamp, current_timestamp);


    (7)最后建立触发器与路由的关联。SymmetricDS中定义的触发器只有被路由关联后,SymmetricDS才会为这个表自动生成相应的触发器。
    insert into sym_trigger_router
    (trigger_id,router_id,initial_load_order,last_update_time,create_time)
    values('symmetric_test_area','client_2_server', 200, current_timestamp, current_timestamp);
    insert into sym_trigger_router
    (trigger_id,router_id,initial_load_order,last_update_time,create_time)
    values('symmetric_test_bus','client_2_server', 200, current_timestamp, current_timestamp);


    七、启动SymmetricDS
    (1)注册所有子节点,命令行进入D:\develop\symmetric\sun\symmetric\engines 顶级节点目录。
    分别执行注册节点命令
    ..\bin\symadmin --engine sunserver-000 open-registration sunclient 001
    ..\bin\symadmin --engine sunserver-000 open-registration sunclient 002

    再分别执行注入节点命令
    ..\bin\symadmin --engine sunserver-000 reload-node 001
    ..\bin\symadmin --engine sunserver-000 reload-node 002

    (2)启动服务。
    分别启动三个节点的服务,先执行子节点。
    命令行进入 D:\develop\symmetric\sun1\symmetric\engines 
    执行 
    ..\bin\sym --port 7070

    命令行进入 D:\develop\symmetric\sun2\symmetric\engines 
    执行 .
    ..\bin\sym --port 9090

    命令行进入 D:\develop\symmetric\sun\symmetric\engines 
    执行 
    ..\bin\sym --port 8080

    这里要注意端口号,即配置文件中注册地址的端口号。




    至此 三个服务都成功开启。下面可以进行测试了。。

    在sun1数据库symmetric_test_area表中新增一条数据4--seattle

    在sun2数据库symmetric_test_area表中新增一条数据5--tokyo

    最后直接查看sun的数据库,会发现:

    大功告成!

    总结:
    SymmetricDS功能很复杂,这里只是暂时实现了多主一从结构的配置,深入到具体的同步细节,还需要了解很多。
    优点:同步即时,基于推拉双机制的同步,对于数据的及时性完整性有保障。关于事件的并发与线程管理已封装。表结构变动对于配置好的数据字段的同步影响不大,但对于新增的字段如果也需要同步的话,需要重新注册节点,并重启服务。
    缺点:每个节点都需要配置服务代码,且比较复杂。会在每个节点数据库中生成41张同步系统表,业务的控制体现在表数据中。适合用于固定或长期稳定的网络通道的机房环境。如果整合进产品往外推广,配置复杂后期维护也麻烦,适合本公司内部服务器的应用。

    补充:其实我觉得最大的优点就是,对于数据同步这个需求,symmetricDS只需要配置不关心每个数据库的具体业务,只关心要同步哪个数据库哪张表。如果是写服务代码来定时抓取数据再插入数据的话,可能还要考虑到数据库中的业务,比如哪个表关联哪个表,插入数据的先后还有级联问题等,对于symmetricDS来说只要关联表在一个同步通道中即可。



    展开全文
  • 数据库数据整合

    千次阅读 2019-02-28 13:39:41
    系统开发一段时间上线之后,由于功能业务复杂,数据量较大,为了监控也是运维一部分,需要对数据库的数据进行检查,整合。一般会对一些关键数据进行定期检查,对于库存之类的,基本是每天都需要检查整合。每天可以...
  • 通过MySQLReplication功能所实现的扩展总是会受到数据库大小的限制,一旦数据库过于庞大,尤其是当写入过于频繁,很难由一台主机支撑的时候,我们还是会面临到扩展瓶颈。这时候,我们就必须许找其他技术手段来解决这...
  • 同时,以智慧城市公共基础数据库指标体系建立为基础,整合来自各委办局和各所辖地区的、经过审核转换处理的数据资源,可实现对经济社会信息的统一和集中存储,确保数据的唯一性和准确性,为今后政府工作提供一致的...
  • 最近公司推荐了mycat分布式中间件解决数据库分布式方案,今天到mycat官网学了一翻(http://www.mycat.org.cn),汇总下几个重点: mycat是什么? mycat常见的双中心双活部署方案(还需进一步验证) ...
  • 本文主要详细描述了Oracle云数据库的技术,对熟悉数据库或者不数据库的同学很大的帮助,对销售经理也有启迪作用,并能给各位技术人员的工作提供帮助。
  • NoSQL新趋势:实时分析和数据库整合

    千次阅读 2013-09-15 17:07:35
    【IT168 专稿】NoSQL数据库管理着大量来自不同系统的各类数据,其中以Web应用程序最为典型。不过在未来,我们会看到NoSQL系统逐步走向实时分析领域,并开始接手部分企业的NoSQL数据系统的合并任务。  来自甲骨文...
  • 问题原因:在使用Spring Boot整合mybatis保存数据到Mysql数据库时出现中文乱码,查阅资料后发现是是因为character-set-server=latinl导致。   错误截图:   插入数据乱码    解决方案:  cat /...
  • 企业信息系统整合方案,内容主要包括: 现状和目标 3 技术难点 4 (1) 数据库基础 4 (2) 规范与标准 5 (3) 系统体系结构 5 (4) 操纵系统和网络硬件环境 5 实现方案 6 (1) 分析总体需求,确定系统整合的原则与...
  • ORACLE数据库优化设计方案

    千次阅读 2012-11-07 10:42:56
    本文主要从大型数据库ORACLE环境四个不同级别的调整分析入手,分析ORACLE的系统结构和工作机理,从九个不同方面较全面地总结了ORACLE数据库的优化调整方案。 关键词 ORACLE数据库 环境调整 优化设计 方案 对于...
  • 摘要:本文通过图文详细介绍了如何通过Modeler的数据库源节点获取不同数据库中的数据,然后对数据进行合并、追加,最后进行建模的过程。IBMSPSSModeler是IBM在分析与预测领域解决方案的重要组成部分,它是一组数据...
  • 本文主要介绍了Spring+MyBatis实现数据库读写分离方案。具有一定的参考价值,下面跟着小编一起来看下吧
  • SequoiaDB巨杉数据库也成为了Spark官方认证的全球合作伙伴和授权的Spark提供商之一,SequoiaDB巨杉数据库也是国内唯一获得该认证和发行权的数据库公司。 深度整合Spark 2.0 SequoiaDB 2.0通过深度集成最新的...
  • 现在公司想把这些系统重新开发,我的想法是把所有系统的数据集中到一起,做一个统一的数据库平台,然后其他系统都是基于这个数据库平台进行开发,这样就可以避免系统间同步数据的苦恼,不知道这样的方案可行性怎么样
  • 这边文章的数据源写法参照了 http://www.ityouknow.com/springboot/2016/11/25/spring-boot-multi-mybatis.html 1、pom.xml配置 <!-- mybatis --> <dependency> <groupId>org.mybatis....
  • Cordys平台是SOA+BPM融合,内置整合Apache、LDap。 一、数据库适当冗余 1、WORKFLOW_INSTANCE_TRANSLOG表增加业务主键和业务分类,再按业务主键和业务分类进行分区,并提升快捷查询; 2、DOC_PACKING_ISSUE_ADV表...
  • Java--整合数据库

    千次阅读 2017-01-15 23:45:57
    这部分的知识如果在了解一些数据库的基本知识与操作之后学习的话会比较有感触,所以如果你没有数据库的基础,我建议大家先阅读一下我推荐的这篇文章,对我们的学习是非常有必要的(使用MysQL数据库)。 MySQL...
  • Android官方ORM数据库Room技术解决方案简介(一)Android的Romm是Android官方整合出来的一揽子ORM数据库解决方案。Android Room和历史上的ORM数据库如Android ORMLite(见附录文章1,2),Android greenDao等等,有...
  • 大型ORACLE数据库优化设计方案

    千次阅读 2007-10-30 13:55:00
    大型ORACLE数据库优化设计方案本文主要从大型数据库ORACLE环境四个不同级别的调整分析入手,分析ORACLE的系统结构和工作机理,从九个不同方面较全面地总结了ORACLE数据库的优化调整方案。 关键词 ORACLE数据库环境...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 112,566
精华内容 45,026
关键字:

多数据库整合方案