分享

Amoeba?介绍

 用勿龍潛 2011-12-13

Amoeba 是什么

Amoeba(变形虫)项目,专注 数据库 proxy 开发。座落与Client、DB Server(s)之间。对客户端透明。具有负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。
假如有一条sql: select * from test.account as t where t.id = 1990000002; 假设account表的那些id从1-1990000002 都有数据,那么你的account表将会多么庞大. 你已经不可能将所有的数据存放到一台数据库上面,这样的数据库执行sql性能将受到严重的影响。假设你将这些数据切分成100台数据库,每台存放20,000,000数据。
只要能够制定一个恰当的数据切分规则,那么amoeba 将轻易解决数据切分并且可以将query语句路由到目标数据库上面执行。

主要解决:

  • 降低 数据切分带来的复杂多数据库结构
  • 降低 数据切分规则 给应用带来的影响
  • 降低db 与客户端的连接数
  • 读写分离

    Amoeba Architecture

    Amoeba 作为DataBase Proxy的开发框架。致力于解决数据切分、读写分离。以下将为您介绍Amoeba 框架

    • Built on Java NIO

      • NIO 框架采用无阻塞模式,不像传统的Socket编程在大量并发的情况非常浪费系统资源、而且可扩展性也较差
    • Reusable Server Connection

      • Amoeba 提供与数据库连接的可重用度非常高,在Amoeba系统内所有Database Connection同时共享给所有连接到Amoeba的客户端
    • 提供读写分离、数据切分

      • 传统的读写分离技术需要通过客户端或者相关的Database Driver技术才能解决,而且客户端的配置也比较复杂
      • 单台Database 性能总是有限制的,基于Amoeba上面可以寻找一种可线性扩展的多数据支持。Amoeba为DBA提供一种非常友好的类似SQL语法的数据切分规则。
        同时客户端不用担心过多的DataBase Server会给应用带来更多的配置。
    • 支持高可用性、负责均衡

      • Amoeba 提供Database 连接的异常检测与连接恢复功能。
      • 用户可节省使用其他昂贵的负载均衡的硬件设备,Amoeba提供多台Database Server负载均衡策略(轮询、当前活动连接数量)。
    • Amoeba Sequence
    • Amoeba <wbr>介绍

      Amoeba <wbr>介绍


      Amoeba For Mysql

      Amoeba For Mysql 是 Amoeba项目的子项目。要使用Amoeba For Mysql您必须确保您已符合所有先决条件:

      先决条件:

      1. Java SE 1.5或者以上 Amoeba 框架是基于JDK1.5开发的,采用了JDK1.5的特性。
      2. 支持Mysql协议版本10(mysql 4.1以后的版本)。
      3. 您的网络环境至少运行有一个mysql 4.1以上的服务

      如何快速配置:

      1. 配置Server(以下是双核CPU配置,调整线程数可优化性能),配置说明:
        配置项 是否必选 默认值 说明
        port 8066 Amoeba Server绑定的对外端口
        ipAddress Amoeba绑定的IP
        user 客户端连接到Amoeba的用户名
        password 客户端连接到Amoeba所用的密码
        readThreadPoolSize 16 负责读客户端、databa seserver 端网络数据包线程数
        clientSideThreadPoolSize 16 负责读执行客户端请求的线程数
        serverSideThreadPoolSize 16 负责处理服务端返回数据包的线程数
      2. Server Tag Configuration
        1. <server>  
        2.     <!-- proxy server绑定的端口 -->  
        3.     <property name="port">2066</property>  
        4.        
        5.     <!-- proxy server绑定的IP -->  
        6.     <property name="ipAddress">127.0.0.1</property>  
        7.        
        8.     <!-- proxy server net IO Read thread size -->  
        9.     <property name="readThreadPoolSize">100</property>  
        10.        
        11.     <!-- proxy server client process thread size -->  
        12.     <property name="clientSideThreadPoolSize">80</property>  
        13.        
        14.     <!-- mysql server data packet process thread size -->  
        15.     <property name="serverSideThreadPoolSize">100</property>  
        16.        
        17.     <!-- 对外验证的用户名 -->  
        18.     <property name="user">root</property>  
        19.        
        20.     <!-- 对外验证的密码 -->  
        21.     <property name="password">password</property>  
        22. </server>  
      3. 配置 ConnectionManager
        需要至少配置一个ConnectionManager,每个ConnectionManager将作为一个线程启动,ConnectionManager负责管理所注册在自身的Conneciton、负责他们的空闲检测,死亡检测、IO Event
      4. connectionManagerList Tag Configuration
        1. <!--    
        2.         每个ConnectionManager都将作为一个线程启动。   
        3.         manager负责Connection IO读写/死亡检测   
        4.     -->  
        5.     <connectionManagerList>  
        6.         <connectionManager name="defaultManager">  
        7.             <className>com.meidusa.amoeba.net.AuthingableConnectionManager</className>  
        8.         </connectionManager>  
        9.     </connectionManagerList>  
      5. 配置 dbServer ,需要至少配置一个dbServer,每个dbServer将是物理数据库Server的衍射

        factoryConfig --目标物理数据库衍射配置情况:

        配置项 是否必选 默认值 说明
        manager 表示该dbServer 将注册到指定的ConnectionManager
        port 3306 目标数据库端口
        ipAddress 127.0.0.1 目标数据库IP
        schema 连接初始化的Schema
        user 用于登陆目标数据库的用户名
        password 用于登陆目标数据库的密码
        className 连接工厂实现类(com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory)

        poolConfig -- 连接池配置情况:

        配置项 是否必选 默认值 说明
        className   连接池实现类。默认:com.meidusa.amoeba.net.poolable.PoolableObjectPool
        maxActive 8 最大活动连接数,如果达到最大活动连接数,则会等待
        maxIdle 8 最大的空闲连接数,如果超过则将会关闭多余的空闲连接
        minIdle 0 最小的空闲连接,连接池将保持最小空闲连接,即使这些连接长久不用
        testOnBorrow false 当连接在使用前是否检查连接可用
        testWhileIdle fale 是否检测空闲连接,这个参数启动的时候下列2个参数才有效
        minEvictableIdleTimeMillis 30分钟 连接空闲多少时间将被驱逐(关闭)(time Unit:ms)
        timeBetweenEvictionRunsMillis -1 用于驱逐空闲连接没间隔多少时间检查一次空闲连接(time Unit:ms)
      6. dbServer Tag Configuration
        1. <dbServerList>  
        2.     <!--    
        3.         一台mysqlServer 需要配置一个pool,   
        4.         如果多台 平等的mysql需要进行loadBalance,    
        5.         平台已经提供一个具有负载均衡能力的objectPool:com.meidusa.amoeba.mysql.server.MultipleServerPool   
        6.         简单的配置是属性加上 virtual="true",该Pool 不允许配置factoryConfig 、poolConfig   
        7.            
        8.     -->  
        9.     <dbServer name="server1">  
        10.            
        11.         <!-- PoolableObjectFactory实现类 -->  
        12.         <factoryConfig>  
        13.             <className>com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory</className>  
        14.             <property name="manager">defaultManager</property>  
        15.                
        16.             <!-- 真实mysql数据库端口 -->  
        17.             <property name="port">3301</property>  
        18.                
        19.             <!-- 真实mysql数据库IP -->  
        20.             <property name="ipAddress">127.0.0.1</property>  
        21.                
        22.             <!-- 用于登陆mysql的用户名 -->  
        23.             <property name="user">test</property>  
        24.                
        25.             <!-- 用于登陆mysql的密码 -->  
        26.             <property name="password">test</property>  
        27.             <property name="schema">testSchema</property>  
        28.         </factoryConfig>  
        29.            
        30.         <!-- ObjectPool实现类 -->  
        31.         <poolConfig>  
        32.             <className>com.meidusa.amoeba.net.poolable.PoolableObjectPool</className>  
        33.             <property name="maxActive">200</property>  
        34.             <property name="maxIdle">200</property>  
        35.             <property name="minIdle">10</property>  
        36.             <property name="minEvictableIdleTimeMillis">600000</property>  
        37.             <property name="timeBetweenEvictionRunsMillis">600000</property>  
        38.             <property name="testOnBorrow">true</property>  
        39.             <property name="testWhileIdle">true</property>  
        40.         </poolConfig>  
        41.     </dbServer>  
        42. </dbServerList>  
      7. QueryRouter 查询路由配置
      8. 配置项 是否必选 默认值 说明
        className QueryRouter实现类,Amoeba For Mysql(com.meidusa.amoeba.mysql.parser.MysqlQueryRouter)。
        functionConfig 用于解析sql 函数的配置文件,如果不配置则将不解析包含函数sql或者解析的不完整。
        ruleConfig 数据切分规则配置文件,如果不配置则sql数据切分功能将不能用
        needParse true 是否对 sql进行parse,如果false 则将不能使用数据切分、读写分离等功能
        defaultPool needParse=false、无法解析query、不满足切分规则的、writePool|readPool == null情况。所有sql 将在默认得dbServer上面执行。(必选)
        writePool 启用needParse 功能,并且没有匹配到数据切分规则,则 update、insert、delete 语句将在这个pool中执行
        readPool 启用needParse 功能,并且没有匹配到数据切分规则,则 select 语句将在这个pool中执行
        LRUMapSize 1000 statment cache ,存放 sql 解析后得到的statment
        queryRouter Tag Configuration
        1. <queryRouter>  
        2.     <className>com.meidusa.amoeba.mysql.parser.MysqlQueryRouter</className>  
        3.     <!--   
        4.     <property name="ruleConfig">./src/conf/rule.xml</property>  
        5.     <property name="functionConfig">./src/conf/functionMap.xml</property>  
        6.     -->  
        7.     <property name="needParse">false</property>  
        8.     <property name="LRUMapSize">1500</property>  
        9.     <property name="defaultPool">server1</property>  
        10.     <!--   
        11.     <property name="writePool">server1</property>  
        12.     <property name="readPool">server1</property>  
        13.     -->  
        14. </queryRouter> 

