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 高级特性
本节讲述如何使用Amoeba高级特性。负载均衡、数据切分、如何编写数据切分规则等。
- 负载均衡特性
Amoeba 不仅仅提供普通的连接池功能,而还提供了虚拟的连接池。
Virtual DbServer Configuration
-
- <dbserver name="multiPool" virtual="true">
- <poolconfig>
- <classname>com.meidusa.amoeba.server.MultipleServerPool</classname>
- <!-- 负载均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED -->
- <property name="loadbalance">1</property>
- <!-- 参与该pool负载均衡的poolName列表以逗号分割 -->
- <property name="poolNames">server1,server2</property>
- </poolconfig>
- </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 |
- 开启QueryRouter 查询功能,配置规则文件
queryRouter Tag Configuration
- <queryRouter>
- <className>com.meidusa.amoeba.mysql.parser.MysqlQueryRouter</className>
-
- <property name="ruleConfig">./conf/rule.xml</property>
- <property name="functionConfig">./conf/functionMap.xml</property>
-
- <property name="needParse">true</property>
- <property name="LRUMapSize">1500</property>
- <property name="defaultPool">server1</property>
-
- <property name="writePool">server1</property>
- <property name="readPool">server1</property>
-
- </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 |
- 如何编写ruleConfig 配置项的 规则文件,具体可以参阅sqlJep
TableRule、Rule、QueryRouter 中返回Pool的优先级别:
规则中Pool优先级别: Rule > TableRule > QueryRouter
读、写、默认的Pools优先级别:readPools | writePools > defaultPools
Rule Configuration
- <?xml version="1.0" encoding="gbk"?>
-
- <ruleList>
- <tableRule name="ACCOUNT" schema="test" defaultPools="server1,server2,server3" readPools="" writePools="">
- <rule name="rule1">
- <parameters>ID</parameters>
- <expression><![CDATA[ ID <= 1000000]]></expression>
- <defaultPools>server1</defaultPools>
- <!--
- <readPools/>
- <writePools/>
- -->
- </rule>
-
- <rule name="rule2">
- <parameters>ID</parameters>
- <expression><![CDATA[ ID between 1000001 and 2000000 ]]></expression>
- <defaultPools>server2</defaultPools>
- </rule>
-
- <rule name="rule4">
- <parameters>ID</parameters>
- <expression><![CDATA[ ID > 20000000 ]]></expression>
- <defaultPools>server3</defaultPools>
- </rule>
- </tableRule>
-
- </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 语句则返回该值 |