Amoeba:分布式数据库Proxy解决方案author:陈思儒随着传统的数据库技术日趋成熟、计算机网络技术的飞速发展和应用范围的扩充,数据库应用已经普遍建立于计算机网络之上。这时集中式数据库系统表现出它的不足:集中式处理,势必造成性能瓶颈;应用程序集中在一台计算机上运行,一旦该计算机发生故障,则整个系统受到影响,可靠性不高;集中式处理引起系统的规模和配置都不够灵活,系统的可扩充性差。在这种形势下,集中式数据库将向分布式数据库发展。分布式数据库系统的优点:1、降低费用。分布式数据库在地理上可以式分布的。其系统的结构符合这种分布的要求。允许用户在自己的本地录用、查询、维护等操作,实行局部控制,降低通信代价,避免集中式需要更高要求的硬件设备。而且分布式数据库在单台机器上面数据量较少,其响应速度明显提升。2、提高系统整体可用性。避免了因为单台数据库的故障而造成全部瘫痪的后果。3、易于扩展处理能力和系统规模。分布式数据库系统的结构可以很容易地扩展系统,在分布式数据库中增加一个新的节点,不影响现有系统的正常运行。这种方式比扩大集中式系统要灵活经济。在集中式系统中扩大系统和系统升级,由于有硬件不兼容和软件改变困难等缺点,升级的代价常常是昂贵和不可行的。Amoeba在分布式数据库系统充当什么角色?Amoeba在分布式数据库领域将致力解决数据切分,应付客户端“集中式”处理分布式数据。这儿集中式是一个相对概念,客户端不需要知道某种数据的物理存储地。避免这种逻辑出现在业务端,大大简化了客户端操作分布式数据的复杂程度。CopyRightStructchenAmoebaOverviewAmoeba属于分布式数据库代理开发框架,目前基于amoeba的数据库分布式代理有AmoebaForMysql。以下链接提供了您在开发、使用、安装Amoeba时,可能需要的信息:•Amoeba是什么本节描述了Amoeba是什么的以及它的框架•AmoebaForMysql本节介绍如何快速配置AmoebaForMysql,如何启动AmoebaForMysql,和您必须确保已经具备所有先决条件•Amoeba高级使用本节主要讲述如何利用Amoeba为目标数据库服务器创建负责均衡、数据切分、读写分离以及Amoeba本身性能调优方面•如何在Amoeba上面进行高级开发为其他数据库开发Amoeba新实例、数据库相关的函数开发等。CopyRightStructchenAmoeba是什么Amoeba(变形虫)项目,专注分布式数据库proxy开发。座落与Client、DBServer(s)之间。对客户端透明。具有负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。主要解决:•降低数据切分带来的复杂多数据库结构•提供切分规则并降低数据切分规则给应用带来的影响•降低db与客户端的连接数•读写分离CopyRightStructchenAmoebaArchitectureAmoeba作为DataBaseProxy的开发框架。致力于解决数据切分、读写分离。以下将为您介绍Amoeba框架•BuiltonJavaNIO1.采用javaNIO框架无阻塞模式,不像传统的Socket编程在大量并发的情况非常浪费系统资源、而且可扩展性也较差•ReusableServerConnectionAmoeba提供与数据库连接的可重用度非常高,在Amoeba系统内所DatabaseConnection同时共享给所有连接到Amoeba的客户端•提供读写分离、数据切分1.传统的读写分离技术需要通过客户端或者相关的DatabaseDriver技术才能解决,而且客户端的配置也比较复杂2.单台Database性能总是有限制的,基于Amoeba上面可以寻找一种可线性扩展的多数据库支持。Amoeba为DBA提供一种非常友好的类似SQL语法的数据切分规则同时客户端不用担心过多的DataBaseServer会给应用带来更多的配置。•支持高可用性、负责均衡1.Amoeba提供Database连接的异常检测与连接恢复功能。2.用户可节省使用其他昂贵的负载均衡的硬件设备,Amoeba提供多台DatabaseServer负载均衡策略(轮询、当前活动连接数量)CopyRightStructchenAmoebaSequenceCopyRightStructchenAmoebaForMysqlAmoebaForMysql是Amoeba项目的子项目。要使用AmoebaForMysql您必须确保您已符合所有先决条件:先决条件:1.JavaSE1.5或以上Amoeba框架是基于JDK1.5开发的,采用了JDK1.5的特性。2.支持Mysql协议版本10(mysql4.1以后的版本)。3.您的网络环境至少运行有一个mysql4.1以上的服务如何快速配置:1.配置Server(以下是双核CPU配置,调整线程数可优化性能),配置说明:配置项是否必选默认值说明否8066AmoebaServer绑定的对外端口ipAddress否空Amoeba绑定的IPuser是空客户端连接到Amoeba的用户名password否空客户端连接到Amoeba所用的密码readThreadPoolSize否16负责读客户端、databaseserver端网络数据包线程数clientSideThreadPoolSize否16负责读执行客户端请求的线程数serverSideThreadPoolSize否16负责处理服务端返回数据包的线程数CopyRightStructchen2.配置ConnectionManager需要至少配置一个ConnectionManager,每个ConnectionManager将作为一个线程启动,ConnectionManager负责管理所注册在自身的Conneciton、负责他们的空闲检测,死亡检测、IOEvent!--每个ConnectionManager都将作为一个线程启动。manager负责ConnectionIO读写/死亡检测--connectionManagerListconnectionManagername=defaultManagerclassNamecom.meidusa.amoeba.net.AuthingableConnectionManager/className/connectionManagerconnectionManagername=default//connectionManagerList3.配置dbServer,需要至少配置一个dbServer,每个dbServer将是物理数据库Server的衍射factoryConfig--目标物理数据库衍射配置情况:配置项是否必选默认值说明manager是空表示该dbServer将注册到指定的ConnectionManagerport否3306目标数据库端口ipAddress否127.0.0.1目标数据库IPschema否空连接初始化的SchemaCopyRightStructchen配置项是否必选默认值说明user是空用于登陆目标数据库的用户名password否空用于登陆目标数据库的密码className是空连接工厂实现类(com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory)4.poolConfig--连接池配置情况:配置项是否必选默认值说明className否连接池实现类。默认:com.meidusa.amoeba.net.poolable.PoolableObjectPoolmaxActive否8最大活动连接数,如果达到最大活动连接数,则会等待maxIdle否8最大的空闲连接数,如果超过则将会关闭多余的空闲连接minIdle否0最小的空闲连接,连接池将保持最小空闲连接,即使这些连接长久不用testOnBorrow否false当连接在使用前是否检查连接可用testWhileIdle否fale是否检测空闲连接,这个参数启动的时候下列2个参数才有效minEvictableIdleTimeMillis否30分钟连接空闲多少时间将被驱逐(关闭)(timeUnit:ms)timeBetweenEvictionRunsMillis否-1用于驱逐空闲连接没间隔多少时间检查一次空闲连接(timeUnit:ms)dbServerTagConfigurationdbServerList!--一台mysqlServer需要配置一个pool,如果多台平等的mysql需要进行loadBalance,平台已经提供一个具有负载均衡能力的objectPool:com.meidusa.amoeba.mysql.server.MultipleServerPool简单的配置是属性加上virtual=true,该Pool不允许配置factoryConfig或者自己写一个ObjectPool。--dbServername=userdb!--PoolableObjectFactory实现类--factoryConfigclassNamecom.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory/classNamepropertyname=managerdefaultManager/property!--真实mysql数据库端口--propertyname=port3301/property!--真实mysql数据库IP--propertyname=ipAddress127.0.0.1/property!--用于登陆mysql的用户名--propertyname=userroot/propertypropertyname=passwordpassword/propertypropertyname=schematest/property/factoryConfigCopyRightStructchen!--ObjectPool实现类--poolConfigclassNamecom.meidusa.amoeba.net.poolable.PoolableObjectPool/classNamepropertyname=maxActive200/propertypropertyname=maxIdle200/propertypropertyname=minIdle10/propertypropertyname=minEvictableIdleTimeMillis600000/propertypropertyname=timeBetweenEvictionRunsMillis600000/propertypropertyname=testOnBorrowtrue/propertypropertyname=testWhileIdletrue/property/poolConfig/dbServerdbServername=blogdb!--PoolableObjectFactory实现类--factoryConfigclassNamecom.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory/classNamepropertyname=managerdefaultManager/propertypropertyname=port3302/propertypropertyname=ipAddress127.0.0.1/propertypropertyname=userblog/propertypropertyname=passwordblog