鲁江 你好,
其实你把amoeba for mysql 当作 mysql看待,那么就很容易理解了,
它其实就是一个虚拟 的mysql,
DSN=MySQL_090213;UID=root;PWD=123456
你把这些修改成amoeba实际的配置安装的ip,amoeba对外暴露的用户名、密码。
鲁江 on
February 17th, 2009
陈先生 您好,
Amoeba for mysql 当成一个虚拟的 mysql 我是这么理解的:ODBC连接Amoeba和连接Mysql是一样的,DSN保持不变,Host可以不变(127.0.0.1),DatabaseName不变,UID和PWD换成amoeba对外暴露的用户名、密码,Port换成8066。
db.open(NULL,FALSE,FALSE,_T(”ODBC;DSN=MySQL_090213;UID=amoeba_u;PWD=amoeba_p″),1);但是这样有问题,也可能是我的其他地方有问题,我想向您确认一下。
陈先生 您好,
以ODBC的方式连接Amoeba for MySQL,一直没有成功,还等待您的回答。
这次我换了以java JDBC的方式连接,直接连MySQL已经可以使用。但是JDBC 连接Amoeba for MySQL仍然提示有错误:“java.sql.SQLException: Access denied for user ‘amoebau’@'MyName’ (using password: YES)”
我的java连接语句如下:“Connection con=DriverManager.getConnection(”jdbc:mysql://127.0.0.1″,”amoebau”,”amoebap”);”
程序员最大的痛苦是:知道程序错了,却不知道错在哪里。
望指教!谢谢!
鲁江 on
February 19th, 2009
补充一点:
用JDBC连接Amoeba for MySQL前,
运行Amoeba.bat的结果如下:
D:\Amoeba\amoeba-mysql-0.32\bin>amoeba.bat
log4j:WARN log4j config load completed from file:D:\Amoeba\amoeba-mysql-0.32\bin
\..\conf\log4j.xml
log4j:WARN ip access config load completed from file:D:\Amoeba\amoeba-mysql-0.32
\bin\../conf/access_list.conf
2009-02-19 16:49:36,843 INFO net.ServerableConnectionManager - Server listening
on /192.168.2.111:8066.
flowercat on
February 20th, 2009
请问使用Amoeba for MySQL是否能支持同库分表的功能?因为目前系统采用MySQL Proxy HSCALE来实现的同库分表功能,以解决单表数据量过大的问题!
鲁江 on
February 20th, 2009
JDBC方式连接 试验成功。ODBC还不知道怎么设置
鲁江 on
February 24th, 2009
确实是ODBC驱动版本问题,ODBC测试连接成功。
王冰洁 on
February 26th, 2009
陈老师,您好:
我在启动Amoeba for MySQL时出现了一个问题,请指教,谢谢!
我刚刚的那条不知道发没发出去,所以再发一条。麻烦了。
[root@localhost bin]# ./amoeba
log4j:WARN log4j config load completed from file:/root/amoeba/conf/log4j.xml
Exception in thread “main” com.meidusa.amoeba.config.ConfigurationException: Error loading configuration file /root/amoeba/conf/amoeba.xml
with nested exception
com.meidusa.amoeba.config.ConfigurationException: Caught exception while loading file /root/amoeba/conf/amoeba.xml
with nested exception
org.xml.sax.SAXParseException: Element type “dbserver” must be declared.
at com.meidusa.amoeba.context.ProxyRuntimeContext.loadConfig(ProxyRuntimeContext.java:301)
at com.meidusa.amoeba.context.ProxyRuntimeContext.init(ProxyRuntimeContext.java:171)
at com.meidusa.amoeba.mysql.server.MysqlProxyServer.main(MysqlProxyServer.java:124)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.codehaus.classworlds.Launcher.launchStandard(Launcher.java:410)
at org.codehaus.classworlds.Launcher.launch(Launcher.java:344)
at org.codehaus.classworlds.Launcher.main(Launcher.java:461)
with nested exception com.meidusa.amoeba.config.ConfigurationException: Caught exception while loading file /root/amoeba/conf/amoeba.xml
with nested exception
org.xml.sax.SAXParseException: Element type “dbserver” must be declared.
com.meidusa.amoeba.config.ConfigurationException: Caught exception while loading file /root/amoeba/conf/amoeba.xml
with nested exception
org.xml.sax.SAXParseException: Element type “dbserver” must be declared.
at com.meidusa.amoeba.context.ProxyRuntimeContext.loadConfigurationFile(ProxyRuntimeContext.java:320)
at com.meidusa.amoeba.context.ProxyRuntimeContext.loadConfig(ProxyRuntimeContext.java:298)
at com.meidusa.amoeba.context.ProxyRuntimeContext.init(ProxyRuntimeContext.java:171)
at com.meidusa.amoeba.mysql.server.MysqlProxyServer.main(MysqlProxyServer.java:124)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.codehaus.classworlds.Launcher.launchStandard(Launcher.java:410)
at org.codehaus.classworlds.Launcher.launch(Launcher.java:344)
at org.codehaus.classworlds.Launcher.main(Launcher.java:461)
with nested exception org.xml.sax.SAXParseException: Element type “dbserver” must be declared.
org.xml.sax.SAXParseException: Element type “dbserver” must be declared.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:236)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:172)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:382)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:316)
at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.handleStartElement(XMLDTDValidator.java:1960)
at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.startElement(XMLDTDValidator.java:795)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:878)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(XMLDocumentFragmentScannerImpl.java:1693)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:368)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:834)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:148)
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:250)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:292)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:98)
at com.meidusa.amoeba.context.ProxyRuntimeContext.loadConfigurationFile(ProxyRuntimeContext.java:316)
at com.meidusa.amoeba.context.ProxyRuntimeContext.loadConfig(ProxyRuntimeContext.java:298)
at com.meidusa.amoeba.context.ProxyRuntimeContext.init(ProxyRuntimeContext.java:171)
at com.meidusa.amoeba.mysql.server.MysqlProxyServer.main(MysqlProxyServer.java:124)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.codehaus.classworlds.Launcher.launchStandard(Launcher.java:410)
at org.codehaus.classworlds.Launcher.launch(Launcher.java:344)
at org.codehaus.classworlds.Launcher.main(Launcher.java:461)
鲁江 on
March 3rd, 2009
to 王冰洁:
amoeba.xml中的dbserver改为dbServer试试
王冰洁 on
March 4th, 2009
to 鲁江:
非常感谢您,我就是把amoeba.xml中的一些配置项名称需要大写的部分字母小写了。现在已经解决。
王冰洁 on
March 5th, 2009
我测试amoeba的水平切分,定义的rule:id10(server2)
简单的java测试代码:
String sql = “insert into a(a,id) values(1,8),(1,80),(1,3),(1,300)”;
stmt.executeUpdate(sql);
res = stmt.executeQuery(”select id from a”);
运行java程序结果,server2没有数据插入。
按照rule,id=80和300的数据应该插入到server2中才对吧。
还有如果我一开始在就在sever1的a表中插入id数据1,10,100;server2的a表中插入id数据2,3,80;那么执行sql查询:select id from a;amoeba就不完全按照rule执行了吧,因为结果是server1和server2的id数据总和。结果是想要得到的。
mysql5.0 amoeba 0.31
用mysql客户端连接到amoeba上,开几个线程同时执行大查询,amoeba僵死。不会返回结果,也不会拒绝连接池的连接。在屏幕上出现如下信息:
Exception in thread “pool-1-thread-6″ java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2760)
at java.util.Arrays.copyOf(Arrays.java:2734)
at java.util.ArrayList.ensureCapacity(ArrayList.java:167)
at java.util.ArrayList.add(ArrayList.java:351)
at com.meidusa.amoeba.mysql.handler.CommandMessageHandler$CommandQueue.checkResponseCompleted(CommandMessageHandler.java:190)
at com.meidusa.amoeba.mysql.handler.CommandMessageHandler.handleMessage(CommandMessageHandler.java:417)
at com.meidusa.amoeba.mysql.handler.QueryCommandMessageHandler.handleMessage(QueryCommandMessageHandler.java:90)
at com.meidusa.amoeba.net.Connection.messageProcess(Connection.java:267)
at com.meidusa.amoeba.mysql.net.MysqlServerConnection.messageProcess(MysqlServerConnection.java:353)
at com.meidusa.amoeba.net.Connection.handleEvent(Connection.java:244)
at com.meidusa.amoeba.net.ConnectionManager$1.run(ConnectionManager.java:217)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:619)
这个怎么处理????
ray on
March 12th, 2009
mysql insert into tablename values (1,3,3),(2,3,3),(3,3,3)
现在对这种语法不支持哦
<p>使用8066端口连上amoeba后,执行查询语句返回有问题:<br />
mysql> select * from users where user like “%rain%”;<br />
ERROR 1044 (42000): null</p>
<p>mysql> SELECT * from users WHERE user=”rain”;<br />
—- —— ———————————- ——- ———– ——- ———— ——– ——————— ———— ———————<br />
| id | user | password | email | full_name | about | properties | status | resource_picture_id | site_admin | last_login |<br />
—- —— ———————————- ——- ———– ——- ———— ——– ——————— ———— ———————<br />
| 2 | rain | 21218cca77804d2ba1922c33e0151105 | | rain | | a:0:{} | 1 | 0 | 0 | 2007-10-12 22:22:09 |<br />
—- —— ———————————- ——- ———– ——- ———— ——– ——————— ———— ———————<br />
1 row in set (0.00 sec)</p>
<p>请问是什么原因?</p>
—————————————
以下是回复内容:
还是sql解析问题跟Like的规则解析问题,是bug
kevin on
May 20th, 2009
另:
amoeba for mysql 3.2环境:
select distinct(a.id),a.InfoTitle,b.corpName,a.ProPrice,a.ShowTime,a.ExpTime,
d.user as user_name,b.province,b.city,a.ProIntro
from blogs c, users d,provide_info a ,corp_info b ,keyword e
where a.blog_id=b.blog_id and a.blog_id!=’85653′
and now() - INTERVAL a.InfoExp DAY <a> now()
and a.blog_id=c.id
and c.owner_id=d.id and a.id=e.host_id and e.ktype=4
and e.kname=’气动行业’
order by a.ShowTime desc,a.id desc
(select comment_id ,source_id from mini_note_comments where source_id=53 order by comment_id desc limit 2)
union all
(select comment_id ,source_id from mini_note_comments where source_id=47 order by comment_id desc limit 2)
在使用amoeba代理时,有部分语句无法使用,请帮忙分析判断一下。。
SELECT * FROM bbs_doing USE INDEX(dateline) WHERE 1 ORDER BY dateline DESC LIMIT 0,20;
这个语句中如果使用了USE INDEX(dateline),通过代理就无法执行:
ERROR 1044 (42000): error,unknown statement:[SELECT * FROM bbs_doing USE INDEX(dateline) WHERE 1 ORDER BY dateline DESC LIMIT 0,20]
跪求宝贵的意见!
———————————–以下是回复内容—————————————–
下一个版本解决这个问题,多谢反馈^_^
fangwei on
August 14th, 2009
陈老师你好,在什么情况下会打印这个语句
2009-08-14 12:12:31,890 INFO net.Connection - Error reading message from socket [channel=java.nio.channels.SocketChannel[connected local=/127.0.0.1:8066 remote=/127.0.0.1:1543], error=java.io.IOException: 远程主机强迫关闭了一个现有的连接。].
java.io.IOException: 远程主机强迫关闭了一个现有的连接。
at sun.nio.ch.SocketDispatcher.read0(Native Method)
at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:25)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:233)
at sun.nio.ch.IOUtil.read(IOUtil.java:206)
at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:236)
at com.meidusa.amoeba.net.io.PacketInputStream.readPacket(PacketInputStream.java:99)
at com.meidusa.amoeba.net.Connection.handleEvent(Connection.java:237)
at com.meidusa.amoeba.net.ConnectionManager$1.run(ConnectionManager.java:216)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
不过我又遇到新的问题了:
select a.*,b.* from db1.a,db2.b where a.id=b.id and b.name=’derek’;
amoeba的rule.xml是对a表有配置tableRule, b表没有tableRule;
这条SQL经过dmlStatment.evaluate(parameters)分析,currentEvaluatedTableMap里只剩下了b表这个table (应该是由b.name=’derek’这个条件产生的);忽略了a表;
则在接下来的QueryRouter过程中,由于没有对应的tableRule,就给这条SQL分配了全局的this.readPools; 但是这条SQL只有被分配到a表的tableRule里配置的POOL才能正常执行;
—————————–以下是回复内容————————————-
你指定了schema其实关系不大的。如果想用其他的schema需要采用 类似sql select * from schema.tablename where id=1
其实一个应用他本身关注的是自身schema下的一些表。如果有特殊要求则可以采用上面的sql
陈先生:
感谢您提供了amoeba这样一个好的产品,在生产系统中又遇到了问题,amoeba运行一段时间不响应:
原来是因为linux中没有设置打开文件数,限制1024导致;这个情况已解决。
最近又频繁出现不响应的情况,通过mysql客户端连amoeba端口,也无法登录,project.log中打出:
2009-12-14 23:51:35,059 INFO report - State of server report:
- Uptime: 12h 53m 17s 793ms
- Report period: 12h 53m 17s 793ms
- Memory: 230601k used, 540608k total, 1009792k max
* Server pool=server1
- pool active Size=0, pool Idle size=10
* Server pool=server2
- pool active Size=0, pool Idle size=13
* Server pool=multiPool
- pool active Size=0, pool Idle size=23
* defaultManager
- Registed Connection size: 20
- created Connection size: 410
- disconnect Connection size: 390
* Mysql proxy Server
- Registed Connection size: 1145
- created Connection size: 18710
- disconnect Connection size: 17566
2009-12-14 23:52:35,061 INFO report - State of server report:
- Uptime: 12h 54m 17s 796ms
- Report period: 12h 54m 17s 796ms
- Memory: 230694k used, 540608k total, 1009792k max
* Server pool=server1
- pool active Size=0, pool Idle size=10
* Server pool=server2
- pool active Size=0, pool Idle size=13
* Server pool=multiPool
- pool active Size=0, pool Idle size=23
* defaultManager
- Registed Connection size: 20
- created Connection size: 410
- disconnect Connection size: 390
* Mysql proxy Server
- Registed Connection size: 1145
- created Connection size: 18710
- disconnect Connection size: 17566
我看pool active size都为0;但java进程仍存在。
有两个疑问:
一、为什么会出现这种不响应的情况?
二、能否有什么方法在出现不响应的时候迅速定位出来?
之前发的贴子怎么无故没有了呢?
amoeba不响应问题日志:
2009-12-18 02:21:14,322 ERROR util.LoopingThread - error:
java.nio.BufferOverflowException
at java.nio.HeapByteBuffer.put(HeapByteBuffer.java:165)
at com.meidusa.amoeba.net.packet.AbstractPacketBuffer.toByteBuffer(AbstractPacketBuffer.java:40)
at com.meidusa.amoeba.mysql.handler.CommandMessageHandler.appendBufferToWrite(CommandMessageHandler.java:596)
at com.meidusa.amoeba.mysql.handler.CommandMessageHandler.dispatchMessageTo(CommandMessageHandler.java:585)
at com.meidusa.amoeba.mysql.handler.CommandMessageHandler.endSession(CommandMessageHandler.java:811)
at com.meidusa.amoeba.net.Connection.close(Connection.java:171)
at com.meidusa.amoeba.net.ConnectionManager.iterate(ConnectionManager.java:119)
at com.meidusa.amoeba.util.LoopingThread.run(LoopingThread.java:61)
由于amoeba重启后,清除之前的日志,所以之前没看到该错误日志。
陈先生你好:
版本:amoeba-mysql-1.0.2-BETA
当我使用多线程测试时,后台出现异常如下:
ERROR handler.MySqlCommandDispatcher - messageDispate error
java.nio.channels.CancelledKeyException
at sun.nio.ch.SelectionKeyImpl.ensureValid(SelectionKeyImpl.java:55)
at sun.nio.ch.SelectionKeyImpl.interestOps(SelectionKeyImpl.java:59)
at com.meidusa.amoeba.net.ConnectionManager.invokeConnectionWriteMessage(ConnectionManager.java:407)
at com.meidusa.amoeba.mysql.net.MysqlConnection.postMessage(MysqlConnection.java:53)
at com.meidusa.amoeba.mysql.handler.MySqlCommandDispatcher.handleMessage(MySqlCommandDispatcher.java:72)
at com.meidusa.amoeba.mysql.net.MysqlClientConnection$2$1.run(MysqlClientConnection.java:162)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
at java.lang.Thread.run(Thread.java:595)
我一直在测试amoeba, 0.25版还是没有解决utf8乱码的问题,还有是大量数据库query时amoeba就会问题,有时候是速度慢,有时候是segment fault. 我想问什么时候会出稳定版?
遇到一些问题,请及时反馈给我。
目前能够反馈过来的人少了点,能反馈给我的我都很尽快处理这些问题。
希望反馈的内容:mysql 版本、amoeba 版本、操作系统、数据库编码、客户端编码、amoeba 异常的时候logs文件。
希望反馈过来的时候将 amoeba logs文件夹一起打包给我。
amoeba query大量数据的时候速度慢,可以调整一些网络参数,比如TCP NODELAY等,还有buffer可以相应开大一点。
segment fault 我不知道具体的错误原因。如果你能提供更详细的异常信息将对我修复bug是非常有帮助的。
感谢 raymond 的反馈
水平切分对insert语句为何不起作用呢?
我的规则是:
STUDENT_ID
server1
server1
server1
STUDENT_ID
10 ]]>
server2
server2
server2
请指导一下~
hi,你能把你的具体规则跟sql语句 用email形式发给我吗?
能不能给发了详细使用的列子,你那份帮助文档说的太笼统了,谢谢 邮箱 xnang@163.com
使用amoeba for mysql 其实非常简单的,
1. 首先要把amoeba 当作 mysql 来看待.
2. 要在amoeba配置文件(amoeba.xml)中配置目标的 mysql
3. 启动amoeba( bin目录下面有windows 的bat脚本 跟 linux的shell 脚本).
4. 应用程序或者客户端连接 amoeba 跟 连接 mysql的方式一样
有没有产品架构图和代码功能模块介绍文档。谢谢!
产品架构图跟 aladdin有点类似。
抱歉的是功能模块介绍目前没有
谢谢了,从代码看起吧。
你好,谢谢你提供这么好的解决方案,Amoeba for Mysql对临时表的处理方案考虑了吗?
麻烦你提供参考方案
目前没考虑这方面,能否告诉我一下你们如后使用临时表?
hello, 请问一下,如果我自己操作数据库的代码有事务处理部分。在使用amoeba作分布式数据路由易后,由于amoeba不支持事务,那么上层的事务处理代码会有何影响?是不是不起作用了呢?
lijs 你好,amoeba目前暂时屏蔽事务。
未来将会支持事务,根据需求也可能将启动分布式事务。
希望有一个配置说明文档,即使很简单,但是对初学者还是不知道怎么去配置的,如果有的话,会让很对人容易上手
事务是必须的,没有事务支持,根本无法使用.何时能加入事务支持呀?
还有,建议提供一个能与现有流行框架进行集成的版本,比如能和spring进行集成,并由spring来管理事务.如果能做到这样,那肯定能得到迅速的推广.
另外提个建议.看了你的设计思想,如果能把其中的sql解析,动态获得目标数据源,合并查询结果,还有规则这部分单独做一个包装,基于hibernate,ibates这类框架之上,做成一个开源框架的增强包,可能会更受欢迎.毕竟你做的这个东西在企业应用开发里基本很少有人会使用,,一部分功能其实应该由一些比较成熟的ORM或者SQL映射框架来代替.
比如,我当前使用了spring和hibernate多数据源.本来这些分布式事务和映射规则都需要在代码端维护.而你的这个产品正好能代替这部分需要代码维护的功能(规则,合并查询结果,根据SQL动态获得目标数据源),如果你能包装成一组jar文件,我引入后,直接配在spring中就能生效,那太完美了.
目前将要做的项目涉及海量数据的问题,能想到的解决方案就是数据库切分,通过将数据按规则切分到不同的表和不同的库,以减少单库或单表的数据量,这样做之后,数据更新时需要首先定位到要更新的表,然后做更新操作,这没问题。问题是:
查询时需要从多个表中查询(可能是一个库或多个库),很担心性能的问题:同一个库的表可以union,不同的库就需要查出来再合并。 在遇到排序 分页的时候,就需要在应用程序(我用JAVA)里进行排序和分页,肯定要占用很多的系统资源,速度也很让人担心。
今天看到了Amoeba for Mysql,特别兴奋,他能帮我做很多事情,使得JAVA程序不用考虑数据库切分的问题。我决定用他了。但我仍然担心“排序 分页”的性能问题。
请陈大侠给些建议或思路,我的担心是否多余?我应该怎么做会好一些?
事务的支持将会在近期内推出。
目前在努力做一个友好的安装版本,以降低使用amoeba的门槛,希望能够更好的进行推广。
to yanhui :
使用amoeba必须要理解amoeba跟他的局限性。比如amoeba不允许跨数据库进行join、排序操作。因此最好的解决方法是将你的业务理清楚,然后将大的sql分成几个小业务的sql。这样有利于数据库架构可扩展性,虽然损失一点效率我觉得是值得的。
跨库的union/union all操作和limit应该获得支持。排序反倒是不那么必要。
再请教一个问题,我本来用proxool连接池,而amoeba自己也带有数据库连接池的功能。理论上让proxool连接amoeba是没有问题的,对吧?但还有必要这样做吗?是不是不需要再用proxool了?
@wym
个人不太赞同这样的观点,Amoeba不应该和 ORM 框架或者现有的其他一些框架(如Spring)集成,因为完全属于不同层面的东西,而且,Amoeba 对外本身就是以一个数据源服务来提供的,和应用分离的越干净越好,而不是结合起来。
to yanhui :
连接池还是要做的。因为TCP在创建连接的时候是比较消耗资源的,包括amoeba这端接受一个新的connection也是消耗资源的,因此虽然amoeba后端有数据库连接池。但是你的应用也需要保持原来的连接池。
to 陶方:
跨网络 支持union 操作代价是非常昂贵的。即使amoeba做到了这点,那么性能往往也是不可接受的。
如果你的数据真的需要这样做,我个人觉得应该要重新规划一下数据库的数据分割。避免类似操作出现。
使用amoeba for mysql 其实非常简单的,
1. 首先要把amoeba 当作 mysql 来看待.
2. 要在amoeba配置文件(amoeba.xml)中配置目标的 mysql
3. 启动amoeba( bin目录下面有windows 的bat脚本 跟 linux的shell 脚本).
4. 应用程序或者客户端连接 amoeba 跟 连接 mysql的方式一样
请问:
“4.应用程序或者客户端连接amoeba跟连接mysql的方式一样”是什么意思?
不用amoeba时,我是通过ODBC连接mysql的,需要在配置odbc的DSN,HOST,databasename,user,pwd,port。
客户端在vc中连接数据库时:db.Open(NULL,FALSE,FALSE,_T(”ODBC;DSN=MySQL_090213;UID=root;PWD=123456″),1);
用amoeba作为中间件的话:ODBC的DSN,HOST等怎么配置,客户端的代码不用改变吗?
pdf文档看过了,也没有看明白怎么和客户端连接,请指教。谢谢!
鲁江 你好,
其实你把amoeba for mysql 当作 mysql看待,那么就很容易理解了,
它其实就是一个虚拟 的mysql,
DSN=MySQL_090213;UID=root;PWD=123456
你把这些修改成amoeba实际的配置安装的ip,amoeba对外暴露的用户名、密码。
陈先生 您好,
Amoeba for mysql 当成一个虚拟的 mysql 我是这么理解的:ODBC连接Amoeba和连接Mysql是一样的,DSN保持不变,Host可以不变(127.0.0.1),DatabaseName不变,UID和PWD换成amoeba对外暴露的用户名、密码,Port换成8066。
db.open(NULL,FALSE,FALSE,_T(”ODBC;DSN=MySQL_090213;UID=amoeba_u;PWD=amoeba_p″),1);但是这样有问题,也可能是我的其他地方有问题,我想向您确认一下。
“DSN=MySQL_090213;UID=root;PWD=123456
你把这些修改成amoeba实际的配置安装的ip,amoeba对外暴露的用户名、密码。”
我的理解是:db.open(NULL, FALSE,FALSE,_T(’DSN=127.0.0.1;UID=amoeba_u;PWD=amoeba_p”),1)但是这样报:找不到数据源。
陈先生 您好,
以ODBC的方式连接Amoeba for MySQL,一直没有成功,还等待您的回答。
这次我换了以java JDBC的方式连接,直接连MySQL已经可以使用。但是JDBC 连接Amoeba for MySQL仍然提示有错误:“java.sql.SQLException: Access denied for user ‘amoebau’@'MyName’ (using password: YES)”
我的java连接语句如下:“Connection con=DriverManager.getConnection(”jdbc:mysql://127.0.0.1″,”amoebau”,”amoebap”);”
程序员最大的痛苦是:知道程序错了,却不知道错在哪里。
望指教!谢谢!
补充一点:
用JDBC连接Amoeba for MySQL前,
运行Amoeba.bat的结果如下:
D:\Amoeba\amoeba-mysql-0.32\bin>amoeba.bat
log4j:WARN log4j config load completed from file:D:\Amoeba\amoeba-mysql-0.32\bin
\..\conf\log4j.xml
log4j:WARN ip access config load completed from file:D:\Amoeba\amoeba-mysql-0.32
\bin\../conf/access_list.conf
2009-02-19 16:49:36,843 INFO net.ServerableConnectionManager - Server listening
on /192.168.2.111:8066.
请问使用Amoeba for MySQL是否能支持同库分表的功能?因为目前系统采用MySQL Proxy HSCALE来实现的同库分表功能,以解决单表数据量过大的问题!
JDBC方式连接 试验成功。ODBC还不知道怎么设置
确实是ODBC驱动版本问题,ODBC测试连接成功。
陈老师,您好:
我在启动Amoeba for MySQL时出现了一个问题,请指教,谢谢!
我刚刚的那条不知道发没发出去,所以再发一条。麻烦了。
[root@localhost bin]# ./amoeba
log4j:WARN log4j config load completed from file:/root/amoeba/conf/log4j.xml
Exception in thread “main” com.meidusa.amoeba.config.ConfigurationException: Error loading configuration file /root/amoeba/conf/amoeba.xml
with nested exception
com.meidusa.amoeba.config.ConfigurationException: Caught exception while loading file /root/amoeba/conf/amoeba.xml
with nested exception
org.xml.sax.SAXParseException: Element type “dbserver” must be declared.
at com.meidusa.amoeba.context.ProxyRuntimeContext.loadConfig(ProxyRuntimeContext.java:301)
at com.meidusa.amoeba.context.ProxyRuntimeContext.init(ProxyRuntimeContext.java:171)
at com.meidusa.amoeba.mysql.server.MysqlProxyServer.main(MysqlProxyServer.java:124)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.codehaus.classworlds.Launcher.launchStandard(Launcher.java:410)
at org.codehaus.classworlds.Launcher.launch(Launcher.java:344)
at org.codehaus.classworlds.Launcher.main(Launcher.java:461)
with nested exception com.meidusa.amoeba.config.ConfigurationException: Caught exception while loading file /root/amoeba/conf/amoeba.xml
with nested exception
org.xml.sax.SAXParseException: Element type “dbserver” must be declared.
com.meidusa.amoeba.config.ConfigurationException: Caught exception while loading file /root/amoeba/conf/amoeba.xml
with nested exception
org.xml.sax.SAXParseException: Element type “dbserver” must be declared.
at com.meidusa.amoeba.context.ProxyRuntimeContext.loadConfigurationFile(ProxyRuntimeContext.java:320)
at com.meidusa.amoeba.context.ProxyRuntimeContext.loadConfig(ProxyRuntimeContext.java:298)
at com.meidusa.amoeba.context.ProxyRuntimeContext.init(ProxyRuntimeContext.java:171)
at com.meidusa.amoeba.mysql.server.MysqlProxyServer.main(MysqlProxyServer.java:124)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.codehaus.classworlds.Launcher.launchStandard(Launcher.java:410)
at org.codehaus.classworlds.Launcher.launch(Launcher.java:344)
at org.codehaus.classworlds.Launcher.main(Launcher.java:461)
with nested exception org.xml.sax.SAXParseException: Element type “dbserver” must be declared.
org.xml.sax.SAXParseException: Element type “dbserver” must be declared.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:236)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:172)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:382)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:316)
at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.handleStartElement(XMLDTDValidator.java:1960)
at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.startElement(XMLDTDValidator.java:795)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:878)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(XMLDocumentFragmentScannerImpl.java:1693)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:368)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:834)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:148)
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:250)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:292)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:98)
at com.meidusa.amoeba.context.ProxyRuntimeContext.loadConfigurationFile(ProxyRuntimeContext.java:316)
at com.meidusa.amoeba.context.ProxyRuntimeContext.loadConfig(ProxyRuntimeContext.java:298)
at com.meidusa.amoeba.context.ProxyRuntimeContext.init(ProxyRuntimeContext.java:171)
at com.meidusa.amoeba.mysql.server.MysqlProxyServer.main(MysqlProxyServer.java:124)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.codehaus.classworlds.Launcher.launchStandard(Launcher.java:410)
at org.codehaus.classworlds.Launcher.launch(Launcher.java:344)
at org.codehaus.classworlds.Launcher.main(Launcher.java:461)
to 王冰洁:
amoeba.xml中的dbserver改为dbServer试试
to 鲁江:
非常感谢您,我就是把amoeba.xml中的一些配置项名称需要大写的部分字母小写了。现在已经解决。
我测试amoeba的水平切分,定义的rule:id10(server2)
简单的java测试代码:
String sql = “insert into a(a,id) values(1,8),(1,80),(1,3),(1,300)”;
stmt.executeUpdate(sql);
res = stmt.executeQuery(”select id from a”);
运行java程序结果,server2没有数据插入。
按照rule,id=80和300的数据应该插入到server2中才对吧。
还有如果我一开始在就在sever1的a表中插入id数据1,10,100;server2的a表中插入id数据2,3,80;那么执行sql查询:select id from a;amoeba就不完全按照rule执行了吧,因为结果是server1和server2的id数据总和。结果是想要得到的。
请指教!谢谢
界面显示有问题,补充说明使用的rule:id10(server2)
跨库的union操作需要排序,是比较消耗性能的。
但是union all操作仅仅是合并结果集,应该没有什么关系吧????
mysql5.0 amoeba 0.31
用mysql客户端连接到amoeba上,开几个线程同时执行大查询,amoeba僵死。不会返回结果,也不会拒绝连接池的连接。在屏幕上出现如下信息:
Exception in thread “pool-1-thread-6″ java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2760)
at java.util.Arrays.copyOf(Arrays.java:2734)
at java.util.ArrayList.ensureCapacity(ArrayList.java:167)
at java.util.ArrayList.add(ArrayList.java:351)
at com.meidusa.amoeba.mysql.handler.CommandMessageHandler$CommandQueue.checkResponseCompleted(CommandMessageHandler.java:190)
at com.meidusa.amoeba.mysql.handler.CommandMessageHandler.handleMessage(CommandMessageHandler.java:417)
at com.meidusa.amoeba.mysql.handler.QueryCommandMessageHandler.handleMessage(QueryCommandMessageHandler.java:90)
at com.meidusa.amoeba.net.Connection.messageProcess(Connection.java:267)
at com.meidusa.amoeba.mysql.net.MysqlServerConnection.messageProcess(MysqlServerConnection.java:353)
at com.meidusa.amoeba.net.Connection.handleEvent(Connection.java:244)
at com.meidusa.amoeba.net.ConnectionManager$1.run(ConnectionManager.java:217)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:619)
这个怎么处理????
mysql insert into tablename values (1,3,3),(2,3,3),(3,3,3)
现在对这种语法不支持哦
的确不支持。这种语法只能用于垂直切分或者读写分离使用。
如果想水平切分这种语法就不合适了了
to:陶方
首先amoeba 的启动脚本有内存设置参数,建议设置大内存,amoeba默认内存设置较少。
还有如果通过amoeba进行10w(大量的返回结果)以上的返回结果,是不合适的。
您好!我想问一下,通过amoeba连数据库对客户端是透明的,但是我想知道每一个链接连到哪一个dbserver,这个可以提供吗?谢谢
您好,陈老师
现在正在研究amoeba ,有A,B,C三个库表,里面库结构相同,但是数据不同,通过amoeba 分割,如果一个突然断电数据库连接中断,其余两个库也无法查询,是amoeba 不支持这种方式吗?
陈先生和各位朋友:
大家好!目前,我希望在我的hibernate应用中把Amoeba 当做一个数据源服务来使用,但一直抛出不能查询的异常,但我用jdbc来访问Amoeba时则是正常,能进行查询动作。
请问有没有朋友在这方面(在hibernate中把Amoeba当做一个数据源来处理)有成功的经验,或者听说有成功的案例。
另外,如果是实现上的问题,大家能不能说一说大概要从hibernate和Amoeba的哪些源代码入手比较好,希望有这方面代码研究经验的朋友指点一二。
谢谢大家先。
我的邮箱是chayecai@163.com,欢迎来探讨。
to kroc:
amoeba 提供了dbug信息,每次请求都会显示出到底使用了哪个dbserver。
客户端跟amoeba连接是可以长连接的,但是 不能后端的数据库连接,而是在执行sql的时候才会根据规则获得一个连接。执行完毕以后释放连接。
miss wang 你好!
amoeba 可以自动恢复已经断开的数据库连接,但前提是数据库是处于可用状态。
数据库A、B、C三个,如果停机2个 比如是B、C,此时如果sql是到这 b 或者 C执行那么执行肯定失败,如果是到A数据库中执行那么是可以成功的。如果是到A & B 那么执行也将会失败。
Bruce 你好
能否将你的错误信息(在amoeba文件夹下的logs目录)发送给我。
包括用hibernate连接 amoeba的异常信息也发给我,
我的email: structchen at gmail.com
您好,陈老师
现在感觉amoeba还是挺好的用的,研究价值太高了
向您学习。现在我有这样一个需求,就是amoeba自己实现集群(双机热备):一种情况是一台机器上的amoeba坏了,另外一台amoeba就工作。另一种情况是一台机器上,如果amoeba坏了,就自动启动另一个
您好,陈老师:
对于一个并发量最大在100的业务系统上,readThreadPoolSize,clientSideThreadPoolSize,serverSideThreadPoolSize
设置多少比较合适?
您好,陈老师
1.amoeba中规则设置为 rule 为 字段名 like ‘%a%’
为什么sql语句中select * from 表名 where 字段名 like ‘%a%’ 和 select * from 表名 where 字段名 like ‘a’ 执行结果相同。这里是什么设计思路?
2.amoeba中规则设置为 rule 为 字段名 like ‘a’
为什么sql语句中select * from 表名 where 字段名 like ‘%a%’ 则不符合规则?
陈老师你好:
我想请教一下,用amoeba作负载均衡时,能否按比例分配读数据的负载量?
比如:从master读数据与从slave上读数据的比例分为2:8。
如果可以,我该如何去做?
谢谢
王岩 你好,目前还没有负载系数可以设置
你好,陈老师:
想请教一下,amoeba for mysql是否支持双机热备,就是两台amoeba server,一台出问题,
另外一下可以马上替代。
我想做双机热备,那么通过检测哪些参数可以判断amoeba是在正常工作?
-------------------------------------------------
以下是回复内容:
可以通过检测 端口是否正常,或者发送 mysql协议ping包
陈老师,您好:首先感谢您提供这么好的产品。
我昨天开始学Amoeba,提供的文档我也都看过了。
刚建了数据库,写了相应的Java代码,可以直接从数据库里取数据出来了。
现在想在Java代码与MySQL之间加入Ameoba。
暂时的理解是在Ameoba中配置目标Server,然后让我的Java代码连Amoeba。
(不知道我对Amoeba的理解对不?)
可是这两步我都不会,您可以帮帮我吗?
我的邮箱:Programmer2.x@gmail.com
————————————————————-
以下是回复内容:
你可以将amoeba当作mysql看待,他是一个独立的进程。默认启动端口8066 (mysql是3306)
amoeba的设置 需要修改 conf/amoeba.xml
您好,我看了amoeba的文档,自己也跑了一下测试。但是有个应用场景不知道该怎么配置,麻烦指点一下:
目前在一个库A中有一个4千万数据的Topic表,想对它进行水平切分,分成Topic_1, Topic_2, Topic_3,…… 这样。仍然放在库A中,这个时候amoeba应该如何配置?
我看一些测试例子中都是将Topic放到不同的库A,B,C中,有没有办法在同一个库里面,但是表名不同呢?
------------------------------------------------------------
目前不支持这种切分方式
<p><p><p>您好:我的dbServer1中有表employee,id从1到100。dbServer2中有表employee,id从</p><br /><br />
<p>101到200。select × from employee where id = 1.这样一个语句会去两张表里查询吗?还</p><br /><br />
<p>是自动判断直接到第一张表中查询。这里怎么体现性能?</p><br /><br />
———————————————–<br /><br />
以下是 回复:<br /><br />
如果你有相应的规则,则会根据规则进行,比如<br /><br />
<tableRule name=”TestTable” schema=”test” defaultPools=”dbServer1,dbServer2″>
<rule name=”rule1″><br /><br />
<parameters>ID</parameters><br /><br />
<expression><![CDATA[ ID >= 1 and ID<=100]]></expression><br /><br />
<defaultPools>dbServer1</defaultPools><br /><br />
</rule></p><br />
<p> <rule name=”rule2″><br /><br />
<parameters>ID</parameters><br /><br />
<expression><![CDATA[ ID between 101 and 200]]></expression><br /><br />
<defaultPools>dbServer2</defaultPools><br /><br />
</rule></p></p>
</tableRule>
amoeba则会根据规则进行判断具体到那个server上面执行sql,如果规则匹配规则1 则到dbserver1,匹配规则2 则会到dbserver2
如果2个都不匹配,则会到tableRule中的defaultPools执行,也就是 dbserver1、dbserver2同时执行
陈老师好:
我们测试的时候,所有数据都到master上去了,slave上没有数据,请问是为什么?
———————————————————————————–
以下是回复内容:
您需要写一些读写分离的策略。还有master/slave需要通过mysql的复制进行的,而不是amoeba,目前amoeba这一层暂时没有复制功能
陈先生:您好,
应用程序连接Amoeba除了JDBC,ODBC还支持哪些连接方式?
是不是和应用程序连接mysql支持的完全一样?
如果我选择Connector/C 连接mysql,
不知道还能不能使用Amoeba(还没测试)。
----------------------------------------------
以下是回复内容:
只要驱动支持协议在4.1.1以上就没有问题了。
具体使用跟连接mysql没有区别,用户名与密码是通过amoeba内部配置的(配置文件:conf/amoeba.xml)
陈老师好:
我在master上插了3条数据,结果查询的时候出来了双份的6条数据。
不知道为什么,谢谢。
<p>你好,这两天在研究你的amoeba,测试了一下,我的测试环境是:一台master,read/writer,两台slave:slave1/slave2,只read,现在有几个问题请教一下:<br />
1.我在三台机器上都创建了相同的数据库表,测试时所有的数据库都写到master上去了,而slave机器里的表里没有任何真实数据,那我想请问题一下,slave机器上是不是要创建相同的数据库表?<br />
2.你的这种方式,我是不是能这样理解:所有的数据其实只写到master上面,而slaves机器,只是提供高并发的读,提高应用程序的读的速度。<br />
3.你的切分,并不是将真实的数据切到到每个slave库里保存起吧?那切分是什么意图?</p>
—————————————————————————-
以下是回复内容:
amoeba里面谈到的master/slave其实是mysql里面的概念,master/slave他们之间的数据同步采用的是 mysql的复制协议
切分方式可以分成2种,一种是基于表的垂直切分,一种基于规则的水平切分,可以将相同表名的数据根据规则进行分离,将他们写入到不同数据库的相同表内。
读写分离是上面2种切分方式都支持的,读写分离是可以提高应用程序访问mysql的速度。
不知道有没有回答你的问题了。
反馈
以下组合 自己测试成功:
vc应用程序客户端,
Connector/C (mysql-connector-c -1.0.4.0-win32.msi安装文件),
Amoeba,
MySQL。
陈老师:我昨天在3个slave上跑,插了10W条数据,比单机的快10倍多。
今天在11个slave上跑,速度比昨天3个的慢了好多,郁闷。。。
————————————————————————
以下是回复内容:
得看你的负载均衡设置,还有说明3个mysql性能已经足以应付你的请求,mysql再多也不能提升应用的性能。
如果你的请求没有给mysql带来一定压力,那么性能将有所下降的。
对于这么一个水平切分的应用场景:一个数据库实例上跑了2个库:db1 -> topic, db2->topic, 其中db1->topic使用idtopic使用id>1000000。我的配置是:
在amoeba.xml中建立2个dbserver,
defaultManager
3306
10.1.146.133
db1
……
……
defaultManager
3306
10.1.146.133
db2
……
……
在rule.xml中的配置是:
id
db1
id
db2
对于这种情况,我使用php前端连amoeba,用“select * from topic where id in (10000000, 10000001)”,只能查到db1的结果,而db2的结果查不到。
麻烦看一下该如何配置,多谢了
C:\amoeba\bin>amoeba.bat
系统找不到指定的路径。
C:\amoeba\bin>
总出现这种问题,是什么原因。
-----------------------------
以下是回复内容:
是否没有设置环境变量,比如JAVA_HOME
您好,能不能提供一个支持start和stop参数的shell脚本,来启动amoeba for mysql?
谢谢……
# /usr/local/sysbench/bin/sysbench –db-driver=mysql –mysql-table-engine=myisam –debug=off –test=oltp –mysql-host=10.10.11.152 –mysql-port=8066 –mysql-user=root –mysql-password=123456 –oltp-table-size=100000 –mysql-db=test –oltp-table-name=amoeba –num-threads=10 –max-requests=10000 –oltp-auto-inc=off –oltp-test-mode=complex run
sysbench 0.4.12: multi-threaded system evaluation benchmark
FATAL: mysql_stmt_prepare() failed
FATAL: MySQL error: 1044 “null”
FATAL: thread#0: failed to prepare statements for test
通过sysbench测试的时候出现以上错误。
----------------------------
以下是回复内容:
恩,这个问题正在着手解决
<p>C:\mysql\bin>mysqlslap.exe -h 10.10.11.152 -P 8066 -uroot -p123456 –create-schema=slaptest –concurrency=5 –iterations<br />
=1 –number-int-cols=4 –number-char-cols=35 –auto-generate-sql –auto-generate-sql-add-autoincrement –auto-generate-s<br />
ql-load-type=mixed –engine=myisam –number-of-queries=10 –debug-info<br />
mysqlslap.exe: Cannot run query CREATE TABLE `t1` (id serial,intcol1 INT(32) ,intcol2 INT(32) ,intcol3 INT(32) ,intcol4<br />
INT(32) ,charcol1 VARCHAR(128),charcol2 VARCHAR(128),charcol3 VARCHAR(128),charcol4 VARCHAR(128),charcol5 VARCHAR(128),c<br />
harcol6 VARCHAR(128),charcol7 VARCHAR(128),charcol8 VARCHAR(128),charcol9 VARCHAR(128),charcol10 VARCHAR(128),charcol11<br />
VARCHAR(128),charcol12 VARCHAR(128),charcol13 VARCHAR(128),charcol14 VARCHAR(128),charcol15 VARCHAR(128),charcol16 VARCH<br />
AR(128),charcol17 VARCHAR(128),charcol18 VARCHAR(128),charcol19 VARCHAR(128),charcol20 VARCHAR(128),charcol21 VARCHAR(12<br />
8),charcol22 VARCHAR(128),charcol23 VARCHAR(128),charcol24 VARCHAR(128),charcol25 VARCHAR(128),charcol26 VARCHAR(128),ch<br />
arcol27 VARCHAR(128),charcol28 VARCHAR(128),charcol29 VARCHAR(128),charcol30 VARCHAR(128),charcol31 VARCHAR(128),charcol<br />
32 VARCHAR(128),charcol33 VARCHAR(128),charcol34 VARCHAR(128),charcol35 VARCHAR(128)) ERROR : No database selected<br />
刚刚用mysqlslap测试了出现了错误。</p>
——————————————————-
以下是回复内容:
hi,你好,目前amoeba 暂时不支持DDL语句,务必先跑一次 mysqlslap 中间不连接amoeba ,然后再通过amoeba进行测试。
你好,我的问题:
amoeba.xml里面的字体到底是什么中文字体啊,我在linux下用zh_CN.GB2312,zh_CN.GB18030,zh_CN.UTF-8字体都试过了,注释里的字体都是乱码。
<!– proxy serverIP –>
如能回答,将非常感谢。
------------------------------
以下是回复内容:
建议使用xml编辑器进行查看或者修改,在操作系统下面如果采用普通的编辑器,修改完保存以后默认会采用系统编码进行保存,可能导致乱码。
<p>你好,能帮我看看下面的错误吗,谢谢!<br />
#./amoeba<br />
log4j:WARN log4j config load completed from file:/root/amoeba/conf/log4j.xml<br />
2009-05-12 15:08:26,120 DEBUG net.MysqlServerConnection - receive HandshakePacket packet from server:192.168.1.170:3307<br />
2009-05-12 15:08:26,134 INFO net.MysqlServerConnection - mysql server Handshake= com.meidusa.amoeba.mysql.net.packet.Handshak<br />
ePacket@f8f7db[protocolVersion=10,serverVersion=5.0.45-log,threadId=10,seed=kjP1B97G,serverCapabilities=41516,serverCharsetInd<br />
ex=8,serverStatus=2,restOfScrambleBuff=@J2YLQ2FHt3?,packetLength=56,packetId=0]<br />
2009-05-12 15:08:26,136 DEBUG net.MysqlServerConnection - authing packet sent to server:192.168.1.170:3307<br />
2009-05-12 15:08:26,143 DEBUG net.MysqlServerConnection - authing result packet from server:192.168.1.170:3307<br />
Exception in thread “main” java.lang.StackOverflowError<br />
at sun.misc.Unsafe.compareAndSwapLong(Native Method)<br />
at java.util.concurrent.atomic.AtomicLong.compareAndSet(AtomicLong.java:110)<br />
at java.util.concurrent.atomic.AtomicLong.getAndIncrement(AtomicLong.java:133)<br />
at com.meidusa.amoeba.net.poolable.MultipleLoadBalanceObjectPool.borrowObject(MultipleLoadBalanceObjectPool.java:195)<br />
at com.meidusa.amoeba.net.poolable.MultipleLoadBalanceObjectPool.borrowObject(MultipleLoadBalanceObjectPool.java:213)<br />
at com.meidusa.amoeba.net.poolable.MultipleLoadBalanceObjectPool.borrowObject(MultipleLoadBalanceObjectPool.java:213)</p>
<p>…….</p>
<p>后面是N条<br />
at com.meidusa.amoeba.net.poolable.MultipleLoadBalanceObjectPool.borrowObject(MultipleLoadBalanceObjectPool.java:213)</p>
--------------------------------------------
以下是回复内容:
能否将您的amoeba.xml 配置 发送到我的邮箱里面?
請問 兩台 Amoeba 之間,可否互相作對方的 Fail-over,不然如果唯一的 Amoeba 有問題的時候,Client 就連不到後面的資料庫了,煩請解惑,謝謝
------------------------------
以下是回复内容:
mysql 客户端提供了负载均衡跟failover机制。 驱动可以同时连接2个amoeba
陈老师:
您好,我测试的是amoeba-mysql-0.32,现有两个问题请教:
1.原来AP真接连接DB,安装Amoeba后,配置AP连接Amoeba,访问网页出现乱码(把Amoeba改成UTF8,还是一样),重新安装应用程序后又恢复正常。
2.现在前台使用都感觉正常,但project日志中有很多错误,一天有好几万条:
2009-05-13 09:52:32,566 ERROR route.AbstractQueryRouter - UPDATE `emalls`.`ecs_sessions` SET expiry = ‘1242179562′, ip = ‘10.10.102.1′, userid = ‘0′, adminid = ‘0′, user_name=’0′, user_rank=’0′, discount=’1′, email=’0′, data = ‘a:3:{s:7:\”from_ad\”;i:0;s:7:\”referer\”;s:6:\”??????\”;s:10:\”login_fail\”;i:0;}’ WHERE sesskey = ‘1818dc9f2b2b4b88e60f3430e6f42f0c’ LIMIT 1
2009-05-13 09:52:35,463 ERROR route.AbstractQueryRouter - SELECT SUM(goods_number) AS number, SUM(goods_price * goods_number) AS amount FROM `emalls`.`ecs_cart` WHERE session_id = ‘6339fe8c29c1587754b9c309ad08846d’ AND rec_type = ‘0′
麻烦您看一下~
———————————————————-
以下是回复内容:
这些sql语句的解析有问题,将在最近一次发布解决这个问题
接上面补充一条:
使用sysbech或mysqlslap测试工具通过amoeba作测试,可以perpare,但无法run:
[root@clive bin]# ./sysbench –db-driver=mysql –mysql-table-engine=innodb –debug=off –test=oltp –mysql-host=10.10.11.152 –mysql-port=8066 –mysql-user=root –mysql-password=123456 –oltp-table-size=100000 –mysql-db=test –oltp-table-name=x051213 –num-threads=1 –max-requests=10 –oltp-auto-inc=off –oltp-test-mode=complex run
sysbench 0.4.12: multi-threaded system evaluation benchmark
输出结果:
FATAL: mysql_stmt_prepare() failed
FATAL: MySQL error: 1044 “null”
FATAL: thread#0: failed to prepare statements for test
—————————————
以下是回复内容:
这个错误目前我还没仔细研究,等我安装一个sysbench以后再进行测试
您好`试用了一下for mysql 挺过瘾的`但不知道没有事务如何使用
—————————————
以下是回复内容:
目前暂时还不支持事务,未来会增加的
目前发现的问题有:
1 部分sql语句不支持的
2 有重复执行的迹象,发生数据重复插入到master,还不确定
3 读写分离会在master出现读进程
sql的问题比较严重,在log里面有很多:
TRUNCATE TABLE XXX
EXPLAIN XXX
SELECT * FROM xx FORCE INDEX (xx)
insert into xx values(’\'test\”) 转义的单引号
—————————————
以下是回复内容:
sql解析目前还没有完全满足需求,可能有些sql还不能解析,在bug还没有修复之前请大家尽量修改自己的sql,最新的sql解析bug修复将在这个月发布
<p>使用8066端口连上amoeba后,执行查询语句返回有问题:<br />
mysql> select * from users where user like “%rain%”;<br />
ERROR 1044 (42000): null</p>
<p>mysql> SELECT * from users WHERE user=”rain”;<br />
—- —— ———————————- ——- ———– ——- ———— ——– ——————— ———— ———————<br />
| id | user | password | email | full_name | about | properties | status | resource_picture_id | site_admin | last_login |<br />
—- —— ———————————- ——- ———– ——- ———— ——– ——————— ———— ———————<br />
| 2 | rain | 21218cca77804d2ba1922c33e0151105 | | rain | | a:0:{} | 1 | 0 | 0 | 2007-10-12 22:22:09 |<br />
—- —— ———————————- ——- ———– ——- ———— ——– ——————— ———— ———————<br />
1 row in set (0.00 sec)</p>
<p>请问是什么原因?</p>
—————————————
以下是回复内容:
还是sql解析问题跟Like的规则解析问题,是bug
另:
amoeba for mysql 3.2环境:
select distinct(a.id),a.InfoTitle,b.corpName,a.ProPrice,a.ShowTime,a.ExpTime,
d.user as user_name,b.province,b.city,a.ProIntro
from blogs c, users d,provide_info a ,corp_info b ,keyword e
where a.blog_id=b.blog_id and a.blog_id!=’85653′
and now() - INTERVAL a.InfoExp DAY <a> now()
and a.blog_id=c.id
and c.owner_id=d.id and a.id=e.host_id and e.ktype=4
and e.kname=’气动行业’
order by a.ShowTime desc,a.id desc
怀疑amoeba解析query的程序可能存在bug,上面那个query,amoeba没有解析正确,烦请回复,谢谢!
—————————————
以下是回复内容:
sql解析目前还没有完全满足需求,可能有些sql还不能解析,在bug还没有修复之前请大家尽量修改自己的sql,最新的sql解析bug修复将在这个月发布
公司正准备上这个项目,在测试中,sql解析还是有点问题,期待您的sql解析bug修复
——————————————————–
以下是回复内容:
非常感谢支持,sql解析异常将在这个月升级版本解决大部分的sql问题。
amoeba运行的时候必须有 命令提示符(cmd)界面吗?有没有可以设置的地方,设置成没有界面、开机即运行的服务?
另外,在命令提示行里 每隔一段时间(10分钟)就出现一些DEBUG信息(向数据库服务器发送、接收数据的信息),这些信息可不可以取消?
2004-07-29 01:06:31,030 DEBUG net.MysqlServerConnection - authing result packet from server:192.168.2.203:3306
2004-07-29 01:06:31,055 DEBUG net.MysqlServerConnection - receive HandshakePacket packet from server:192.168.2.203:3306
2004-07-29 01:06:31,056 DEBUG net.MysqlServerConnection - authing packet sent to server:192.168.2.203:3306
2004-07-29 01:06:31,057 DEBUG net.MysqlServerConnection - authing result packet from server:192.168.2.203:3306
2004-07-29 01:16:26,622 DEBUG net.MysqlServerConnection - receive HandshakePacket packet from server:192.168.2.211:3306
2004-07-29 01:16:26,622 DEBUG net.MysqlServerConnection - authing packet sent to server:192.168.2.211:3306
2004-07-29 01:16:26,624 DEBUG net.MysqlServerConnection - authing result packet from server:192.168.2.211:3306
2004-07-29 01:16:26,930 DEBUG net.MysqlServerConnection - receive HandshakePacket packet from server:192.168.2.212:3306
2004-07-29 01:16:26,930 DEBUG net.MysqlServerConnection - authing packet sent to server:192.168.2.212:3306
2004-07-29 01:16:26,932 DEBUG net.MysqlServerConnection - authing result packet from server:192.168.2.212:3306
2004-07-29 01:16:27,364 DEBUG net.MysqlServerConnection - receive HandshakePacket packet from server:192.168.2.215:3306
2004-07-29 01:16:27,366 DEBUG net.MysqlServerConnection - authing packet sent to server:192.168.2.215:3306
2004-07-29 01:16:27,367 DEBUG net.MysqlServerConnection - authing result packet from server:192.168.2.215:3306
2004-07-29 01:16:27,675 DEBUG net.MysqlServerConnection - receive HandshakePacket packet from server:192.168.2.205:3306
2004-07-29 01:16:27,676 DEBUG net.MysqlServerConnection - authing packet sent to server:192.168.2.205:3306
2004-07-29 01:16:27,678 DEBUG net.MysqlServerConnection - authing result packet from server:192.168.2.205:3306
2004-07-29 01:16:30,922 DEBUG net.MysqlServerConnection - receive HandshakePacket packet from server:192.168.2.203:3306
2004-07-29 01:16:30,922 DEBUG net.MysqlServerConnection - authing packet sent to server:192.168.2.203:3306
2004-07-29 01:16:30,925 DEBUG net.MysqlServerConnection - authing result packet from server:192.168.2.203:3306
2004-07-29 01:26:26,624 DEBUG net.MysqlServerConnection - receive HandshakePacket packet from server:192.168.2.211:3306
2004-07-29 01:26:26,625 DEBUG net.MysqlServerConnection - authing packet sent to server:192.168.2.211:3306
2004-07-29 01:26:26,626 DEBUG net.MysqlServerConnection - authing result packet from server:192.168.2.211:3306
2004-07-29 01:26:26,637 DEBUG net.MysqlServerConnection - receive HandshakePacket packet from server:192.168.2.211:3306
<p>您好,首先感谢贵项目组的辛勤劳动。<br />
在使用amoeba的过程中,出现了这样的问题:<br />
我们这个项目主要使用amoeba作了数据库的集群。结构是一主两从,并且以amoeba作为proxy。<br />
应用向A表中插入一条数据,成功插入后,数据库自动生成A表中这条记录自增字段a的数据。此后,应用查询刚才插入A表中数据的字段a的值,并向B表中插入一条数据,数据的具体内容包括A.a的数据。</p>
<p>此时,问题产生了。当向A数据库插入那条数据之后,mysql的主从还未能及时同步。而amoeba将查询A.a数据的sql分配给了从数据库。导致查询的结果为null,当向B表插入记录时由于B表中的a字段为非空,就出现了异常。</p>
<p>请问如何正确解决这个问题。问题比较着急,请你百忙中给以解答。十分感谢。</p>
---------------------------------------------
以下是回复内容:
这个问题的确比较头疼的,因为同步不是实时的。
最近想到了一个解决方法,可以在sql中增加备注内容,可以指明了从read pool还是writepool或者defaultpool 或者是指定pool名字。
这样可以解决这种问题,但这只能是一种手段。
目前也有一个想法,将数据库的同步计划纳入到amoeba内部来实现,而不采用mysql的同步机制。
最近想到了一个解决方法,可以在sql中增加备注内容,可以指明了从read pool还是writepool或者defaultpool 或者是指定pool名字。
首先,谢谢您的解答。
请问,如何去增加这样的备注内容?谢谢
这个问题的确比较头疼的,因为同步不是实时的。
最近想到了一个解决方法,可以在sql中增加备注内容,可以指明了从read pool还是writepool或者defaultpool 或者是指定pool名字。
这样可以解决这种问题,但这只能是一种手段。
——–
我遇到的问题和Fishyu一样,所以最近也在考虑解决办法。最后想到比较好的解决方式也是在sql中加入备注来指定要操作的pool。
希望作者能把这个功能加入到amoeba中
—————————————————
以下是回复内容:
感谢你的支持,这个功能已经安排在开发计划中。将尽快解决这个问题
感谢你的回复,期待新版早日发布
您好,陈老师:
我想了解一下,amoeba分配sql的过程。之前数据库同步不及时的问题,我采用了JDBC连接到主数据库(即写数据库)的方法。但是还是经常出现之前的问题。不知道是不是有什么冲突?谢谢
非常好,谢谢陈老师的辛苦工作。我这里也有一个问题:我用的是InnoDB类型的表,本身是支持事物的,程序中也进行了相应的处理。但amoeba目前好像不支持事物,不过这对之前的事物有影响吗?或者我可不可以这样理解:客户端与amoeba的连接有一个事物(可能目前还没有),amoeba与数据库的连接有另一个事物(数据库自身的),这两个事物是不同的,互相不影响。
———————————————————————————————
以下是回复内容:
客户端与amoeba之间、amoeba与mysql之间 目前是autocommit模式,
也就是说目前客户端使用amoeba的时候,是不支持事务的,即使客户端申明事务也是不起作用的。这个要注意一下。
因此必须使用事务的应用建议目前不要考虑使用amoeba,等待包含事务的版本出来再考虑吧。
陈老师你好:
现在我使用amoeba遇到这样的问题:
环境描述: 数据库服务器A 上有user_db库; 数据库服务器B上有message_db库和user_db库的副本(即复制A上的user_db库);
amoeba上配置了rule.xml规则:user_db上的表路由到A服务器上;message_db的表路由到B服务器上;当我发起一条关联message_db和user_db的关联查询的时候,比如select * from message_db.msg m,user_db.user u where m.uid=u.uid; (由于B服务器上有user_db副本;如果amoeba能够通过规则将此sql分配到B服务器上,那么查询将正确执行;但是规则中同时也配置了user_db上表的规则,结果被路由到了A服务器上,造成找不到message相关表);
请问:当两个及以上表关联的时候,路由规则是如何确定server的;
上述例子中,如果我不配置user_db相关表的路由规则,只配置message_db的路由规则,则该关联查询可以正确执行; 但是如果不配置user_db路由,对于需要使用该库的主从分离又成了问题!
请赐教!谢谢
—————————————————
以下是回复内容:
明白你的意思了。 你是想如果包含message_db 则只按照message_db配置的路由去走,但是如果只有user_db则可以按照正常的user_db去路由。
可否可以这样,你的A服务器上面的USER_DB是用于写的,而B服务器的USER_DB是用于读的,如果遇对USER_DB的读操作则到B服务器上面,这样就解决这个问题了。
不知道是否还有其他情况存在路由不能满足需求的?
非常感谢您给于我的回答!
您给出的解决方案,可以满足部分需求;但是在我的实际应用中,比这个情况要复杂些;
实际情况下,我为了降低MASTER的压力,将应用的库进行了纵向切割;把不同业务分散在不同的服务器上,他们又是围绕着user信息的;所以每个业务库上都会去复制一份user_db的副本,以满足关联查询的需求!
目前的处理方法是 user_db不配置tableRule规则;把user_db配置到queryRouter里;
这样暂时能够满足需求! 但是还有一定的局限性!
还有个问题: tableRule 必须配置完整表名的规则; 不能使用通配符之类的吗? 比如 user_% 以”user_” 开头的表路由到user_db库; 现在我的表太多,每张表都要配置一行tableRule; 还是比较繁琐的!!
谢谢!!
你好有个问题:
amoeba无法解析 find_in_set 函数;
即带有此函数的SQL语句 无法执行!
对不起
是无法解析这个 !find_in_set(10039,refuse) 中的 ! 运算符
(select comment_id ,source_id from mini_note_comments where source_id=53 order by comment_id desc limit 2)
union all
(select comment_id ,source_id from mini_note_comments where source_id=47 order by comment_id desc limit 2)
这个SQL解析错误
ERROR 1044 (42000): error,unknown statement……
———————————–
以下是回复内容:
这个bug目前已经处理掉了,等新版本出来就可以解决这个问题了,多谢derek的抓虫技术^_^
多谢高人能够及时处理问题!
对amoeba很感兴趣,也要把它用到生产环境中,我们网站的容量规划是蛮大的,希望amoeba能够有良好的表现; 以后可能还会遇到问题,还需高人解决!
不知道你的新版本大概什么时候发布! 将要发布的版本会包括rule.xml中支持表名通配符吗?
谢谢
陈老师您好,我想问一下,我在使用大字段blob时,中文查出来的全是乱码,而使用一般的Varchar字段时,不会有乱码问题,请问该如何解决,谢谢
—————————-以下是回复内容————————————
恩,我得确认一下是否有这个问题,还有能否将你们得日志发送一份到我得email
我第一次使用 但是一直连接不上,请问连接字符串怎么写,用了amoeba后数据库名称是什么?
———————————以下是回复内容—————————————-
用了amoeba以后,url还是与平时的格式一样,只不过登陆的 用户名与密码是amoeba.xml上面配置的。
数据库名称是目标mysql数据库里面必须存在的
支持同库分表吗? 如何配置规则? 对于大数据量业务,例如每天一个表,如何实现?
——————以下是回复内容—————————–
目前不支持。
你好,大概从3月份就开始关注amoeba了,个人觉得这是个非常好的东西。
最近在考虑系统的升级,对于数据库来说,从介绍来看,amoeba应该能满足需求。但是有个担心,从amoeba的资料来看,没有看到类型性能方面评估的文档,所以能不能介绍下这方面的东西。
------------------以下是回复内容--------------------
最好能够对amoeba进行性能方面测试,即使我这边出了报告,你们也需要对amoeba进行测试!
我这边没有对行业上面一些数据切分工具进行比较过。总体性能与稳定性来说还是能够满足的。
前一段时间进行过高并发的测试。
在使用amoeba代理时,有部分语句无法使用,请帮忙分析判断一下。。
SELECT * FROM bbs_doing USE INDEX(dateline) WHERE 1 ORDER BY dateline DESC LIMIT 0,20;
这个语句中如果使用了USE INDEX(dateline),通过代理就无法执行:
ERROR 1044 (42000): error,unknown statement:[SELECT * FROM bbs_doing USE INDEX(dateline) WHERE 1 ORDER BY dateline DESC LIMIT 0,20]
跪求宝贵的意见!
———————————–以下是回复内容—————————————–
下一个版本解决这个问题,多谢反馈^_^
陈老师你好,在什么情况下会打印这个语句
2009-08-14 12:12:31,890 INFO net.Connection - Error reading message from socket [channel=java.nio.channels.SocketChannel[connected local=/127.0.0.1:8066 remote=/127.0.0.1:1543], error=java.io.IOException: 远程主机强迫关闭了一个现有的连接。].
java.io.IOException: 远程主机强迫关闭了一个现有的连接。
at sun.nio.ch.SocketDispatcher.read0(Native Method)
at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:25)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:233)
at sun.nio.ch.IOUtil.read(IOUtil.java:206)
at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:236)
at com.meidusa.amoeba.net.io.PacketInputStream.readPacket(PacketInputStream.java:99)
at com.meidusa.amoeba.net.Connection.handleEvent(Connection.java:237)
at com.meidusa.amoeba.net.ConnectionManager$1.run(ConnectionManager.java:216)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
<p>陈sir,我要怎么配置才能从两个数据库的相同表同时返回结果呢,始终搞不定,请求帮助!</p>
——————————————以下是回复内容———————————————–
以下供你参考:
首先配置2个dbserver,分别指向 2个数据库,如果 server1 存放 id= 10000以下, server2存放id=10000以上.
然后再rule.xml里面
<code>
<tableRule name=”TestTable” schema=”test” defaultPools=”server1,server2″>
<rule name=”rule1″>
<parameters>ID</parameters>
<expression><![CDATA[ ID <= 10000]]></expression>
<defaultPools>server1</defaultPools>
<readPools>server1</readPools>
<writePools>server1</writePools>
</rule>
<rule name=”rule2″>
<parameters>ID</parameters>
<expression><![CDATA[ ID > 10000 ]]></expression>
<defaultPools>server2</defaultPools>
</rule>
</tableRule>
</code>
那么以后TestTable 根据id 查询或者修改,如果不根据id进行相关的操作,则将会到 defaultPools=”server1,server2″ 2个数据库同时进行操作,然后合并结果集合
在使用amoeba代理时,有部分语句无法使用
如:
SELECT FOUND_ROWS();
还有 sql语句中有force index() 的;
期待版主下个版本的更新
——————-以下是回复内容——————-
以上问题在1.0.2版本解决
这个SQL解析错误
ERROR 1044 (42000): error,unknown statement……
———————————–
以下是回复内容:
这个bug目前已经处理掉了,等新版本出来就可以解决这个问题了,多谢derek的抓虫技术^_^
—
今天也遇到了。
请问新的版本release时间确定没?
又有新版本release了,很高兴!陈老师辛苦!
不过我又遇到新的问题了:
select a.*,b.* from db1.a,db2.b where a.id=b.id and b.name=’derek’;
amoeba的rule.xml是对a表有配置tableRule, b表没有tableRule;
这条SQL经过dmlStatment.evaluate(parameters)分析,currentEvaluatedTableMap里只剩下了b表这个table (应该是由b.name=’derek’这个条件产生的);忽略了a表;
则在接下来的QueryRouter过程中,由于没有对应的tableRule,就给这条SQL分配了全局的this.readPools; 但是这条SQL只有被分配到a表的tableRule里配置的POOL才能正常执行;
于是我修改了com.meidusa.amoeba.parser.statment.DMLStatment.evaluate(Object[] parameters)方法:
…….
if(this.evaluatedTableMap == null){
……
} else {
currentEvaluatedTableMap = this.evaluatedTableMap;
for(Table table : this.getTables()){
if(!currentEvaluatedTableMap.containsKey(table)){
currentEvaluatedTableMap.put(table, null);
}
}
}
在else里加了一段for循环把a表也加入到了currentEvaluatedTableMap里;这样经试验达到了我要的效果;
但是不知道我这样改是否会有其他什么副作用! 希望作者陈老师指正!
垂直切分的时候,不知道如果sql中的table前面带有schema是否可以处理。例如:
select * from test.test_xxx where xxx
—————–以下是回复内容—————————-
这种是可以处理的,
wordPress 在写comment对xml以及html代码支持不好,你可以将你的配置发送到我的email里面去
陈老师,我有一个应用想上amoeba,但启动应用后报
WARN handler.MySqlCommandDispatcher - unsupport packet:[Length= 18, PacketId= 0, Command= 0, Query=]
——————————–以下是回复内容—————————————-
amoeba只支持mysql 版本为4.1.1以上的产品,如果的确是这个以上的版本,能否将你的logs文件夹压缩以后 发送到我的email里面,让我分析一下错误原因
这两天又研究了一下,发现一个问题,下面的sql好像不能正确解析:
SELECT (1) FROM table WHERE XXX
xxx LIMIT x OFFSET x 也不能解析
您好我用amoeba for mysql对我们的数据库做的垂直分割
这个是我的rule.xml配置
但是我遇到一个问题,第一次执行sql语句的时候,总是提示Unknown database ‘amoeba’,然后重新执行一次就好了,其后连续执行也不会出问题,但是放一段时间再执行又会出现那个错误提示(这个时间不固定,可能几分钟,也可能几十分钟),然后再执行一次又好了。
xml被过滤调了?没显示出来
<amoeba:rule xmlns:amoeba="http://amoeba.meidusa.com/">
<tableRule name="action" schema="amoeba" defaultPools="actiondb" />
<tableRule name="action_type" schema="amoeba" defaultPools="actiondb" />
<tableRule name="action_remark" schema="amoeba" defaultPools="actiondb" />
<tableRule name="action_like" schema="amoeba" defaultPools="actiondb" />
<tableRule name="action_hide" schema="amoeba" defaultPools="actiondb" />
<tableRule name="django_session" schema="amoeba" defaultPools="actiondb" />
<tableRule name="user_base" schema="amoeba" defaultPools="hooou_v2db" />
<tableRule name="friend_1" schema="amoeba" defaultPools="frienddb" />
<tableRule name="friend_group" schema="amoeba" defaultPools="frienddb" />
<tableRule name="friend_wait" schema="amoeba" defaultPools="frienddb" />
</amoeba:rule>
我也发现了xxx LIMIT x OFFSET x不能解析的问题
2009-09-27 16:34:57,165 WARN route.AbstractQueryRouter - error,unknown statement:[SELECT `user_base`.`user_id`, `user_base`.`email`, `user_base`.`fullname`, `user_base`.`gender`, `user_base`.`status_content`, `user_base`.`status_update_time`, `user_base`.`tower_id`, `user_base`.`city_domain` FROM `user_base` ORDER BY `user_base`.`user_id` DESC LIMIT 100 OFFSET 100]
恩,这几天将会修复 LIMIT x OFFSET y sql 解析问题
多谢大家提供的bug~
Unknown database ‘amoeba’ 长时间以后出现schema无法找到的问题,我得仔细测试一下
陈先生,您好
最近使用Amoeba做数据的水平分割时,发现配置完规则之后,Amoeba会产生重复读写的问题,并且没有写入到相应的数据库中。如下:
ID
master1
slave1
master1
ID
10 ]]>
master2
slave2
master2
当插入一条数据时(不管ID是否dayu10),它会在master1中插入两条相同数据,然后读取的时候也会读两遍。(我发现这个tablerule标签中defaultPools中所指定的元素数量有关,如果defaultPools包含三个元素,那么就会重复读写三遍,如果defaultPools中为空,才会读写一遍,但是写入的数据库仍然不是规则中所指定的那样)
————-以下是回复内容————————————————————–
首先确定一下sql不能是这种: insert into table(1,2,’asdfasdf’)
得修改成 insert into table( id,age,name) values(1,2,’asdfadsf’);
如果规则无法匹配则会到tableRule的defaultPools执行,如果配置了多个,则会到多个数据库中全部执行完以后合并数据。
在amoeba.xml中的
userlib
这个schema参数主要是指什么,一直没理解不了,呵呵。
而且在测试垂直切分时,在rule.xml中也指定
。感觉上有点冲突。
指教下!!!
------------以下是回复内容------------
我没明白你说的userlib。。。没发现这个东东
不好意思!从conf贴过来的设置,有些没正常显示出来。
就是在amoeba.xml和rule.xml中都有个schema的设定。这个值一定要设置吧。我现在就是在测试垂直切分时,没测试成功。我现在amoeda的版本是amoeba-mysql-1.0.2-BETA.zip。
我测试内容就是按功能来分库操作:用户表的信息就从1号主机的user库上操作,客户表的信息就从2号主机的customer库上操作。按文档说明,我在amoeba.xml上配置了两个dbServer且各自的schema各自为user、customer,默认池为1号主机的dbServer,然后在rule.xml中各自配置tableRule,schema也是为各自的库。
这样启动amoeba后,不能正常查询各自表的信息,1号主机的查询正常,2号主机的查询就出错误,提示说在user中没找到表。如果没配置dbServer的schema也不能正常启动amoeba的。
还不是很了解贵框架。指教下!!
——————-以下是回复内容—————————–
恩,没有schema的话,就无法确定其sql到底是在那个schema下执行,除非 采用 schema.table 这种形式
其实通过amoeda垂直切分的话,逻辑上是切分了。但物理上是没切分,就是说不可能把各库分摊到不同主机来进行垂直切分或者说切分到不同的实例上吧
user—>实例1:3306—>主机1
blog—>实例2:3306—>主机2
bbs—>实例1:3307—>主机3
是这样理解吗?
写错了,不好意思!!!
user—>实例1:3306—>主机1
blog—>实例2:3306—>主机2
bbs—>实例3:3307—>主机3
你好:
1.amoeba for mysql中配的对外暴露的用户名和密码,需要在后面的mysql数据库中建这个用户名并授权限吗?
光在amoeba.xml中的server中配,应用端能连接得上?
2.在Linux里怎么样查看amoeba在运行和停止?
3.另外linux下只装jdk1.6.0_02.rpm即可以吗?需不需要装jdk支持的mysql驱动?
我现在linux下查jdk版本,可以查出,但怎么知道JDK安装配置正确呢?
————————-以下是回复内容——————————
1、amoeba内需要配置一个使用amoeba的帐户与密码(简称amoeba帐号),并且连接每个mysql都需要相应mysql的用户名与密码。 外部应用访问amoeba使用”amoeba帐号” 就可以使用了
2、启动脚本在bin目录下/amoeba , 停止脚本没有做,可以通过linux进程查看器看一下是否有相关java进程。
3、不需要安装mysql驱动。查看java是否正确安装 首先确定java -version 看是否是安装的相应版本,其次需要设置环境变量JAVA_HOME指向 jdk安装的目录
陈先生,您好!
根据amoeba的文档我做了对一个表的水平切分,并且INSERT后可以成功切分到两个库里
,但是现在有两个问题,麻烦帮忙解答下,谢谢!问题如下:
1.在SELECT count(*) from mytable 的时候不能合并成一个结果集,而是得到两个分库的两个总和结果集;现象如下:(从amoeba登录后统计)
mysql> SELECT COUNT(*) FROM MYTABLE;
———-
| COUNT(*) |
———-
| 457128 |
| 445605 |
———-
2 rows in set (0.00 sec)
2.不做切分的表该怎样配置?
Detial:
OS:Redhat as5.4
DB:Mysql 5.1.40
Amoeba:amoeba-mysql-1.0.2-BETA
amoeba detial:
defaultManager
3306
db01.mytest.com
mytest
mytest
123456
200
200
10
600000
600000
true
true
defaultManager
3306
db03.mytest.com
mytest
mytest
123456
200
200
10
600000
600000
true
true
2
master1,master2
${amoeba.home}/conf/rule.xml
${amoeba.home}/conf/functionMap.xml
${amoeba.home}/conf/ruleFunctionMap.xml
1500
master1
multiPool
multiPool
true
ID
master1
master1
master1
RELEASE_ORIGIN_PROVINCE_ID
master2
master2
master2
————-以下是回复内容———————–
1 对于count(*) 函数,目前没有做内部计算,不过可以通过客户端来处理这个问题,可以当作多条记录进行遍历叠加,这个对中间没有amoeba这一层的处理结果是一致的
2 这个问题我暂时看不出来,希望你通过email发一份给我你具体的配置
陈先生,您好
SELECT * FROM tbl_gbookaction_1 WHERE userid=123 && is_read=0
这样的 && 写法不AMOEBA无法解析
另外请问什么时候能出支持事务的版本啊,正准备用在生产上~~
—————————以下是回复内容————————————–
&& 类似的 最好采用 and来代替
事务最近这段时间还没计划在内。
多谢您的支持~ 谢谢!
您好:
我按照开发文档里的说明已经配置完毕,并成功启动amoeba.bat。
但是我在java里用jdbc连接获得connection 对象,并不能通过amoeba对外帐户获得通用的Connection,只能获得某个库的Connection 对象,能提供个java client端调用的实例吗?
我的具体配置如下:
<!– proxy server绑定的端口 –>
8066
<!– proxy server绑定的IP –>
127.0.0.1
<!– proxy server net IO Read thread size –>
20
<!– proxy server client process thread size –>
30
<!– mysql server data packet process thread size –>
30
<!– socket Send and receive BufferSize(unit:K) –>
128
<!– Enable/disable TCP_NODELAY (disable/enable Nagle’s algorithm). –>
true
<!– 对外验证的用户名 –>
root
<!– 对外验证的密码 –>
sa
<!– PoolableObjectFactory实现类 –>
defaultManager
<!– 真实mysql数据库端口 –>
3306
<!– 真实mysql数据库IP –>
127.0.0.1
test
<!– 用于登陆mysql的用户名 –>
root
<!– 用于登陆mysql的密码 –>
1234
<!– ObjectPool实现类 –>
200
200
10
600000
600000
true
true
<!– PoolableObjectFactory实现类 –>
defaultManager
<!– 真实mysql数据库端口 –>
3306
<!– 真实mysql数据库IP –>
127.0.0.1
test
<!– 用于登陆mysql的用户名 –>
root
<!– 用于登陆mysql的密码 –>
1234
<!– ObjectPool实现类 –>
200
200
10
600000
600000
true
true
<!– 负载均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED –>
1
<!– 参与该pool负载均衡的poolName列表以逗号分割 –>
user,blog
${amoeba.home}/conf/rule.xml
${amoeba.home}/conf/functionMap.xml
${amoeba.home}/conf/ruleFunctionMap.xml
1500
user
true
java client调用过程:
conn = DriverManager.getConnection(”jdbc:mysql://127.0.0.1:8066/blog”, “root”, “sa”);
或者
conn = DriverManager.getConnection(”jdbc:mysql://127.0.0.1:8066/user”, “root”, “sa”);
调用正确,但这样并不是由amoeba自动判断的,是我手工指定的。
如果改成:
conn = DriverManager.getConnection(”jdbc:mysql://127.0.0.1:8066″, “root”, “sa”);
出错!
希望提供java client端调用的代码实例
—————————–以下是回复内容————————————-
你指定了schema其实关系不大的。如果想用其他的schema需要采用 类似sql select * from schema.tablename where id=1
其实一个应用他本身关注的是自身schema下的一些表。如果有特殊要求则可以采用上面的sql
您好,我想咨询一下,我的数据库是跨服务器部署的。
例如用户表存储在server1下,文章表存储在server2上,如果我想实现关联查询,关联条件是用户表的用户id和文章表的作者id,这种关联查询通过amoeba可以实现吗?
有2个问题:
第一个:
1.02 支持事务么?
第2个:
mysql里面 存储过程,作业 里面的 sql语句,是否可以正常运行?
————————以下是回复内容————————————-
目前还不支持事务,储存过程可以执行(在默认的数据库中执行),但是无法解析这些语句,会出现sql解析错误信息
陈先生:
感谢您提供了amoeba这样一个好的产品,在生产系统中又遇到了问题,amoeba运行一段时间不响应:
原来是因为linux中没有设置打开文件数,限制1024导致;这个情况已解决。
最近又频繁出现不响应的情况,通过mysql客户端连amoeba端口,也无法登录,project.log中打出:
2009-12-14 23:51:35,059 INFO report - State of server report:
- Uptime: 12h 53m 17s 793ms
- Report period: 12h 53m 17s 793ms
- Memory: 230601k used, 540608k total, 1009792k max
* Server pool=server1
- pool active Size=0, pool Idle size=10
* Server pool=server2
- pool active Size=0, pool Idle size=13
* Server pool=multiPool
- pool active Size=0, pool Idle size=23
* defaultManager
- Registed Connection size: 20
- created Connection size: 410
- disconnect Connection size: 390
* Mysql proxy Server
- Registed Connection size: 1145
- created Connection size: 18710
- disconnect Connection size: 17566
2009-12-14 23:52:35,061 INFO report - State of server report:
- Uptime: 12h 54m 17s 796ms
- Report period: 12h 54m 17s 796ms
- Memory: 230694k used, 540608k total, 1009792k max
* Server pool=server1
- pool active Size=0, pool Idle size=10
* Server pool=server2
- pool active Size=0, pool Idle size=13
* Server pool=multiPool
- pool active Size=0, pool Idle size=23
* defaultManager
- Registed Connection size: 20
- created Connection size: 410
- disconnect Connection size: 390
* Mysql proxy Server
- Registed Connection size: 1145
- created Connection size: 18710
- disconnect Connection size: 17566
我看pool active size都为0;但java进程仍存在。
有两个疑问:
一、为什么会出现这种不响应的情况?
二、能否有什么方法在出现不响应的时候迅速定位出来?
--------------以下是回复内容---------------------------------
出现这个情况如果在windows下面,在amoeba的运行输出的控制台窗口使用CTRL+BREAK。
Linux下面使用命令:kill -3 amoeba的进程号
上面的动作是dump出目前正在jvm中的线程运行情况。
收集到的日志email给我。多谢啦
之前发的贴子怎么无故没有了呢?
amoeba不响应问题日志:
2009-12-18 02:21:14,322 ERROR util.LoopingThread - error:
java.nio.BufferOverflowException
at java.nio.HeapByteBuffer.put(HeapByteBuffer.java:165)
at com.meidusa.amoeba.net.packet.AbstractPacketBuffer.toByteBuffer(AbstractPacketBuffer.java:40)
at com.meidusa.amoeba.mysql.handler.CommandMessageHandler.appendBufferToWrite(CommandMessageHandler.java:596)
at com.meidusa.amoeba.mysql.handler.CommandMessageHandler.dispatchMessageTo(CommandMessageHandler.java:585)
at com.meidusa.amoeba.mysql.handler.CommandMessageHandler.endSession(CommandMessageHandler.java:811)
at com.meidusa.amoeba.net.Connection.close(Connection.java:171)
at com.meidusa.amoeba.net.ConnectionManager.iterate(ConnectionManager.java:119)
at com.meidusa.amoeba.util.LoopingThread.run(LoopingThread.java:61)
由于amoeba重启后,清除之前的日志,所以之前没看到该错误日志。
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6526175
上面链接有提到amoeba使用的类有bug,但sun不认为是bug,建议设置heap size。
但我的参数为:-Xms512m -Xmx1024m -Xss1024k
jdk版本: 1.6.0_10-rc-b27
请陈先生帮忙分析一下,谢谢!
Dear chen:
1. SELECT STRAIGHT_JOIN ….. 解析异常;
2. STRAIGHT_JOIN 出现在表联合时也解析异常 tableA STRAIGHT_JOIN tableB;
我修改了 MysqlParser.jjt 中表联合的,加了个STRAIGHT_JOIN,
还加了个TOKEN
void JoinedTable() :
{}
{
((([”NATURAL”] ((”LEFT”|”RIGHT”) [”OUTER”])) | ([”INNER” | “CROSS”])) “JOIN”|”STRAIGHT_JOIN”)
(LOOKAHEAD(2) TableSpec() (JoinedTable())* | “(” TableSpec() (JoinedTable())* “)”) JoinCondition()
}
这样使得第二种解析异常可以解决,但是第一种解析异常不知道该怎么改!
另外我这样改是否正确,请Chen Sir 指教!!!! 期待您的回复!!!谢谢
陈老师您好 ,很感谢您提供给我们这么好的工具,我的网站现在正在用amoeba做读写分离,但是我发现amoeba的一个很不理解的问题:
当程序提交一个请求更新数据库的时候,数据库不会有任何变化,直到第二次提交另一个请求的时候,数据才会更新,举个例子,a的值本来是0,我现在要把a的值改成1,于是我提交请求让a=1,但是数据库并没有更新,然后我再提交一个请求让a=2,奇怪的地方就在这,此时a的值居然更新了,但是a的值变成了1,并不是2,然后我再提交请求让a=3,此时a又神奇般的变成了2
也就是要等下一个请求提交,amoeba才会让数据库运行前一个请求
我这个有问题的网站使用的是innodb引擎,
我另外一个网站使用MyISAM引擎却没有这个问题。
不知道有什么解决办法没有,还是什么地方没有配置正确,希望陈老师指教,非常感谢:)
-------------以下是回复内容----------------
这个情况我真还没遇到过。。。
如果有场景的话,我希望能够看一下
陈先生好:
我们最近在开发一个软件项目,用到MySQL,数据库的结构和要求如下:
配置:
整个系统走Internet;
2台Linux数据库服务器安装MySQL,固定IP地址;
100个Linux客户端也安装本地MySQL,动态IP地址;
要求:
客户端的数据库操作能够实时地更新到服务器;
服务器的数据库操作也能够实时地更新到客户端。
问题:
采用您的Amoeba for Mysql,是否能够达到要求,实现数据库的操作与管理?
-------------以下是回复内容----------------
还不是特别明确你的意图,但是amoeba 目前的设计是用于 读写分离。数据切分的。对于数据同步这块还是由mysql master/slave结构来解决的
陈先生你好:
版本:amoeba-mysql-1.0.2-BETA
当我使用多线程测试时,后台出现异常如下:
ERROR handler.MySqlCommandDispatcher - messageDispate error
java.nio.channels.CancelledKeyException
at sun.nio.ch.SelectionKeyImpl.ensureValid(SelectionKeyImpl.java:55)
at sun.nio.ch.SelectionKeyImpl.interestOps(SelectionKeyImpl.java:59)
at com.meidusa.amoeba.net.ConnectionManager.invokeConnectionWriteMessage(ConnectionManager.java:407)
at com.meidusa.amoeba.mysql.net.MysqlConnection.postMessage(MysqlConnection.java:53)
at com.meidusa.amoeba.mysql.handler.MySqlCommandDispatcher.handleMessage(MySqlCommandDispatcher.java:72)
at com.meidusa.amoeba.mysql.net.MysqlClientConnection$2$1.run(MysqlClientConnection.java:162)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
at java.lang.Thread.run(Thread.java:595)
查看源码,定位到
ConnectionManager.invokeConnectionWriteMessage(Connection):
……
SelectionKey key = connection.getSelectionKey();
if (!key.isValid()) {
connection.handleFailure(new java.nio.channels.CancelledKeyException());
return;
}
而connection.handleFailure()是请求关闭此connection ,请问return之后是怎么处理的?客户端得到一个请求关闭的connection之后是怎么处理的?有amoeba的设计文档吗?
谢谢指点!好运
-------------以下是回复内容----------------
这个问题还在高并发下,会存在的。
发生原因: 客户端发送一个请求,在mysql返回数据到amoeba的时候,客户端关闭连接,此时amoeba正在处理从mysql来的数据包发送到客户端,在写数据给客户端的时候发现客户端已经失效,则可能会引起这个问题。
不知道该问题是否对客户端造成影响?
Hi,陈老师,有如下配置,执行
select * from db1.users1;
select * from db2.users2;
但做insert的时候,有问题:
insert into db1.users1 value(2,34); //正常
insert into db2.users2 value(3,4); //Table ‘db2.users2′ doesn’t exist
这是什么原因呢?我需要怎么配置?谢谢
说明:db1在一台机器上,配的dbserver 是test1,db2在另一台机器上,配的是test2.
采用这样连接amoeba mysql:
mysql -hhost -pport -uroot -p11
amoeba.xml
………
test1
true
rule.xml:
test1, test2在不同的机器上
-------------以下是回复内容----------------
可用将你的amoeba.xml rule.xml email一份给我嘛? 我进行分析一下
Dear chen:
我在 project.log 中看到下面 route 解析错误:
ERROR route.AbstractQueryRouter - SELECT `joy_fetionsupei`.`fetion`, `joy_fetionsupei`.`mobile`, `joy_fetionsupei`.`mms_Rec_BjFriend_Send_Number` AS `num` FROM `joy_fetionsupei` WHERE (mms_Rec_BjFriend_Send_Number > 0) ORDER BY `mms_Rec_BjFriend_Send_Number` DESC, `mms_Rec_BjFriend_Number` DESC LIMIT 2000
com.meidusa.amoeba.parser.ParseException: com.meidusa.amoeba.mysql.parser.sql.ParseException: Encountered “`num`” at line 1, column 116.
ERROR route.AbstractQueryRouter - SELECT COUNT(1) AS `zend_paginator_row_count` FROM `award` WHERE (`status` = 0 ) AND ((`pickoff_time` > ‘2010-01-22 11:03:36′ ) OR (`pickoff_time` = ‘0000-00-00 00:00:00′ )) LIMIT 18
com.meidusa.amoeba.parser.ParseException: com.meidusa.amoeba.mysql.parser.sql.ParseException: Encountered “`zend_paginator_row_count`” at line 1, column 20.
发现当某字段启用 AS 别名,并且别名前有 ` 符号时就会出现 route 解析错误。
同时,我也遇到 kevin 提到 “amoeba运行一段时间不响应” 的问题。
运行环境:
OS:CentOS release 5.4 (Final)
linux 设置打开文件数为:10240
JDK:jre-1.6.0-openjdk
参数:-server -Xms128m -Xmx128m -Xss128k
请陈先生帮忙分析一下,谢谢!
-------------以下是回复内容----------------
你好 这类sql解析目前的确存在问题
稳定性目前在1.1.0有比较大的改善,希望大家能够反馈这次修改的结果,多谢