免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 飞鸿无痕
打印 上一主题 下一主题

【原创】Amoeba搞定mysql主从读写分离 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-10-24 15:35 |只看该作者
稳定性和并发都比mysql-proxy强。

论坛徽章:
0
12 [报告]
发表于 2010-10-26 13:39 |只看该作者
回复 10# liang3391


    我用我们公司的网站源代码测试了下,运行正常,未见乱码,你可以把不支持的sql发到开发者的博客上,或者发到amoeba.meidusa@gmail.com

论坛徽章:
0
13 [报告]
发表于 2010-10-27 14:14 |只看该作者
已经发了mail 但是杳无音讯

论坛徽章:
0
14 [报告]
发表于 2010-10-27 15:16 |只看该作者
<?xml version="1.0" encoding="gbk"?>



<!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd">

<amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/">



    <server>

        <!-- proxy server绑定的端口 -->

        <property name="port">3306</property>

      

        <!-- proxy server绑定的IP -->

        <property name="ipAddress">192.168.18.119</property>

        <!-- proxy server net IO Read thread size -->

        <property name="readThreadPoolSize">20</property>

      

        <!-- proxy server client process thread size -->

        <property name="clientSideThreadPoolSize">30</property>

      

        <!-- mysql server data packet process thread size -->

        <property name="serverSideThreadPoolSize">30</property>

      

        <!-- socket Send and receive BufferSize(unit:K)  -->

        <property name="netBufferSize">128</property>

      

        <!-- Enable/disable TCP_NODELAY (disable/enable Nagle's algorithm). -->

        <property name="tcpNoDelay">true</property>

      

        <!-- 对外验证的用户名 -->

        <property name="user">root</property>

      

        <!-- 对外验证的密码 -->

        <property name="password">justdoit</property>

      

        <!-- query timeout( default: 60 second , TimeUnit:second) -->

        <property name="queryTimeout">60</property>

    </server>

   

    <!--

        每个ConnectionManager都将作为一个线程启动。

        manager负责Connection IO读写/死亡检测

    -->

    <connectionManagerList>

        <connectionManager name="defaultManager" class="com.meidusa.amoeba.net.MultiConnectionManagerWrapper">

            <property name="subManagerClassName">com.meidusa.amoeba.net.AuthingableConnectionManager</property>

           

            <!--

              default value is avaliable Processors

            <property name="processors">5</property>

             -->

        </connectionManager>

    </connectionManagerList>

   

    <dbServerList>

        <!--

            一台mysqlServer 需要配置一个pool,

            如果多台 平等的mysql需要进行loadBalance,

            平台已经提供一个具有负载均衡能力的objectPool:com.meidusa.amoeba.mysql.server.MultipleServerPool

            简单的配置是属性加上 virtual="true",该Pool 不允许配置factoryConfig

            或者自己写一个ObjectPool。

        -->

        <dbServer name="server1">

           

            <!-- PoolableObjectFactory实现类 -->

            <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">

                <property name="manager">defaultManager</property>

               

                <!-- 真实mysql数据库端口 -->

                <property name="port">3306</property>

               

                <!-- 真实mysql数据库IP -->

                <property name="ipAddress">192.168.18.117</property>

                <property name="schema">test</property>

               

                <!-- 用于登陆mysql的用户名 -->

                <property name="user">root</property>

               

                <!-- 用于登陆mysql的密码 -->

               

                <property name="password">justdoit</property>

               

            </factoryConfig>

           

            <!-- ObjectPool实现类 -->

            <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">

                <property name="maxActive">200</property>

                <property name="maxIdle">200</property>

                <property name="minIdle">10</property>

                <property name="minEvictableIdleTimeMillis">600000</property>

                <property name="timeBetweenEvictionRunsMillis">600000</property>

                <property name="testOnBorrow">true</property>

                <property name="testWhileIdle">true</property>

            </poolConfig>

        </dbServer>

      



        <dbServer name="server2">

           

            <!-- PoolableObjectFactory实现类 -->

            <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">

                <property name="manager">defaultManager</property>

               

                <!-- 真实mysql数据库端口 -->

                <property name="port">3306</property>

               

                <!-- 真实mysql数据库IP -->

                <property name="ipAddress">192.168.18.118</property>

                <property name="schema">test</property>

               

                <!-- 用于登陆mysql的用户名 -->

                <property name="user">root</property>

               

                <!-- 用于登陆mysql的密码 -->

               

                <property name="password">justdoit</property>

               

            </factoryConfig>

           

            <!-- ObjectPool实现类 -->

            <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">

                <property name="maxActive">200</property>

                <property name="maxIdle">200</property>

                <property name="minIdle">10</property>

                <property name="minEvictableIdleTimeMillis">600000</property>

                <property name="timeBetweenEvictionRunsMillis">600000</property>

                <property name="testOnBorrow">true</property>

                <property name="testWhileIdle">true</property>

            </poolConfig>

        </dbServer>



      

        <dbServer name="master" virtual="true">

            <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">

                <!-- 负载均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->

                <property name="loadbalance">1</property>

               

                <!-- 参与该pool负载均衡的poolName列表以逗号分割 -->

                <property name="poolNames">server1</property>

            </poolConfig>

        </dbServer>



        <dbServer name="slave" virtual="true">

            <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">

                <!-- 负载均衡参数 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->

                <property name="loadbalance">1</property>

               

                <!-- 参与该pool负载均衡的poolName列表以逗号分割 -->

                <property name="poolNames">server1,server2</property>

            </poolConfig>

        </dbServer>

      

    </dbServerList>

   

    <queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">

        <property name="ruleConfig">${amoeba.home}/conf/rule.xml</property>

        <property name="functionConfig">${amoeba.home}/conf/functionMap.xml</property>

        <property name="ruleFunctionConfig">${amoeba.home}/conf/ruleFunctionMap.xml</property>

        <property name="LRUMapSize">1500</property>

        <property name="defaultPool">master</property>

      

        <property name="writePool">master</property>

        <property name="readPool">slave</property>

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

    </queryRouter>

</amoeba:configuration>

我的修改vi amoeba.xml内容如上,但是修改后/usr/local/amoeba/bin/amoeba start
运行不了,报错。。。。

论坛徽章:
0
15 [报告]
发表于 2010-10-27 15:17 |只看该作者
回复 13# liang3391


    应该明天就能回复吧,开发者可能比较忙,呵呵,我和他交流的时候基本上是第二天就能收到回复!

论坛徽章:
0
16 [报告]
发表于 2010-10-27 15:21 |只看该作者
回复 14# sjehzy


    配置没什么错,但是你的启动命令错了!请用命令:/usr/local/amoeba/bin/amoeba &
启动,另外,刚安装你的/usr/local/amoeba/bin目录下的文件可能会没有执行权限,用命令添加执行权限:
chmod -R +x /usr/local/amoeba/bin
如果还有问题,请把你的报错贴上来看看!

论坛徽章:
0
17 [报告]
发表于 2010-10-27 15:28 |只看该作者
它提示我须要加start|stop的运行。

root@localhost conf]# chmod -R +x /usr/local/amoeba/bin
[root@localhost conf]# /usr/local/amoeba/bin/amoeba &
[1] 4562
[root@localhost conf]# amoeba start|stop