Amoeba 高级特性

本节讲述如何使用Amoeba高级特性。负载均衡、数据切分、如何编写数据切分规则等。

  1. 负载均衡特性
    Amoeba 不仅仅提供普通的连接池功能,而还提供了虚拟的连接池。
    Virtual DbServer Configuration
    1. <dbserver name="multiPool" virtual="true">  
    2.     <poolconfig>  
    3.         <classname>com.meidusa.amoeba.server.MultipleServerPool</classname>  
    4.         <!-- 负载均衡参数 1=ROUNDROBIN 2=WEIGHTBASED -->  
    5.         <property name="loadbalance">1</property>  
    6.         <!-- 参与该pool负载均衡的poolName列表以逗号分割 -->  
    7.         <property name="poolNames">server1,server2</property>  
    8.     </poolconfig>  
    9. </dbserver>  

    Virtual dbserver 参数配置说明:
    配置项 是否必选 默认值 说明
    className   默认值:com.meidusa.amoeba.server.MultipleServerPool
    loadbalance 1 负载均衡参数 1=ROUNDROBIN(轮询方式) , 2=WEIGHTBASED(根据当前活动连接数。活动连接少的优先)
    poolNames 以逗号分割的pool name list(比如:server1,server2)
    virtual false 如果该值为true,则className 默认值为com.meidusa.amoeba.server.MultipleServerPool
  2. 开启QueryRouter 查询功能,配置规则文件
    queryRouter Tag Configuration
    1. <queryRouter>  
    2.     <className>com.meidusa.amoeba.mysql.parser.MysqlQueryRouter</className>  
    3.        
    4.     <property name="ruleConfig">./conf/rule.xml</property>  
    5.     <property name="functionConfig">./conf/functionMap.xml</property>  
    6.        
    7.     <property name="needParse">true</property>  
    8.     <property name="LRUMapSize">1500</property>  
    9.     <property name="defaultPool">server1</property>  
    10.        
    11.     <property name="writePool">server1</property>  
    12.     <property name="readPool">server1</property>  
    13.        
    14. </queryRouter>  
    配置项 是否必选 默认值 说明
    className QueryRouter实现类,Amoeba For Mysql(com.meidusa.amoeba.mysql.parser.MysqlQueryRouter)。
    functionConfig 用于解析sql 函数的配置文件,如果不配置则将不解析包含函数sql或者解析的不完整。
    ruleConfig 数据切分规则配置文件,如果不配置则sql数据切分功能将不能用
    needParse true 是否对 sql进行parse,如果false 则将不能使用数据切分、读写分离等功能
    defaultPool needParse=false、无法解析query、不满足切分规则的、writePool|readPool == null情况。所有sql 将在默认得dbServer上面执行。(必选)
    writePool 启用needParse 功能,并且没有匹配到数据切分规则,则 update、insert、delete 语句将在这个pool中执行
    readPool 启用needParse 功能,并且没有匹配到数据切分规则,则 select 语句将在这个pool中执行
    LRUMapSize 1000 statment cache ,存放 sql 解析后得到的statment
  3. 如何编写ruleConfig 配置项的 规则文件,具体可以参阅sqlJep

    TableRule、Rule、QueryRouter 中返回Pool的优先级别:
    规则中Pool优先级别: Rule > TableRule > QueryRouter
    读、写、默认的Pools优先级别:readPools | writePools > defaultPools

    Rule Configuration
    1. <?xml version="1.0" encoding="gbk"?>  
    2.   
    3. <ruleList>  
    4.     <tableRule name="ACCOUNT" schema="test" defaultPools="server1,server2,server3" readPools="" writePools="">  
    5.         <rule name="rule1">  
    6.             <parameters>ID</parameters>  
    7.             <expression><![CDATA[ ID <= 1000000]]></expression>  
    8.             <defaultPools>server1</defaultPools>  
    9.             <!--   
    10.             <readPools/>  
    11.             <writePools/>  
    12.             -->  
    13.         </rule>  
    14.            
    15.         <rule name="rule2">  
    16.             <parameters>ID</parameters>  
    17.             <expression><![CDATA[ ID between 1000001 and 2000000 ]]></expression>  
    18.             <defaultPools>server2</defaultPools>  
    19.         </rule>  
    20.            
    21.         <rule name="rule4">  
    22.             <parameters>ID</parameters>  
    23.             <expression><![CDATA[ ID 20000000 ]]></expression>  
    24.             <defaultPools>server3</defaultPools>  
    25.         </rule>  
    26.     </tableRule>  
    27.        
    28. </ruleList>  

    Table Rule 参数配置说明:
    配置项 是否必选 默认值 说明
    name 数据库表名
    schema 数据库schema
    defaultPools 假设 Table:test 被切分成2个数据库,那么defaultPools应该写上所有test表所在的Pool,以逗号分割
    readPools 当您配置了该属性,则相当于启用读写分离规则,多个Pool以逗号分割
    writePools 当您配置了该属性,则相当于启用读写分离规则,多个Pool以逗号分割

    Expression Rule 参数配置说明:
    配置项 是否必选 默认值 说明
    name 规则名称,唯一
    parameters 一般是表中的字段。,多个Parameter以逗号分割
    expression 这条规则的表达式,类似sql,具体可以参阅sqlJep
    defaultPools 如果sql查询条件与表达式有交集的时候,而且 readPools、writePools 没有被配置,则返回这个值
    readPools 当您配置了该属性,如果sql查询条件与表达式有交集,而且是select 语句则返回该值
    writePools 当您配置了该属性,如果sql查询条件与表达式有交集,而且是update、delete、insert 语句则返回该值

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多