`
cppmule
  • 浏览: 447167 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

轻量级分布式数据库访问层amoeba,cobarClient试用感受

 
阅读更多

轻量级分布式数据库访问层amoeba,cobarClient试用感受



最近准备鼓捣一下读写分离,数据shading等这一类型数据scale的东东。

因为用的是mysql,双master,master-slave,master-salves-slaves,master-master-slaves-slaves都看了一下,简单的试了一下master-slave,成功OK。

但是在应用层次如何来透明的应对和管理这些多个数据源,甚至实现loadblance和HA,fail over呢。

比较好的做法就是引入一个单独的数据访问层,来屏蔽掉对应用层次的细节了。

 

mysql的话,用得最多的当然mysqlproxy。但这个东东全靠写lua脚本,又要去学一个语言,麻烦啊。而且听说在数据源很多很复杂的情况下,lua脚本写起来也是很多很复杂。

处于暂时的研究目的,就先不去试这个了。就找了两个国内这个方面比较好的开源项目来试一下。一个就是amoeba,一个就是cobarClient了~!

 

####试用amoeba感受####

amoeba首页在此:

http://amoeba.meidusa.com/wordpress/

amoeba主要是引入了一个对于应用层次完全透明的数据访问层,和应用层链接采取mysql协议。在取得客户端请求后,解析mysql协议,解析sql,然后按切分和路由规则发送到相应的db实例中。具体的自己点进去看吧。amoeba目前只能针对多个数据库实例进行分片,而不能单个数据库实例里面表分片。目前也不支持事务。

 

下面是一些试用过程中的片段:

一 。  amoeba进行数据水平切分的测试,采用的innodb引擎:

用一个id取摸的简单规则进行了测试;


insert,这种是可以正确切分的:
insert into staff(id,name) values(1,'name');
insert into staff(id,name) values(2,'name');

但是如果写

insert into staff(id,name) value(2,'name');

就要悲剧。。。貌似目前对sql的写法细节比较挑。

insert into staff values (id1,name1),(id2,name2)....;
insert into staff values (null,name1),(null,name2)....;
也不能正确shading,插入到default dbserver去了。1是这种批量插入写法amoeba暂时不支持,2是路由规则匹配不到就直接进入defaultdb执行。

如果你每个db的表主键都采用自增id的话,写如下sql

insert into staff(name) values(10);
每个db都会插入数据。采用当前db表的自增序列。可能造成不同库id重复的情况,这一点在数据迁移的时候和跨库数据读取交互的时候会存在很大问题。
解决方法是:你必须要在sql里面带上主键的值,且保证切分规则对于不同的数据传入的主键值不重复。
                         所以一旦分片,最好建立一个全局的id,并且在插入的时候显式指定。

 

二 。   虽然amoeba说明目前不支持事务。但我还是打算试一下路由到单个db实例时候的事务是否正确。

把autocommit设置为0
之后连续两个insert(都路由到db1)之后rollback,再来一次commit的,木啥问题.没commit的话,数据库中实际数据也没有插入。

但是放到应用中(spring3.x+ibatis2.x),使用Spring的dataSourceTrsantionManager管理事务。

测试一个简单的插入语句insert,之后throw异常,发现无法回滚。。。。

看来事务确实有很多问题,暂时不支持,分布式的就更别提了。。

 

三 。  测试一下对多个db库的负载均衡和HA的支持

先自己开启mysql的两个实例,做好读写分离。然后配置amoeba

先在dbserver.xml配置下面的db以及虚拟db
<dbServer name="server1"  parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">127.0.0.1</property>

<!-- mysql password
<property name="password">lumi</property>
-->
</factoryConfig>
</dbServer>

<dbServer name="server2"  parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">220.167.54.227</property>
<property name="port">32230</property>
<!-- mysql password
<property name="password">lumi</property>
-->
</factoryConfig>
</dbServer>

<dbServer name="virtualSlave" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
<property name="loadbalance">1</property>

<!-- Separated by commas,such as: server1,server2,server1 -->
<property name="poolNames">server1,server2</property>
</poolConfig>
</dbServer>
然后在amoeba.xml做路由配置


<queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
<property name="ruleLoader">
<bean class="com.meidusa.amoeba.route.TableRuleFileLoader">
<property name="ruleFile">${amoeba.home}/conf/rule.xml</property>
<property name="functionFile">${amoeba.home}/conf/ruleFunctionMap.xml</property>
</bean>
</property>
<property name="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml</property>
<property name="LRUMapSize">1500</property>
<property name="defaultPool">server1</property>

<!-- -->
<property name="writePool">server1</property>
<property name="readPool">virtualSlave</property>

<property name="needParse">true</property>
</queryRouter>

最后去掉rule.xml里面的配置信息,全部把路由规则交给amoeba.xml里面的queryRouter。ok重启amoeba。
进去后发现select语句在两台db实例间轮询查询,说明负载平衡起作用了。关掉其中一个db实例后,全部都走另外一个db实例查询。

后面有测试了,将两个db实例做成一个virtualMasterDB,然后loadbalance配置为HA。写全部指向第1个db实例,这台挂了后自动指向第2个db实例。

读的话就跟之前测试这个一样全部指向VirtualSlave。全部OK。这样一个简单的master-master-slaves的loadblance+简单HA的架构就搭建起来了。

 

看来目前aomeba的问题就是,很多细节上支持尚不完善,如sql解析等等。不支持local事务。另外引入这个虚拟层后本身就变成了一个单点的问题还需要解决。

关于性能的话,本身基于java的,可以调整虚拟机参数还有各种链接参数,另外性能报告这里有一个:http://www.54chen.com/java-ee/amoeba-benchmark-report.html 还行。

最后再给个官方参考文档例子:http://docs.hexnova.com/amoeba/

 

###使用cobarClient感受###

cobarClient是淘宝开源的基于ibatis的cobarClinet数据库分布式数据访问层框架。看介绍应该用于过一些实际当中的项目。这个东东诞生的初期就是因为当时客户不愿意使用阿里的cobarServer层次的数据层解决方案(应该跟amoeba的思路差不多吧,单独的虚拟层,莫非就是淘宝现在TDDL的前身,据说阿里大部分用cobarserver来解决,淘宝用的tddl?),因为要单独使用一个server层的物理机器。就搞了个这个轻量级的应用层使用的shading框架解决方案出来。

这个东东的地址是 http://code.alibabatech.com/wiki/display/CobarClient/Home。
中文手册地址:http://code.alibabatech.com/docs/cobarclient/zh/

这个框架是基于Maven2.2.1, iBatis 2.3.4. 726 , Spring2.5.6SEC01..02(Spring3 is NOT supported, its API is changed), MVEL2.0.16(里面的切分表达式用的语句)

spring3x由于api变动无法用,同理ibatis3x也一样悲剧
CobarClient因为是更高层次的封装,(相对于protocol,driver等级别,比如amoeba这种)也就是应用框架级别的封装,所以更好扩展。
相对于amoeba来说,他没有解析sql的过程,路由sql和shading规则都是扩展spring的SqlMapClinetTemple拦截解析ibatis的sqlmap statement来做的。
对比amoeba,amoeba相当于是引入了一个完整的数据访问中间件层,对应用透明。CobarClient对DAL层有一定的侵入,且目前只支持ibatis2x,和spring2x,所以你的
应用系统也必须要基于这两个框架。
测试了一下,相对来说。CobarClient目前的功能更丰富,更多切分的细节方便控制。一样可以做简单的HA,。目前还没看到如何做loadblance。只支持简单的双击HA。但如果在rule规则中自己扩展好的话,应该一样可以实现loadblance。
因为amoeba要解析mysql协议,要对sql做parse。目前看来很多特殊的sql写法都有支持不完整的情况。
比如insert into tbale1 values(xx),(xx)...这种是当前是没法做切分的。而cobarClient可以。不可以的话你在应用层也更加方便扩展和修改。


而amoeba不支持事务。cobarClient支持Best Effort 1PC的食物支持。
保证一个数据操作过程中多个数据源各自的本地事务, 但不保证全局的分布式事务

对于中小型项目,用cobarClient更方便定制化和自己扩展。

分享到:
评论

相关推荐

    amoeba[1]分布式数据库解决方案.pdf

    ### Amoeba: 分布式数据库Proxy解决方案 #### 背景与意义 随着信息技术的快速发展及互联网应用的广泛普及,传统的集中式数据库系统逐渐暴露出其局限性,包括性能瓶颈、可靠性问题以及扩展性不足等。为了克服这些...

    amoeba分布式数据库解决方案

    Amoeba是一款专注于解决分布式数据库管理难题的中间件,它位于客户端与数据库服务器之间,为用户提供了一种透明的数据访问方式。具体来说,Amoeba的主要职责包括: - **数据切分**:通过对数据进行合理划分,将数据...

    基于Amoeba中间件的分布式数据库管理系统.pdf

    Amoeba中间件是一个开源的分布式数据库代理层,专门设计用于MySQL数据库,它可以在客户端和MySQL服务器之间提供一层抽象,负责接收客户端的SQL请求,并将请求分发到后端的数据库服务器上。Amoeba中间件提供了多种...

    Amoeba:分布式数据库Proxy解决方案

    ### Amoeba: 分布式数据库Proxy解决方案 #### 一、引言 随着信息技术的快速发展,数据量的急剧增长使得传统的集中式数据库面临着前所未有的挑战。为了应对这些挑战,分布式数据库技术应运而生,成为了现代企业数据...

    分布式数据库架构及企业实践——基于Mycat中间件

    互联网的蓬勃发展,业务驱动技术不断升级,在系统越来越庞大,技术越来越复杂,应用部署集群化,所有压力全部指向数据库,数据量巨大,数据库优化也到极限了,数据库的运维难以为继,在这种情况下,分布式数据库似乎...

    分布式数据库Proxy解决方案(mysql负载均衡)

    Amoeba 作为一种分布式数据库代理框架,为解决传统数据库面临的性能瓶颈、可靠性和扩展性等问题提供了有力的支持。通过其强大的功能集合,如数据切分、读写分离和负载均衡等,Amoeba 不仅能够有效提升系统的性能表现...

    分布式数据库解决方案[收集].pdf

    数据切分是解决大数据量存储的关键,Amoeba 提供了一种机制,使得客户端无需关心数据在哪个物理节点上,降低了业务层的复杂性。负载均衡则通过分配查询到不同的数据库节点,确保各节点的资源得到充分利用,避免了单...

    网络教学平台下分布式数据库技术的研究.pdf

    全局应用指的是应用程序可以访问和使用分布式系统中的所有数据,而局部应用则允许用户仅使用本地的局部数据库。这种方式保证了数据的独立性和透明性,同时局部数据库的自治性允许局部用户在不受全局用户影响的情况下...

    amoeba.pdf

    分布式数据库作为现代数据库管理技术的一个重要分支,它的发展与应用对于处理大规模数据和提供高可用性服务具有重要意义。随着计算机网络技术的飞速发展,传统的集中式数据库系统已逐渐显示出其局限性,特别是在系统...

    windows平台用amoeba实现读写分离

    这个软件基于Java致力于MySQL的分布式数据库前端代理层,处于在应用和数据库之间,对客户端透明,它主要在应用层访问MySQL的时候充当SQL路由功能,解析应用传递过来的SQL语句,专注于分布式数据库代理层(Database ...

    基于分布式数据库的聚丙烯安全信息管理系统设计与实现.pdf

    【基于分布式数据库的聚丙烯安全信息管理系统设计与实现】是一个针对化工生产安全信息管理的系统,特别是聚焦于聚丙烯这种重要的化工原料。系统利用J2EE平台和Amoeba技术,旨在解决化工企业在地理位置分散的情况下,...

    amoeba配置详解

    Amoeba是一个分布式数据库代理解决方案,它的出现是为了应对集中式数据库技术在处理性能、可靠性、可扩充性等方面所面临的局限性。在传统的集中式数据库系统中,数据处理集中在单个服务器上,这导致了性能瓶颈,一旦...

    amoeba-mysql-binary-2.2.0.tar.gz

    Amoeba for MySQL致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当query 路由功能,专注 分布式数据库 proxy 开发。座落与Client、DB Server(s)之间。对客户端透明。具有负载均衡、高可用性...

    amoeba使用教程

    Amoeba是一款开源的分布式数据库前端代理层,主要用于MySQL数据库的分布式管理。它在2008年开始发布,设计目标是解决传统集中式数据库系统的性能瓶颈、可靠性和可扩展性问题。Amoeba作为SQL路由工具,位于客户端和...

    分布式作业[文].pdf

    另外,还有Amoeba项目,它是一个用于MySQL的开源分布式数据库代理层,能够作为SQL路由工具,便于实现读写分离和解决大数据量、高访问量问题。 分布式数据查询处理是分布式数据库系统中的关键任务,需要考虑查询的总...

    Amoeba学习资料

    Amoeba,全称为Amoeba中间件,是一款开源的分布式数据库系统,主要应用于大型互联网公司的数据分片处理。在MySQL等传统关系型数据库无法满足大规模数据存储和高并发访问需求时,Amoeba应运而生,为解决这些问题提供...

    数据库读写分离中间件amoeba-n.tar.gz

    数据库读写分离是一种常见的优化策略,特别是在高并发、大数据量的场景下,它能有效提升系统的性能和稳定性。中间件在此扮演着至关重要的角色,它负责协调和管理数据库的读写操作,使得读操作可以分散到多个从库上,...

    amoeba集群文档+Amoeba使用指南pdf+mysql主从同步

    Amoeba在各个分片之间提供透明的数据路由,使得应用程序可以像访问单个数据库一样操作分布式数据库,提高了系统的可扩展性和并发处理能力。 **Amoeba使用指南**: Amoeba使用指南提供了详细的步骤和最佳实践,包括...

    数据库读写分离配置Amoeba和Mycat.docx

    ### 数据库读写分离配置Amoeba和Mycat #### 一、数据库读写分离概念及重要性 数据库读写分离是一种常见的数据库优化技术,主要用于提高系统的整体性能和扩展能力。随着业务量的增长,单一数据库往往难以承受大量的...

Global site tag (gtag.js) - Google Analytics