我的amoeba的conf目录下我只修改了amoeba.xml

论坛徽章:
0
18 [报告]
发表于 2010-10-27 15:36 |只看该作者
具体报错如下:
[root@localhost conf]# /usr/local/amoeba/bin/amoeba start
log4j:WARN log4j config load completed from file:/usr/local/amoeba/conf/log4j.xml
Exception in thread "main" com.meidusa.amoeba.config.ConfigurationException: Error loading configuration file /usr/local/amoeba/conf/amoeba.xml
    with nested exception
com.meidusa.amoeba.config.ConfigurationException: Caught exception while loading file /usr/local/amoeba/conf/amoeba.xml
    with nested exception
org.xml.sax.SAXParseException: Attribute "class" is required and must be specified for element type "server".
        at com.meidusa.amoeba.context.ProxyRuntimeContext.loadConfig(ProxyRuntimeContext.java:392)
        at com.meidusa.amoeba.context.ProxyRuntimeContext.init(ProxyRuntimeContext.java:232)
        at com.meidusa.amoeba.server.AmoebaProxyServer.main(AmoebaProxyServer.java:161)
        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:597)
        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 /usr/local/amoeba/conf/amoeba.xml
    with nested exception
org.xml.sax.SAXParseException: Attribute "class" is required and must be specified for element type "server".
com.meidusa.amoeba.config.ConfigurationException: Caught exception while loading file /usr/local/amoeba/conf/amoeba.xml
    with nested exception
org.xml.sax.SAXParseException: Attribute "class" is required and must be specified for element type "server".
        at com.meidusa.amoeba.context.ProxyRuntimeContext.loadConfigurationFile(ProxyRuntimeContext.java:411)
        at com.meidusa.amoeba.context.ProxyRuntimeContext.loadConfig(ProxyRuntimeContext.java:389)
        at com.meidusa.amoeba.context.ProxyRuntimeContext.init(ProxyRuntimeContext.java:232)
        at com.meidusa.amoeba.server.AmoebaProxyServer.main(AmoebaProxyServer.java:161)
        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:597)
        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: Attribute "class" is required and must be specified for element type "server".
org.xml.sax.SAXParseException: Attribute "class" is required and must be specified for element type "server".
        at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
        at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131)
        at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384)
        at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:31
        at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.addDTDDefaultAttrsAndValidate(XMLDTDValidator.java:1193)
        at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.handleStartElement(XMLDTDValidator.java:1940)
        at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.startElement(XMLDTDValidator.java:764)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1363)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2755)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:64
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:80
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
        at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
        at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:235)
        at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:284)
        at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:124)
        at com.meidusa.amoeba.context.ProxyRuntimeContext.loadConfigurationFile(ProxyRuntimeContext.java:407)
        at com.meidusa.amoeba.context.ProxyRuntimeContext.loadConfig(ProxyRuntimeContext.java:389)
        at com.meidusa.amoeba.context.ProxyRuntimeContext.init(ProxyRuntimeContext.java:232)
        at com.meidusa.amoeba.server.AmoebaProxyServer.main(AmoebaProxyServer.java:161)
        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:597)
        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)

论坛徽章:
0
19 [报告]
发表于 2010-10-27 15:36 |只看该作者
回复 17# sjehzy


    你用的什么版本???我看了下amoeba的启动脚本没有start或者stop的!
你用/usr/local/amoeba/bin/amoeba & 不能执行吗???

脚本内容如下:
  1. case "`uname`" in
  2.   CYGWIN*) cygwin=true ;;
  3. esac

  4. # 确定安装了java,并设置了JAVA_HOME环境变量.
  5. noJavaHome=false
  6. if [ -z "$JAVA_HOME" ] ; then
  7.     noJavaHome=true
  8. fi
  9. if $cygwin ; then
  10.     [ -n "$JAVA_HOME" ] &&
  11.         JAVA_HOME=`cygpath -u "$JAVA_HOME"`
  12. fi
  13. if [ ! -e "$JAVA_HOME/bin/java" ] ; then
  14.     noJavaHome=true
  15. fi
  16. if $noJavaHome ; then
  17.     echo "Error: JAVA_HOME environment variable is not set."
  18.     exit 1
  19. fi

  20. # 用该脚本的位置推断AMOEBA_HOME的路径.
  21. CURR_DIR=`pwd`
  22. cd `dirname "$0"`/..
  23. AMOEBA_HOME=`pwd`
  24. cd $CURR_DIR

  25. if [ -z "$AMOEBA_HOME" ] ; then
  26.     echo
  27.     echo 错误: 必须设置环境变量“AMOEBA_HOME”,指向AMOEBA的安装路径
  28.     echo
  29.     exit 1
  30. fi

  31. CLASSPATH="$AMOEBA_HOME/lib/classworlds-1.0.jar"
  32. MAIN_CLASS="org.codehaus.classworlds.Launcher"

  33. if $cygwin ; then
  34.     JAVA_HOME=`cygpath -w "$JAVA_HOME"`
  35.     AMOEBA_HOME=`cygpath -w "$AMOEBA_HOME"`
  36.     CLASSPATH=`cygpath -p -w "$CLASSPATH"`
  37. fi


  38. DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss128k"
  39. # DEFAULT_OPTS="$DEFAULT_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:+AggressiveOpts -XX:+UseParallelGC -XX:+UseBiasedLocking -XX:NewSize=64m"
  40. DEFAULT_OPTS="$DEFAULT_OPTS -Damoeba.home=\"$AMOEBA_HOME\""
  41. DEFAULT_OPTS="$DEFAULT_OPTS -Dclassworlds.conf=\"$AMOEBA_HOME/bin/amoeba.classworlds\""

  42. CMD="exec \"$JAVA_HOME/bin/java\" $DEFAULT_OPTS $OPTS -classpath \"$CLASSPATH\"  $MAIN_CLASS $@"
  43. eval $CMD
复制代码

论坛徽章:
0
20 [报告]
发表于 2010-10-27 15:48 |只看该作者
本帖最后由 sjehzy 于 2010-10-27 15:51 编辑

我用的就是你提供的下载地址,我直接wget 下来的,我的如下

[root@localhost bin]# more amoeba.bat
@rem ----------------------------------------------------------------------------
@rem 启动Amoeba的脚本
@rem
@rem 需要设置如下环境变量:
@rem
@rem    JAVA_HOME           - JDK的安装路径
@rem
@rem ----------------------------------------------------------------------------
@echo off
if "%OS%"=="Windows_NT" setlocal

:CHECK_JAVA_HOME
if not "%JAVA_HOME%"=="" goto SET_AMOEBA_HOME

echo.
echo 错误: 必须设置环境变量“JAVA_HOME”,指向JDK的安装路径
echo.
goto END

:SET_AMOEBA_HOME
set AMOEBA_HOME=%~dp0..
if not "%AMOEBA_HOME%"=="" goto START_AMOEBA

echo.
echo 错误: 必须设置环境变量“AMOEBA_HOME”,指向Amoeba的安装路径
echo.
goto END

:START_AMOEBA

set DEFAULT_OPTS=-server -Xms256m -Xmx256m -Xss128k
set DEFAULT_OPTS=%DEFAULT_OPTS% -XX:+HeapDumpOnOutOfMemoryError -XX:+AggressiveOpts -XX:+UseParallelGC -XX:+UseBias
edLocking -XX:NewSize=64m
set DEFAULT_OPTS=%DEFAULT_OPTS% "-Damoeba.home=%AMOEBA_HOME%"
set DEFAULT_OPTS=%DEFAULT_OPTS% "-Dclassworlds.conf=%AMOEBA_HOME%\bin\amoeba.classworlds"

set JAVA_EXE="%JAVA_HOME%\bin\java.exe"
set CLASSPATH="%AMOEBA_HOME%\lib\classworlds-1.0.jar"
set MAIN_CLASS="org.codehaus.classworlds.Launcher"

%JAVA_EXE% %DEFAULT_OPTS% -classpath %CLASSPATH% %MAIN_CLASS% %*

:END
if "%OS%"=="Windows_NT" endlocal
pause


我不加start|stop不行呀


我用amoeba.tar.gz默认的,/usr/local/amoeba/bin/amoeba start是可以正常启动的。。。
但是一用你的这个当模板就无法正常启动。。。
我找了好原因,始终运行不了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP